Php Mysql fetch()返回FALSE

Php Mysql fetch()返回FALSE,php,mysql,database,mysqli,Php,Mysql,Database,Mysqli,我目前在mysql表的流式处理结果方面有一个问题。此表有超过10000000行。以及结构 ID,索引字段1,数据1 ID上有Primaryindex,IndexField1上有索引 在PHP中,我将数据流部分(约700万)绑定到一起,以计算和验证某些部分。由于这个原因,我有一个回调,它被调用的每一个响应 public function streamForIndexedColumn(int $columnId, callable $callback){ $stmt = NULL; $sql = "

我目前在mysql表的流式处理结果方面有一个问题。此表有超过10000000行。以及结构

ID,索引字段1,数据1

ID上有Primaryindex,IndexField1上有索引

在PHP中,我将数据流部分(约700万)绑定到一起,以计算和验证某些部分。由于这个原因,我有一个回调,它被调用的每一个响应

public function streamForIndexedColumn(int $columnId, callable $callback){
$stmt = NULL;
$sql = "SELECT id, indexedField, data1 FROm myTable WHERE indexedField1 = ?;";
if (! ($stmt = $this->mysqlConn->prepare ( $sql ))) {
   throw new Exception("ERROR");
}
try {
    if (! $stmt->bind_param ( "i", $columnId)) {
       throw new Exception( "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error );
    }
    $item = new Item ();
    if (!$stmt->bind_result($item->id,$item->indexfield1,$item->data1)) {
            throw new Exception( "Binding output parameters failed: (" . $stmt->errno . ") " . $stmt->error );
    }

    if (! $stmt->execute ()) {
        throw new Exception("Execute failed: (" . $stmt->errno . ") " . $stmt->error );
    }
    $cnt = 0;
    while ( $row = $stmt->fetch() ) {
        $cnt++;
        $callback($cnt, $item);
    }
    if ($row ===FALSE){
        throw new Exception("MySQL Error: (" . $stmt->errno . ") " . $stmt->error );
    } finally{
        $stmt->close ();
    }
}
有时会运行几个小时。有时它正在运行,有时它失败,并显示消息“MySQL错误:(0)”

我是否以错误的方式获取错误原因?服务器或客户端上是否存在可能产生此错误的任何可配置限制


我使用的是Mysql 5.17.19和PHP7.0.29。

将始终抛出
$row==FALSE
中的异常,因为在它获取所有行之后,
$row
将为FALSE

$stmt->errno
将返回0,因为(引用自文档:)
返回上一个MySQL函数的错误号,如果没有发生错误,则返回0(零)。

作为辅助节点:当它失败时,经过几个小时(因此在处理项目后)while循环将获取所有行,直到
$row
返回false,然后它将退出并点击if检查。if检查是不必要的,所以删除它。mysqli是否有
fetch()
?否:根据文档,如果出现错误,它将返回FALSE。这就是为什么我也检查了类型。如果没有更多数据,则返回NULL。在某些情况下,它并没有失败。因此,我不认为实现是错误的,但我找不到该方法的任何错误处理示例。当我在CLI中运行脚本时,我得到另一个警告:PHP警告:“空行数据包体”我不熟悉mysqli,但我想说,完成后返回
null
。谢谢,Daan,但是Alvaro是对的:从文档来看,如果出现错误,它将返回FALSE。有时(!)它是好的,它返回给我正确的结果,所以我不认为这是一个实现错误。也许对查询有一些限制。但即使是这一次,也会时不时地有所不同。