【发布时间】:2012-12-14 20:56:28
【问题描述】:
我想将 PDO INSERT 和 UPDATE 准备语句切换为 INSERT 和 ON DUPLICATE KEY UPDATE,因为我认为它会比我目前正在做的更有效,但我无法弄清楚与命名占位符和 bindParam 一起使用的正确语法。
我在 SO 上发现了几个类似的问题,但我是 PDO 的新手,无法根据我的标准成功调整代码。这是我尝试过的,但它不起作用(它不插入或更新):
try {
$stmt = $conn->prepare('INSERT INTO customer_info (user_id, fname, lname) VALUES(:user_id, :fname, :lname)'
'ON DUPLICATE KEY UPDATE customer_info SET fname= :fname,
lname= :lname
WHERE user_id = :user_id');
$stmt->bindParam(':user_id', $user_id);
$stmt->bindParam(':fname', $_POST['fname'], PDO::PARAM_STR);
$stmt->bindParam(':lname', $_POST['lname'], PDO::PARAM_STR);
$stmt->execute();
}
这是我的代码的简化版本(我有几个查询,每个查询有 20 到 50 个字段)。我目前正在首先更新并检查更新的行数是否大于 0,如果不是,则运行 Insert,每个查询都有自己的一组 bindParam 语句。
【问题讨论】:
-
不要在同一个查询的多个地方重复使用同一个占位符。您的 PDO 连接是否设置为抛出异常?除非你真的需要
bindParam、bindValue或者通过execute传递参数是更好的选择。 -
当你说我不应该在多个地方重复使用同一个占位符时,你的意思是我需要有 2 组 bindParam 语句吗?我目前用 - catch(PDOException $e) {echo 'Error: ' 设置它。 $e->getMessage();} - 我没有收到此代码的任何错误消息。
-
仅在查询周围放置 try/catch 是不够的。请参阅Error Handling 并将其配置为在错误时引发异常。
-
@DCoder:您介意详细说明您的意思吗?我认为我这样做的方式与手册中的 ERRMODE_EXCEPTION 一致,应该会抛出 PDOException。
-
请参阅this question 了解
bindParam和bindValue之间的差异。$stmt->execute(array(':fname' => $_POST['fname']))也可用于传递绑定变量。在我看来,execute是最简单的选择,除非您需要bindParam或bindValue的特定行为,否则应该首选。当然,您的里程可能会有所不同。
标签: php pdo prepared-statement on-duplicate-key sqlbindparameter