我在使用 PDO 中的 INSERT INTO ON DUPLICATE KEY
查询绑定(bind)值时遇到了问题。
我收到的错误是 SQLSTATE[HY093]:参数编号无效:绑定(bind)变量的数量与标记的数量不匹配
。
SQL 的构建似乎是正确的:
INSERT INTO `mytable` (user_name,user_id)
VALUES (?,?) ON DUPLICATE KEY UPDATE user_name = ?,user_id = ?
对于 ON DUPLICATE KEY UPDATE
子句,我是否认为它需要再次将相同的值绑定(bind)到 foreach
循环中的参数?谁能告诉我该怎么做?
$update_fields .= $comma.$filter. " = ?";
$filters = array("user_name"=>"User Name","user_id"=>"User ID");
$field = "";
$comma = "";
foreach ($filters as $filter => $title) {
$filterVar = "post_".$filter;
$$filterVar = (isset($_POST["$filterVar"]) ? $_POST["$filterVar"] : "");
if ($$filterVar) {
$fields .= $comma.$filter;
$values .= $comma.$$filterVar;
$update_fields .= $comma.$filter. " = ?";
$comma = ",";
}
}
$values_arr = explode(',',$values);
$in = str_repeat('?,', count($values_arr) - 1) . '?';
$sql .= "INSERT INTO `mytable` ($fields) VALUES ($in)";
$sql .= "ON DUPLICATE KEY UPDATE $update_fields ";
$users = $dbh->prepare($sql);
print $sql;
$i = 1;
foreach ($values_arr as $value) { // binding values
$users->bindValue($i++, $value);
}
$users->execute($values_arr);
最佳答案
你是对的,它需要为两个部分绑定(bind)相同的值。但我认为如果你要将值数组传递给 execute
,你不需要事先绑定(bind)值,所以你应该能够跳过 foreach...bindValue
部分。这类似于 the PHP docs on PDOStatement::execute 中的示例 3 .但是,由于 ON DUPLICATE KEY UPDATE
部分,您的 ?
占位符数量是原来的两倍,因此您的值数组也需要加倍。我认为这应该可行。
$double_values = array_merge($values_arr, $values_arr);
$users->execute($double_values);
关于php - 在 PDO 中使用 INSERT INTO ON DUPLICATE KEY 绑定(bind)值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25127644/