PDO bindParam在foreach中不起作用

时间:2014-10-02 15:18:06

标签: php mysql pdo

我正在使用PDO申请,但PDO bindParam()遇到了问题。我有一个数组,我希望使用PDO bindParam()循环或for来使用foreach()数组的值,但是foreach()会产生意外结果。当我在bindParam()循环中使用for时,它运行正常。我试过的是

$con = $this->connection();
$stmt = $con->prepare($sql);

for($i = 0; $i < count($params); $i++){
   $stmt->bindParam($i + 1, $params[$i], PDO::PARAM_STR, 10);
}
$stmt->execute();
$result = $stmt->fetchAll();//$result is OK

但是当我在bindParam()中使用foreach()时,我得到了一个空的array()作为结果。代码下方

$con = $this->connection();
$stmt = $con->prepare($sql);

foreach($params as $key=>$val){ //Here
    $stmt->bindParam($key + 1, $val, PDO::PARAM_STR, 10);
}
$stmt->execute();
$result = $stmt->fetchAll(); //$result is an empty array

我想知道为什么会这样。我找不出原因。任何信息将不胜感激。

编辑:我使用bindValue()解决了我的问题。

2 个答案:

答案 0 :(得分:11)

使用bindValue()代替bindParam()bindParam()绑定到引用,因此当您执行查询时,所有参数都使用$val的最后一个值。

答案 1 :(得分:5)

如果您已经有数组中的项目,则没有理由在循环中调用$stmt->bindParam;只是做:

$con = $this->connection();
$stmt = $con->prepare($sql);
$stmt->execute($params);
$result = $stmt->fetchAll();

根据PHP documentation

  

执行准备好的声明。如果包括准备好的声明   参数标记,你必须:

     

调用PDOStatement :: bindParam()将PHP变量绑定到参数   标记:绑定变量将其值作为输入传递并接收   输出值(如果有)与其相关的参数标记

     

或传递一组仅输入参数值