0

我正在使用 PDO 运行查询,但它没有按我的意愿工作。我围绕 pdo 写了一个包装器,这里是主要的查询方法:

<?php
public function query($query, $params = array())
{
    if(!is_array($params))
    {
        throw new Exception("Parameter 2 must be a key => value array.");
    }
    if(!$this->pdo)
    {
        $this->connect();
    }
    echo "
--------------------------------------------------------------------------------

$query

--------------------------------------------------------------------------------    
    ";
    $this->sql = $this->pdo->prepare($query);
    foreach($params as $key => $value)
    {
        $this->sql->bindParam($key, $value);
    }
    $sql = $this->sql->execute();
    if(!$sql)
        throw new Exception('[' . $this->sql->errorCode() . ']: ' . $this->sql->errorInfo());
}

我无法显示整个查询,但这里是其中的一部分:

    $str = "SET @usapev = :usapev;
    SET @canpev = :canpev;
    SET @ven = :ven;
    SET @usa = :isUSA;
    SET @can = :isCAN;

    DROP TEMPORARY TABLE IF EXISTS T_MailingList;
    CREATE TEMPORARY TABLE T_MailingList
    (
        bsg_uk INT NOT NULL PRIMARY KEY,
        demog_id INT NOT NULL,
        procardnbr VARCHAR(12)
    );

    INSERT IGNORE INTO T_MailingList
    SELECT m.bsg_uk
    , m.demog_id
    , m.procardnbr
    FROM FROM bsg.member m;";

然后我像这样运行查询:

<?php
    $this->db->query($str, array(
        "ven"    => $ven,
        "usapev" => $usapev,
        "canpev" => $canpev,
        "isUSA"  => (int)$is_usa,
        "isCAN"  => (int)$is_can
    ));

当查询在 echo in 中回显时,query()我将其复制到工作台并运行它,它在那里工作正常。没有错误,我得到了结果。在 pdo 中,当我运行另一个想要使用临时表的查询时,该表不存在。

为什么它在 PDO 中不起作用?

4

2 回答 2

0

这可能与一次只能准备一个查询有关。以下是 afaik 准备好的语句的工作原理:首先将查询发送到 mysql,然后单独发送参数。由于您向 mysql 发送多个查询,这可能是您的问题的原因。

PS:我会建议您想要实现的存储过程。

于 2013-03-04T17:03:30.703 回答
0

采用

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0);

或用“;”展开查询 并循环运行每个查询

$queries = explode(";", $query);
foreach ($queries as $query) {
    $pdo->query($query, $attrs);
}
于 2013-03-04T17:04:02.543 回答