将参数传递给查询时,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 无法正常工作?的主要内容,如果未能解决你的问题,请参考以下文章

将表作为参数传递给函数

将查询字符串参数传递给 s-s-rS 报告

将参数传递给方法时将标记查询强化为 sqlInjection

如何将参数传递给 ssis 中的 ado.net 源?

将 $db 对象传递给其他类,以便它们可以访问数据库

将参数传递给查询访问 VBA