首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bindparam前级回路

Bindparam前级回路
EN

Stack Overflow用户
提问于 2017-07-10 10:01:44
回答 1查看 569关注 0票数 1

我的每个循环都有问题。我为我的PDO绑定参数创建了一个for每个循环。

代码语言:javascript
复制
$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中得到最后的结果。

我所拥有的:

代码语言:javascript
复制
'foo' => 'bar', 'something' => 'result'

我得到的结果是:

代码语言:javascript
复制
'foo' => 'result', 'something' => 'result'

我想要的结果是:

代码语言:javascript
复制
$sql->bindParam(':' . 'foo', 'bar', PDO::PARAM_STR);
$sql->bindParam(':' . 'somthing', 'result', PDO::PARAM_STR);

非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-10 13:31:49

这一意外行为是由于bindParam() ( bindParam($param,$variable,...) )的内部工作引起的。

根据PHP文档

变量被绑定为引用,并且只在PDOStatement::execute()被调用时才进行计算。

下面是您的答案,因为bindParam在调用execute()时计算值,而不像立即调用并绑定值的bindValue那样。这就是为什么当您的foreach循环结束时,$variable引用在其内存地址中包含“结果”值,而bindParam则查找此引用并查找“结果”值,因为bindParam(.);方法具有相同的引用,它们指向相同的值“结果”,并将其存储在数据库中。由于某些原因或其他原因,这可能是一种错误。

现在该怎么办才能解决这个问题呢?最简单的方法是,使用:

代码语言:javascript
复制
bindValue(...);

另一种典型的方法是在前面传递引用,例如:

代码语言:javascript
复制
foreach($userInfo as $column => &$value)
//notice: In this way you also need to unset the $value.

所有其他事情都将保留为same.However,我将建议您完成此任务的第一个方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45009135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档