我正在升级我的网站以使用PDO。大多数代码都运行正常,但我有一个INSERT语句,我无法工作。它适用于我的本地服务器,但不适用于实际站点。我检查了表结构,它们完全相同。
这是我的代码
try {
foreach ($unique_product_line_ids AS $key => $value) {
$query_insertSQL = "
INSERT INTO tblCarts (
date_created
, session_id
, product_line_id
, posted_by_id
, quantity
) VALUES (
:date_created
, :session_id
, :product_line_id
, :posted_by_id
, :quantity1
)
ON DUPLICATE KEY UPDATE quantity = :quantity2
";
$insertSQL = $conn->prepare($query_insertSQL);
$insertSQL->execute(array(
':date_created'=>$date_created
, ':session_id'=>$session_id
, ':product_line_id'=>$key
, ':posted_by_id'=>$_SESSION['member']['individual_id']
, ':quantity1'=>$value
, ':quantity2'=>$value
));
$rc_insertSQL = $insertSQL->rowCount();
// close connection
$insertSQL->closeCursor();
}
} catch(PDOException $e) {
echo 'ERROR: ' . $e->getMessage();
}
我检查了unique_product_line_ids数组中的值,它们确实存在。我也尝试删除ON DUPLICATE KEY UPDATE行(及其相应的参数),但没有区别。
我花了好几个小时试图消除潜在的原因,并且没有成功地隔离问题。非常感谢任何帮助或指针。
由于
答案 0 :(得分:3)
准备好的陈述的一个优点是你准备一次并执行多次,所以 我会像这样重新制作你的代码:
try {
$totalInserts = 0;
$query_insertSQL =
"
INSERT INTO tblCarts (
date_created
, session_id
, product_line_id
, posted_by_id
, quantity
)
VALUES (
:date_created
, :session_id
, :product_line_id
, :posted_by_id
, :quantity
)
ON DUPLICATE KEY UPDATE
quantity = :quantity
";
$insertSQL = $conn->prepare($query_insertSQL);
foreach ($unique_product_line_ids AS $key => $value)
{
$insertSQL->execute(array(
':date_created' => $date_created
, ':session_id' => $session_id
, ':product_line_id'=> $key
, ':posted_by_id' => $_SESSION['member']['individual_id']
, ':quantity' => $value
));
$totalInserts += $insertSQL->rowCount();
/**
* to debug if any error
*/
var_export($conn->errorInfo());
// close connection - does not need anymore while you don't
// prepare it multiple times
//$insertSQL->closeCursor();
}
}
catch(PDOException $e)
{
echo 'ERROR: ' . $e->getMessage();
}
备注:强>
您可以根据需要多次使用一个变量,
所以在它们不同之前不需要使用:quantity1
和:quantity2
。 :quantity
就足够了。
要调试是否有错误,您可以使用$conn->errorInfo();
(连接级别)或$insertSQL->errorInfo();
(查询级别)