【问题标题】:Struggling with prepared statements与准备好的陈述作斗争
【发布时间】:2012-06-11 12:00:22
【问题描述】:

我无法进行以下工作。我想在下面的示例中使用准备好的语句,但出现错误。函数明确地在 $array 中传递了正确的值:

  private function getInfoFromSystem($array) {
        try {
            $sql = "
                SELECT     
                    PCO_AGENT.NAME, 
                    PCO_INBOUNDLOG.LOGIN AS LOGINID, 
                    PCO_INBOUNDLOG.PHONE AS CALLERID, 
                    PCO_INBOUNDLOG.STATION AS EXTEN, 
                    PCO_INBOUNDLOG.TALKTIME AS CALLLENGTH, 
                    PCO_INBOUNDLOG.CHANNELRECORDID AS RECORDINGID, 
                    PCO_SOFTPHONECALLLOG.RDATE, 
                    PCO_INBOUNDLOG.RDATE AS INBOUNDDATE
                FROM         
                    PCO_INBOUNDLOG 
                INNER JOIN
                      PCO_LOGINAGENT ON PCO_INBOUNDLOG.LOGIN = PCO_LOGINAGENT.LOGIN 
                INNER JOIN
                      PCO_SOFTPHONECALLLOG ON PCO_INBOUNDLOG.ID = PCO_SOFTPHONECALLLOG.CONTACTID 
                INNER JOIN
                      PCO_AGENT ON PCO_LOGINAGENT.AGENTID = PCO_AGENT.ID
                WHERE
                    LOGINID = :extension
            ";
            $arr = array(":extension" => $array['extension']);
            $query = $this->mssql->prepare($sql);
            $query->execute($arr);
           // $sql = "select * from sys.messages where message_id = 229";
            foreach($this->mssql->query($sql) as $row) {

                echo "<pre>";
                print_r($row);
                echo "</pre>";
            }

        }
        catch(PDOException $e) {
            echo $e->getMessage();
        }
}

【问题讨论】:

  • 也可能是var_dump($array['extension'])? :)
  • SQLSTATE[HY000]:一般错误:207 一般 SQL Server 错误:检查来自 SQL Server [207](严重性 16)的消息 [(null)
  • 你的错误是什么?你期望得到什么?更重要的是为什么在调用 PDOStatement::execute() 之后使用 PDO::query() 而不是 PDOStatement::fetch*()?
  • 也许只是某处拼写错误:msdn.microsoft.com/en-us/library/aa258715(v=sql.80).aspx:“当在查询的 FROM 子句中指定的任何表中找不到 Transact-SQL 语句中引用的列时,就会发生此错误。”

标签: php pdo prepared-statement


【解决方案1】:

您不应该在execute() 之后调用query()。而是you need to fetch() your rows:

$query = $this->mssql->prepare($sql);
$query->execute($arr);

while ($row = $query->fetch(PDO::FETCH_ASSOC)) {
  echo "<pre>";
  print_r($row);
  echo "</pre>";
}

// OR rather than the fetch loop above, use fetchAll()
$rowset = $query->fetchAll(PDO::FETCH_ASSOC);
print_r($rowset);

根据我使用 PDO + MSSQL 的经验,尝试在返回行的语句上调用 execute() 后立即调用常规查询将失败,除非您先调用 $query-&gt;closeCursor()。但是,在这种情况下,您根本不应该调用 query()。您已经使用绑定参数执行了语句,只需要从中获取行。

【讨论】:

    猜你喜欢
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    相关资源
    最近更新 更多