【问题标题】:Pdo Mysql : Warning: Packets out of orderPdo Mysql:警告:数据包乱序
【发布时间】: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 获取所有行或下一次访问数据库失败的问题有关

标签: php mysql sql pdo


【解决方案1】:

好吧,实际上在上面的 eof 语句中,我提出了多个查询。在内联加载数据之后,我添加了一些更改表查询。 似乎 pdo 无法在一个 eof 块中处理多个查询。 所以我尝试在自己的请求中分离每个查询,然后它就起作用了。

【讨论】:

  • 我遇到了同样的问题,我在运行 LOAD DATA INFILE 之后创建了许多索引。问题是,当我将它们组合在一个用分号分隔的 PDO 调用中时,与我将它们作为两个单独的调用运行时相比,我获得了 500% 的性能提升。所以我真的不想把这些分开。关于如何进行的任何想法?
【解决方案2】:

您可以在获取所有内容之前添加它:

$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);

【讨论】:

  • 是的,在旧版本的 PHP 中,当不使用“真正的”准备好的语句时。
猜你喜欢
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
  • 2013-01-26
相关资源
最近更新 更多