在PDO中使用大小写更新多行时参数号无效

时间:2014-08-29 09:52:59

标签: php html mysql pdo case

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

$ _ POST [ “TID”]:

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

$ _ POST [ “年龄”]:

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();
}

1 个答案:

答案 0 :(得分:1)

你的第一个循环是错误的。最终测试没有考虑到你增加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]);
   }