将参数传递给查询时,Php PDO 无法正常工作?
Posted
技术标签:
【中文标题】将参数传递给查询时,Php PDO 无法正常工作?【英文标题】:Php PDO is not working properly when passing params to query? 【发布时间】:2015-01-24 08:09:21 【问题描述】:我有以下 php 代码,我正在尝试使用 php PDO 执行关联查询,问题出在
WHERE :sno IN(:counselType)
这是我的代码:
//--------------------- PHP code and Query with Array for passing the params ------------
$counselType = $_POST['counselType'];
$counselType = $counselType == 1 ? "plaintiffAdvocateCC" : "defendantAdvocateCC";
$ary = array(':sno'=>$_POST['counselSno'],':counselType'=>$counselType);
//echo $counselType; print_r($bindVar);
$sql = "SELECT DISTINCT c.caseSno,cs.caseNumber,cs.dateOriginalInstitution,CONCAT(cs.plaintiff,' V/S ',cs.respondant) AS caseTitle, cs.caseNature,cs.inTheCourt,
c.dateOfHearing,c.isDecided,c.stageOfProceedings
FROM
chronologicallists c,cases cs
WHERE
:sno IN(:counselType) AND c.caseSno = cs.sno
GROUP BY c.caseSno
ORDER BY c.isDecided ASC";
if($db->dbQuery($sql,$ary))
foreach($db->getRecordset($sql,$ary) as $row)
//------- other code
//if search
//------------------------------The Function in the class which handle the queries -------------
function for if search
public function dbQuery($sql,$bindVars=array())
try
$this->connect();
$statement = $this->con->prepare($sql);
$statement->execute($bindVars);
if($statement->rowCount() > 0)
return true;
else
return false;
catch(PDOException $exc)
$this->tempVar = $exc->getMessage();
$this->sqlToReturn = $sql;
return false;
$this->con = null;
---------------------------------------------------------------------
function for returning the RecordSet array
public function getRecordSet($sql,$bindVars=array())
try
$this->connect();
$statement = $this->con->prepare($sql);
$statement->execute($bindVars);
return $statement->fetchAll();
catch(PDOException $ex)
$this->tempVar = $ex->getMessage();
return false;
//getRecordSet()
//----------------------------------------------------------------------------------------------
我不确定为什么 PDO 不翻译这些参数。 请指导我哪里出错了? 谢谢
【问题讨论】:
不能绑定表和列。这个WHERE :sno
是不行的,但是可以先赋值一个变量WHERE $sno
有没有办法绑定列或表名,如 :col 或 :table_name ?
不,因为准备好的语句是如何工作的。查询被发送到服务器,服务器将其解析为执行计划(决定使用哪些索引,将哪些表连接在一起等),然后在执行查询时将绑定参数中的数据发送给它。如果数据库不知道要使用的表和列,则无法创建执行计划。
【参考方案1】:
你必须像这样动态构建一个字符串
$list = ':foo1, :foo2, :foo3';
如果你的输入是这样的
$array = ['a', 'b', 'c'];
然后你必须绑定 :foo1 到 'a' 等等
查询看起来像这样
WHERE sno IN (:foo1, :foo2, :foo3);
秒问题,:sno 是不可能的,你不能绑定字段名
【讨论】:
有没有办法绑定列或表名,如 :col 或 :table_name?如果是这样,那么我已经以同样的方式解决了这个问题,谢谢 我认为你并不真正理解 sql 和 pdo 背后的概念...... sql 是一种“语言”,就像 php......你将一个函数推送到你的服务器,然后执行它绑定变量(这些是函数参数)....函数本身将在执行之前被评估,但在不知道所有表/列等的情况下,mysql 无法评估“函数”以上是关于将参数传递给查询时,Php PDO 无法正常工作?的主要内容,如果未能解决你的问题,请参考以下文章