2014-10-02 161 views
3

我正在使用PDO作为应用程序,但得到PDO bindParam()的问题。我有一个阵列,我想使用PDO bindParam()使用for循环或foreach()阵列的值,但意想不到的结果是通过foreach()得到。当我在for循环中使用bindParam()时,它工作正常。我试过了PDO bindParam不在foreach中工作

$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 

但是,当我在foreach()使用bindParam()然后我得到了一个空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()代替我解决了我的问题。

+1

'$ params'定义在哪里? – Jez 2014-10-02 15:21:09

+0

@Jez它是从函数参数! – MH2K9 2014-10-02 15:22:11

回答

11

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

+0

我正要发布这个。这是正确的答案。 – 2014-10-02 15:23:24

+0

'bindValue()'没有'driver_options'参数。这对您的查询是否有必要? – Barmar 2014-10-02 15:35:06

+0

@Barmar如何在执行前显示完整的SQL查询字符串? – Janie 2017-07-07 12:05:24

5

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

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

PHP documentation

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

调用PDOStatement对象:: bindParam()将PHP变量绑定到参数 标记:绑定变量传递其作为输入值和接收 输出值,如果有的话,它们相关联的参数的标记

或通过仅输入参数的值的数组