【发布时间】:2014-11-01 19:21:46
【问题描述】:
我收到错误“未捕获的异常” 警告:数据包乱序。预计 1 收到 166。数据包大小=52" 当一个接一个地运行两个 PDO 查询时。
$dbh = new \PDO('mysql:host=' . $dbHost . ';dbname=' . $dbName, $dbUser, $dbPass, array(
\PDO::MYSQL_ATTR_LOCAL_INFILE => true
));
$sql = <<<eof
LOAD DATA LOCAL INFILE '$csv'
INTO TABLE $table
FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
($columns);
ALTER TABLE $table ADD COLUMN disabled INT DEFAULT 0
eof;
$dbh->query($sql);
$sql = 'SELECT COUNT(id) FROM '.$table.' WHERE myfield IS NULL';
$dbh->query($sql);
我正在尝试做的事情:将大型 CSV 文件(大约 30 MB 和 40k 行)导入数据库后,我想计算一个字段中有多少行是空的,以便在以后的查询中填充它们。
我注意到如果我注释掉第二个查询我可以运行第一个查询,然后如果我注释掉第一个查询我可以运行第二个查询。如果我尝试一个接一个地运行它们,它会失败。我尝试将内存包从 8M 提高到 20M,并设置 $dbh->setAttribute(\PDO::ATTR_EMULATE_PREPARES, true);没有成功。类似的代码更早地适用于较小的数据集。任何指针都非常欢迎!
【问题讨论】:
-
“我想计算一个字段中有多少行是空的,以便在以后的查询中填充它们。” 我怀疑这与您的错误消息有什么关系,但是您不需要知道“一个字段中有多少行是空的”以便以后更新它们。
-
你可能是对的。但是,在这种特定情况下,知道批量循环更新的数量很有用。 (可能有数千个要更新)。
-
您应该使用 WHERE 子句而不是循环来处理它。
-
更改内容时出现错误“一般错误:2014 无法在其他无缓冲查询处于活动状态时执行查询。考虑使用 PDOStatement::fetchAll()。或者,如果您的代码只会运行针对 mysql,您可以通过设置 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 属性来启用查询缓冲。”我认为问题与您必须使用 pdo 获取所有行或下一次访问数据库失败的问题有关