我可以在bindParam中传递对第一个arg的引用吗?

时间:2015-12-24 14:43:13

标签: php mysql pdo

我有这个功能。

function SelectSql($sqlarray){

    try {
        //build the query
        $where="";

        //build the where query
        if(!empty($sqlarray["where_cols"]))  
            $where.="WHERE " .$sqlarray["where_cols"];

        $sql="SELECT " . $sqlarray["prefix_from"] . " FROM " . $sqlarray["tables"] . " $where";
        echo $sql;

        $conn=Connect(); //connect

        $command = $conn->prepare($sql); //run the query

        foreach($sqlarray["prms"] as $prm_name=>$prm_value)   //build the prms
            $command->bindParam(":$prm_name",$prm_value);

        $command->execute(); //exec the query 
        $results=$command->fetchAll();

        if ($command->rowCount() > 0)  //check if there is a results
            return $results; //ret results
        else
            return false; //ret null
        }
    catch(PDOException $e)
    {
        echo $e->getMessage();
        return false;
    }
    catch(Exception $e)
    {
        return false;
    }
}
打算构建查询的

现在sample功能调用上面的SelectSql

function sample(){
    $sql["tables"]="USERS";
    $sql["prefix_from"]="*";
    $sql["where_cols"]="username=:uname and showmail=:showmail";
    $sql["prms"]=array("uname"=>"eli","showmail"=>1);
    $result=SelectSql($sql);
    if($result==false) // no results
        echo "no";      
}

这是表格:

+----------+----------+
| username | showmail |
+----------+----------+
| eli      |        1 |
+----------+----------+

为什么我的结果为零?

感谢。

1 个答案:

答案 0 :(得分:2)

这里的问题在于使用bindParam

如手册中所述:

  

与PDOStatement :: bindValue()不同,变量被绑定为引用,并且仅在调用PDOStatement :: execute()时进行计算。

当您在循环中使用bindParam时,在调用execute时,所有占位符都绑定到$prm_value的值,这是在循环的末尾等于最后数组项。即1(showemail的值)。

所以,从字面上看,你的查询是

SELECT * FROM TABLE WHERE username = 1 and showmail = 1

当然,不是你所期待的。

因此,在这种情况下你应该使用bindValue