使用 php PDO 从另一个 table 插入行
INSERT row from another table using php PDO
我是 PDO 的新手并且 php。我想用 link 将一行从一个 table 移动到另一个我发送到下面的脚本。
LINK "id" 用作 invtable 中的主键,(请参阅下面脚本中的 FROM invtable)
提交广告-florida.php?id=01820007985
SCRIPT 提交广告-florida.php
<?php
$host = "localhost";
$user = "user";
$password = "pass";
$database_name = "db";
$pdo = new PDO("mysql:host=$host;dbname=$database_name", $user, $password, array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
));
$barCode = $GET['id'];
$query = "INSERT INTO adstable (Brand, Description, Price, Size, Price, Barcode)
SELECT Brand, Description, Price, Size, Price, Barcode FROM invtable
WHERE Barcode='".$barCode."'";
$pdo->query($query);
?>
问题
通过 GET[id]) 删除了额外的括号)。我收到以下错误。
致命错误:未捕获异常 'PDOException',消息为“SQLSTATE[42000]:语法错误或访问冲突:1110 列 'Price' 在 /home/myaccount/public_html/florida-ave/submit-ads-florida 中指定了两次”。php:16 堆栈跟踪:#0 /home/myaccount/public_html/florida-ave/submit-ads-florida.php(16): PDO->query('INSERT INTO flo...') #1 {main} throw in /home/myaccount/public_html/florida-ave/submit-ads-florida.php 第 16 行
更新
我更正了价格的多个条目。没有数据被添加到广告table,我没有收到任何错误。
请检查并更正此行:$barCode = $GET['id'];
如果这不是您的解决方案,请告诉我。
好的,所以您 had/have 的问题是:
$barCode = $GET['id']);
应该是 $barCode = $GET['id'];
,甚至可能是 $_GET['id'];
- 您的
SELECT
查询选择了同一字段两次 (SELECT Brand, Description, >Price<, Size, >Price<)
- 您还在同一字段中插入了两次:
INSERT INTO adstable (Brand, Description, >Price<, Size, >Price<
- 您仍然容易受到注入攻击
那么让我们来解决问题:
$barCode = isset($_GET['id']) ? $_GET['id'] : null;//avoids undefined index notice
接下来,要在SELECT
查询中两次使用同一个字段,你可以定义一个别名,但你只是不需要同一个字段两次...
SELET SELECT Brand, Description, Price as price_1, Size, Price as price_2, Barcode FROM
然后,为了防止一级注入攻击,让我们使用准备好的语句而不是使用 GET 参数调用 PDO::query
:
$stmt = $pdo->prepare('INSERT INTO adstable (Brand, Description, Price, Size, Barcode)
SELECT Brand, Description, Price, Size, Barcode FROM invtable
WHERE Barcode=:barcode'
);
$stmt->execute([':barcode' => $barCode]);
代码应该是这样的:
$barCode = isset($_GET['id']) ? (int) $_GET['id'] : null;
// check $barCode is valid value, if not, don't bother connecting
if ($barCode) {
$pdo = new PDO(
sprintf(
'mysql:host=%s;dbname=%s;charset=utf8', // add charset here!
$host,
$dbName
),
$user, $password,
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]
);
$stmt = $pdo->prepare(
'INSERT INTO adstable(Brand, Description, Price, Size, Barcode)
SELECT Brand, Description, Price, Size, Barcode FROM invtable
WHERE Barcode = :barcode'
);
$stmt->execute(
[
':barcode' => $barCode
]
);
}
这应该可以解决问题。但说真的:错误消息 告诉你哪里出了问题 阅读它们
我是 PDO 的新手并且 php。我想用 link 将一行从一个 table 移动到另一个我发送到下面的脚本。
LINK "id" 用作 invtable 中的主键,(请参阅下面脚本中的 FROM invtable)
提交广告-florida.php?id=01820007985
SCRIPT 提交广告-florida.php
<?php
$host = "localhost";
$user = "user";
$password = "pass";
$database_name = "db";
$pdo = new PDO("mysql:host=$host;dbname=$database_name", $user, $password, array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
));
$barCode = $GET['id'];
$query = "INSERT INTO adstable (Brand, Description, Price, Size, Price, Barcode)
SELECT Brand, Description, Price, Size, Price, Barcode FROM invtable
WHERE Barcode='".$barCode."'";
$pdo->query($query);
?>
问题
通过 GET[id]) 删除了额外的括号)。我收到以下错误。
致命错误:未捕获异常 'PDOException',消息为“SQLSTATE[42000]:语法错误或访问冲突:1110 列 'Price' 在 /home/myaccount/public_html/florida-ave/submit-ads-florida 中指定了两次”。php:16 堆栈跟踪:#0 /home/myaccount/public_html/florida-ave/submit-ads-florida.php(16): PDO->query('INSERT INTO flo...') #1 {main} throw in /home/myaccount/public_html/florida-ave/submit-ads-florida.php 第 16 行
更新
我更正了价格的多个条目。没有数据被添加到广告table,我没有收到任何错误。
请检查并更正此行:$barCode = $GET['id'];
如果这不是您的解决方案,请告诉我。
好的,所以您 had/have 的问题是:
$barCode = $GET['id']);
应该是$barCode = $GET['id'];
,甚至可能是$_GET['id'];
- 您的
SELECT
查询选择了同一字段两次(SELECT Brand, Description, >Price<, Size, >Price<)
- 您还在同一字段中插入了两次:
INSERT INTO adstable (Brand, Description, >Price<, Size, >Price<
- 您仍然容易受到注入攻击
那么让我们来解决问题:
$barCode = isset($_GET['id']) ? $_GET['id'] : null;//avoids undefined index notice
接下来,要在SELECT
查询中两次使用同一个字段,你可以定义一个别名,但你只是不需要同一个字段两次...
SELET SELECT Brand, Description, Price as price_1, Size, Price as price_2, Barcode FROM
然后,为了防止一级注入攻击,让我们使用准备好的语句而不是使用 GET 参数调用 PDO::query
:
$stmt = $pdo->prepare('INSERT INTO adstable (Brand, Description, Price, Size, Barcode)
SELECT Brand, Description, Price, Size, Barcode FROM invtable
WHERE Barcode=:barcode'
);
$stmt->execute([':barcode' => $barCode]);
代码应该是这样的:
$barCode = isset($_GET['id']) ? (int) $_GET['id'] : null;
// check $barCode is valid value, if not, don't bother connecting
if ($barCode) {
$pdo = new PDO(
sprintf(
'mysql:host=%s;dbname=%s;charset=utf8', // add charset here!
$host,
$dbName
),
$user, $password,
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]
);
$stmt = $pdo->prepare(
'INSERT INTO adstable(Brand, Description, Price, Size, Barcode)
SELECT Brand, Description, Price, Size, Barcode FROM invtable
WHERE Barcode = :barcode'
);
$stmt->execute(
[
':barcode' => $barCode
]
);
}
这应该可以解决问题。但说真的:错误消息 告诉你哪里出了问题 阅读它们