【问题标题】:Binding values with INSERT INTO ON DUPLICATE KEY in PDO在 PDO 中使用 INSERT INTO ON DUPLICATE KEY 绑定值
【发布时间】:2014-08-04 21:13:23
【问题描述】:

我在 PDO 中使用INSERT INTO ON DUPLICATE KEY 查询绑定值时遇到了问题。 我得到的错误是SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

SQL 的构建似乎是正确的:

INSERT INTO `mytable` (user_name,user_id) 
  VALUES (?,?) ON DUPLICATE KEY UPDATE user_name = ?,user_id = ? 

我认为它需要再次将相同的值绑定到 ON DUPLICATE KEY UPDATE 子句的 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);

【问题讨论】:

    标签: php mysql sql pdo


    【解决方案1】:

    你说得对,它需要为两个部分绑定相同的值。但我认为,如果您要将值数组传递给execute,则不需要事先绑定值,因此您应该可以跳过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);
    

    【讨论】:

      猜你喜欢
      • 2022-08-02
      • 1970-01-01
      • 2017-02-21
      • 2011-01-29
      • 2017-09-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-29
      • 1970-01-01
      相关资源
      最近更新 更多