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

クエリがエコーインでエコーアウトされたら、query()それをワークベンチにコピーして実行すると、そこで正常に動作します。エラーはなく、結果が返されます。pdo で、一時テーブルを使用する別のクエリを実行すると、テーブルが存在しません。

なぜ PDO で動作しないのですか?

4

2 に答える 2

0

おそらく、一度に1つのクエリしか準備できないことに関係しています。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 に答える