我有这个功能。
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 | +----------+----------+
为什么我的结果为零?
感谢。
答案 0 :(得分:2)
这里的问题在于使用bindParam
。
如手册中所述:
与PDOStatement :: bindValue()不同,变量被绑定为引用,并且仅在调用PDOStatement :: execute()时进行计算。
当您在循环中使用bindParam
时,在调用execute
时,所有占位符都绑定到$prm_value
的值,这是在循环的末尾等于最后数组项。即1(showemail
的值)。
所以,从字面上看,你的查询是
SELECT * FROM TABLE WHERE username = 1 and showmail = 1
当然,不是你所期待的。
因此,在这种情况下你应该使用bindValue
。