我需要有关在PDO中一次更新多行的帮助。我为此目的使用UPDATE SET CASE WHEN,但是在将值绑定到位置占位符时确实感到困惑。假设我的$_POST内容是这样的:

$ _POST [“ tid”]:

Array
(
    [0] => 383
    [1] => 386
)


$ _POST [“ age”]:

Array
(
    [0] => 45
    [1] => 30
)


那么$ sql应该是:

 UPDATE `person` SET age = CASE
 WHEN user_id = ? AND tid = ? THEN ?
 WHEN user_id = ? AND tid = ? THEN ?
 ELSE `age` END


下面的代码给我这个错误

 [HY093]: Invalid parameter number: number of bound variables does not match number of tokens


我正在寻找生成正确数量的绑定变量,如下所示:

$users->bindValue(1, $_SESSION["user_id"]);
$users->bindValue(2, 383);
$users->bindValue(3, 45);
$users->bindValue(4, $_SESSION["user_id"]);
$users->bindValue(5, 386);
$users->bindValue(6, 30);


下面的代码有什么问题吗?

 try
 {
   $dbh = new PDO("mysql:host=$hostname;dbname=$databasename", $username, $password);
   $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
   $tid = $_POST["tid"];
   $age = $_POST["age"];
   $count = count($tid);

   for($i=0;$i<$count;$i++)
   {
      $wa .= " WHEN user_id = ? AND tid = ? THEN ?";
   }

   $sql = "UPDATE `person` SET `age` = CASE $wa ELSE `age` END";

   $users = $dbh->prepare($sql);

   for($i=1;$i<$count;$i+=3)
   {
      $users->bindValue($i, $_SESSION["user_id"]);
   }

   $j = 2;
   foreach($tid as $t)
   {
      $users->bindValue($j, $t);
      $j+=3;
   }
   $k = 3;
   foreach($age as $a)
   {
      $users->bindValue($k, $a);
      $k+=3;
   }

   $users->execute();
   $dbh = null;

}
catch(PDOException $e)
{
   echo $e->getMessage();
}

最佳答案

您的第一个循环是错误的。最终测试没有考虑到您将递增3的事实。

   for($i=1;$i<$count*3;$i+=3)
   {
      $users->bindValue($i, $_SESSION["user_id"]);
   }


或者,您可以在一个循环中完成所有操作:

   for($i=0;$i<$count;$i++)
   {
      $users->bindValue(3*$i+1, $_SESSION["user_id"]);
      $users->bindValue(3*$i+2, $tid[$i]);
      $users->bindValue(3*$i+3, $age[$i]);
   }

关于php - 在PDO中使用案例更新多行时参数编号无效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25565845/

10-12 19:59