我正在尝试更新 MySQL 数据库中的记录。
我使用数组/循环构建准备好的语句:
$sql = "UPDATE table01 SET ";
foreach($values as $value)
{
$sql .="$value = :$value, ";
}
$sql = rtrim($sql,', ');
$sql .=" WHERE id = '$id'";
然后我准备这个声明:
try
{
$pdo = new PDO('mysql:host=localhost; dbname=db01', $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare($sql);
然后,我将准备好的语句中的每个标记/占位符绑定(bind)到要使用另一个循环插入的值:
foreach(array_combine($values, $variables) as $value=>$variable)
{
$stmt->bindParam(':$value', $variable);
}
$stmt->execute();
其中 $values 是数据库中的列标题数组(因此 ':$value' 是与其对应的一组标记名称),$variables 是包含要存储的数据的变量数组。
当我运行此程序时,出现错误:
Error: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
但是正如你所看到的,我是从数组中形成它们的 - 我已经对数组进行了计数以确保元素 1:1 匹配,并且它们确实如此:
仅供引用:
$count1 = count($values);
$count2 = count($variables);
echo $count1;
echo $count2;
给出: 7575
(它们都有 75 个元素)
最佳答案
单引号不会插入变量。
$stmt->bindParam(':$value', $variable);
应该是
$stmt->bindParam(":$value", $variable);
关于php - 使用 PDO、准备好的语句和用 bindParam 替换标记来更新 MySQL;收到 'variables don' t 匹配 token 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13059826/