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