我的每个循环都有问题。我为我的PDO绑定参数创建了一个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();但是我认为每个循环h都会执行查询,所以对于数组,我只能在DB中得到最后的结果。
我所拥有的:
'foo' => 'bar', 'something' => 'result'我得到的结果是:
'foo' => 'result', 'something' => 'result'我想要的结果是:
$sql->bindParam(':' . 'foo', 'bar', PDO::PARAM_STR);
$sql->bindParam(':' . 'somthing', 'result', PDO::PARAM_STR);非常感谢!
发布于 2017-07-10 13:31:49
这一意外行为是由于bindParam() ( bindParam($param,$variable,...) )的内部工作引起的。
根据PHP文档
变量被绑定为引用,并且只在PDOStatement::execute()被调用时才进行计算。
下面是您的答案,因为bindParam在调用execute()时计算值,而不像立即调用并绑定值的bindValue那样。这就是为什么当您的foreach循环结束时,$variable引用在其内存地址中包含“结果”值,而bindParam则查找此引用并查找“结果”值,因为bindParam(.);方法具有相同的引用,它们指向相同的值“结果”,并将其存储在数据库中。由于某些原因或其他原因,这可能是一种错误。
现在该怎么办才能解决这个问题呢?最简单的方法是,使用:
bindValue(...);另一种典型的方法是在前面传递引用,例如:
foreach($userInfo as $column => &$value)
//notice: In this way you also need to unset the $value.所有其他事情都将保留为same.However,我将建议您完成此任务的第一个方法。
https://stackoverflow.com/questions/45009135
复制相似问题