6

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

希望这对其他人有帮助。

于 2020-11-05T16:51:13.760 回答