6

ファイルからテーブルをロードしようとしていますが、問題があります。以下のコードは、既存のデータベースを取得して一時テーブルにコピーし、元のデータベースを .csv ファイルからインポートしたデータに置き換えようとしています。この 2 つのテーブルを比較する作業は他にもあります。一時的なもの。(これを別の方法で行う必要がある場合は、ヒントを歓迎します)。エラーが発生します:

'SQLSTATE[HY000]: 一般エラー: 2014 他のバッファリングされていないクエリがアクティブな間は、クエリを実行できません。PDOStatement::fetchAll()... の使用を検討してください。

同様の質問からの提案の多くを試しましたが、まだ解決していません。ご協力いただきありがとうございます!これが私のコードです:

<?php
    //database connection
    $data_source = 'mysql:host=localhost;dbname=myDB';
    $db_user = 'root';
    $db_password = 'pass';
    $conn = new PDO($data_source, $db_user, $db_password,
        array(PDO::ATTR_EMULATE_PREPARES => false,
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_PERSISTENT));

    if ( isset($_GET['submit']) ){
        $stmt = $conn->prepare("CREATE TEMPORARY TABLE mfsw_dupe AS SELECT * FROM mfsw_test");
        $stmt->execute();

        $stmt = $conn->prepare("TRUNCATE mfsw_test");
        $stmt->execute();

        $stmt = $conn->prepare("LOAD DATA LOCAL INFILE 'C:\\xampp\htdocs\assets\mfsw_test.csv' INTO TABLE mfsw_test
            FIELDS TERMINATED BY ','
            LINES TERMINATED BY '\n'
            IGNORE 1 LINES");
        $stmt->execute();
    }
?>
4

2 に答える 2

9

この問題に対して推奨されるすべての解決策を試した結果、答えはPDO::ATTR_EMULATE_PREPARESオプションを true に設定することであることがわかりました。

これにより、「バッファリングされていないクエリ」エラーは解消されましたが、LOAD クエリで「LOAD DATA LOCAL INFILE は禁止されています」というエラーが報告され始めました。

PDO::MYSQL_ATTR_USE_BUFFERED_QUERYこれに対する解決策は、オプションも trueに設定することでした。

つまり、最初の接続は次のようになります。

$conn = new PDO($data_source, $db_user, $db_password,
    array(PDO::ATTR_EMULATE_PREPARES => true,
    PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_PERSISTENT));

これらのオプションが必要な理由はわかりませんが、うまくいきました。

于 2013-07-01T23:13:20.120 に答える