为啥 mysqli::multi_query 在一定数量的行后停止?
Posted
技术标签:
【中文标题】为啥 mysqli::multi_query 在一定数量的行后停止?【英文标题】:Why does mysqli::multi_query stop after a certain amount of rows?为什么 mysqli::multi_query 在一定数量的行后停止? 【发布时间】:2011-06-13 06:31:06 【问题描述】:我正在尝试使用 multi_query 在表上运行大量更新/插入。总共有大约 14,000 个查询,但该函数只执行了大约 480 个,然后它没有错误地停止,php 继续执行下面的脚本:
if($this->db->conn_id->multi_query($sql))
do
// echo $line.' '.mysqli_sqlstate($this->db->conn_id).'<br>';
while($this->db->conn_id->more_results() && $this->db->conn_id->next_result());
$this->message->set('Import complete.','success',TRUE);
else
$this->message->set('Import could not be completed. '.mysqli_error($this->db->conn_id),'error',TRUE);
【问题讨论】:
查询在达到大约 480 行之前运行了多长时间(以秒为单位)? CI 是否将任何错误记录到日志文件中? @Xoc 查询在失败前运行了不到一秒。 【参考方案1】:mysqli::multi_query 仅在第一条语句失败时返回 false。要从集合中的其他查询中获取错误,您需要先调用 mysqli::next_result(),这就是 while() 正在做的事情。
但是,由于 mysqli::next_result() 在失败时返回 false,它将导致循环结束并显示“导入完成”消息。您可能需要在设置成功消息之前检查错误,并且只有当错误为空时,才返回成功。
如果语句后面有错误,以下内容至少应该向您显示错误。
if($this->db->conn_id->multi_query($sql))
do
// echo $line.' '.mysqli_sqlstate($this->db->conn_id).'<br>';
while($this->db->conn_id->more_results() && $this->db->conn_id->next_result());
if ($error = mysqli_error($this->db->conn_id))
$this->message->set('Import could not be completed. ' . $error,'error',TRUE);
else $this->message->set('Import complete.','success',TRUE);
else
$this->message->set('Import could not be completed. '.mysqli_error($this->db->conn_id),'error',TRUE);
【讨论】:
其实查询本身并没有错误。我正在传递一个 sql 文件的内容,它通过命令行或 gui 工具运行良好。以上是关于为啥 mysqli::multi_query 在一定数量的行后停止?的主要内容,如果未能解决你的问题,请参考以下文章