加载数据infile和unbuffered查询错误

时间:2013-07-01 22:15:22

标签: php mysql pdo

我正在尝试从文件中加载表格,并且遇到了困难。下面的代码试图获取一个现有的数据库并将其复制到一个临时表,然后用.csv文件中的导入数据替换原始数据,然后在放开之前我还有更多工作要比较这两个表。临时的。 (如果我以不同的方式做到这一点,欢迎提示)。我收到错误:

  

'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();
    }
?>

2 个答案:

答案 0 :(得分:6)

在尝试了所有推荐的解决方案之后,我发现答案是将PDO::ATTR_EMULATE_PREPARES选项设置为true。

摆脱了“无缓冲查询”错误,但它开始在LOAD查询中报告“LOAD DATA LOCAL INFILE forbidden”错误。

解决方法是将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));

我不明白为什么这些选项是必要的,但它们对我有用。

答案 1 :(得分:-1)

我遇到了完全相同的问题,尝试了上述所有内容,但仍然无法避免“在其他无缓冲查询处于活动状态时无法执行查询”错误。 但是,经过几个小时的搜索后,我开始使用它-而不是使用准备好的语句或只是查询,而是使用'exec'运行'LOAD DATA LOCAL INFILE'语句:

$stmt = $conn->exec($sql_import_csv);

我不需要对PDO选项进行任何上述更改-这是我的选项数组:

$options = array(
  PDO::ATTR_EMULATE_PREPARES => false,
  PDO::MYSQL_ATTR_SSL_CA => "xxxxxxxx.crt.pem",
  PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
  PDO::MYSQL_ATTR_LOCAL_INFILE => true
);

希望这可以帮助其他人。