php - 在 PDO 中使用 INSERT INTO ON DUPLICATE KEY 绑定(bind)值

标签 php mysql sql pdo

我在使用 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/

相关文章:

php - mysql_real_escape_string 不工作

php - 仅显示 15 个结果

php - mysql_real_escape_string 的问题

mysql - 运行查询以创建表时出现错误 1064?

sql - MS Access - 如果仅使用 LEFT 函数,则联接值相似的表?

php - 使用 PHP 使用 MySQL 表中的值填充搜索输入框

php - Silverstripe SQL更新多行

sql - Oracle - 如何捕获 XML 标签下的值

sql - 连接两个表的表是否应该有自己的 ID?

javascript - 选择列表滚动到特定选项问题