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