1

我无法进行以下工作。我想在下面的示例中使用准备好的语句,但出现错误。函数明确地在 $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();
        }
}
4

1 回答 1

1

你不应该在query()之后打电话execute()。相反,你需要fetch()你的行

$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);

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

于 2012-06-07T12:27:49.880 回答