Bindparam foreach循环

时间:2017-07-10 10:01:45

标签: php pdo

我的每个循环都有问题。我为我的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);

非常感谢!

1 个答案:

答案 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.

所有其他事情将保持不变。但是,我会建议你完成这项任务的第一种方式。