gpt4 book ai didi

php - PDO 为带有命名占位符的 INSERT 和 ON DUPLICATE KEY UPDATE 准备语句

转载 作者:可可西里 更新时间:2023-10-31 22:18:06 26 4
gpt4 key购买 nike

我想将 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,如果不大于 0,则运行插入,并且每个查询都有自己的一组 bindParam 语句。

最佳答案

您的 ON DUPLICATE KEY 语法不正确。

$stmt = $conn->prepare('INSERT INTO customer_info (user_id, fname, lname) VALUES(:user_id, :fname, :lname)
ON DUPLICATE KEY UPDATE fname= :fname2, lname= :lname2');

$stmt->bindParam(':user_id', $user_id);
$stmt->bindParam(':fname', $_POST['fname'], PDO::PARAM_STR);
$stmt->bindParam(':lname', $_POST['lname'], PDO::PARAM_STR);
$stmt->bindParam(':fname2', $_POST['fname'], PDO::PARAM_STR);
$stmt->bindParam(':lname2', $_POST['lname'], PDO::PARAM_STR);

您不需要在ON DUPLICATE KEY 子句中放入表名或SET,也不需要WHERE 子句(它总是用重复键更新记录)。

参见 http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html

您还有一个 PHP 语法错误:您将查询拆分为两个字符串。

更新:

绑定(bind)多个参数:

function bindMultiple($stmt, $params, &$variable, $type) {
foreach ($params as $param) {
$stmt->bindParam($param, $variable, $type);
}
}

然后调用它:

bindMultiple($stmt, array(':fname', ':fname2'), $_POST['fname'], PDO::PARAM_STR);

关于php - PDO 为带有命名占位符的 INSERT 和 ON DUPLICATE KEY UPDATE 准备语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14089055/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com