我需要有关在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/