我的每个循环都有问题。我为我的PDO bindparams创建了一个for循环。
$query = 'UPDATE user_info SET ';
foreach ($userInfo as $column => $value) {
if($value === end($userInfo)) {
$query .= $column . ' = :' . $column . '';
}else{
$query .= $column . ' = :' . $column . ', ';
}
}
$query .= ' WHERE id = :id';
$sql = $dbh->prepare($query);
$sql->bindParam(':id', $userInfoId, PDO::PARAM_INT);
foreach ($userInfo as $column => $value) {
$sql->bindParam(':' . $column, $value, PDO::PARAM_STR);
}
$sql->execute();
但我认为在每次循环之后我都会执行查询,所以对于数组我只能获得数据库中的最后一个结果。
我有什么:
'foo' => 'bar', 'something' => 'result'
我得到的结果是:
'foo' => 'result', 'something' => 'result'
我想要的结果是:
$sql->bindParam(':' . 'foo', 'bar', PDO::PARAM_STR);
$sql->bindParam(':' . 'somthing', 'result', PDO::PARAM_STR);
非常感谢!
答案 0 :(得分:1)
这种意外行为是由于bindParam()
bindParam($param,$variable,...)
的内部工作造成的。
根据PHP文档
变量被绑定为引用,并且仅在调用PDOStatement :: execute()时进行计算。
所以这是你的答案,因为bindParam在调用execute()时评估值,而不是像立即调用并绑定值的bindValue。这就是为什么当你的foreach循环结束时 $变量引用包含"结果"然后在其内存地址和bindParam中查找该引用并查找"结果"因为bindParam(...)的值;方法具有相同的参考,它们指向相同的值"结果"这将存储在数据库中。由于某些原因或某些其他原因,这可能是一种错误。
现在该怎么做才能解决它?最简单的方法是,使用:
bindValue(...);
另一种典型的方法是在foreach中传递引用,例如:
foreach($userInfo as $column => &$value)
//notice: In this way you also need to unset the $value.
所有其他事情将保持不变。但是,我会建议你完成这项任务的第一种方式。