PHP PDO foreach问题

Res*_*tic 1 php mysql pdo for-loop

所以我有一个PHP函数来更新数据库中的2列.它看起来像这样:

$fields = array("firstname" => "Joe", "lastname" = "Dunno");

$stmt = $connection->prepare("UPDATE users SET firstname = :firstname, lastname = :lastname WHERE user_id = :user_id");

foreach ($fields as $key => $value)
{
    $stmt->bindParam(":" . $key, $value);
} 

$stmt->bindParam(":user_id", $user_id);
Run Code Online (Sandbox Code Playgroud)

但是当我出于某种原因执行语句时,它喜欢将名字和姓氏都更新为Dunno而不是Joe和Dunno.

我试着回声$key并且$value正确打印出来.

出于一些奇怪的原因,如果我使用它for循环它正常工作.

for ($fieldsKeys = array_keys($fields), $x = 0; $x < count($fields); $x++)
{
    $stmt->bindParam(":" . $fieldsKeys[$x], $fields[$fieldsKeys[$x]]);
}
Run Code Online (Sandbox Code Playgroud)

Yur*_*rov 5

bindParam绑定到变量,这就是两个字段都设置为相同值(最后一个值$value)的原因.您应该使用bindValue:

$stmt->bindValue(":" . $key, $value);
Run Code Online (Sandbox Code Playgroud)

在您的代码中,PDO记住它需要使用$value变量for :firstname:lastname.在语句执行时,$valueDunno,因此两个字段都获得此值.如果您使用bindValue,PDO不记得使用的变量,但它的值,这就是您所需要的.