加载文件中的数据和未缓冲的查询错误


load data infile and unbuffered queries error

我正在尝试从文件加载表,但遇到了困难。下面的代码试图获取一个现有的数据库并将其复制到一个临时表中,然后用.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();
    }
?>

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

这消除了"无缓冲查询"错误,但随后开始报告LOAD查询上的"LOAD DATA LOCAL INFILE disabled"错误。

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

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

我遇到了完全相同的问题,尝试了上面提到的一切以及更多,但仍然无法避免"当其他未缓冲的查询处于活动状态时无法执行查询";错误然而,在谷歌上搜索了几个小时后,我开始工作了——我没有使用准备好的语句,也没有只使用查询,而是使用"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
);

希望这能帮助其他人。