首页 > 解决方案 > Mysql fetch() 返回 FALSE

问题描述

我目前对来自 mysql 表的流式传输结果有疑问。该表有超过 10,000,000 行。和结构

ID、索引字段1、数据1

使用 ID 上的 Primaryindex 和 IndexField1 上的索引。

在 PHP 中,我绑定到流部分数据(大约 7 Mio)来计算和验证一些部分。出于这个原因,我有一个回调,每个响应都会调用它。

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 Error: (0)”

我是否以错误的方式得到错误原因?服务器或客户端上是否有任何可配置的限制可能会产生此错误?

我正在使用 Mysql 5.17.19 和 PHP 7.0.29。

标签: phpmysqldatabasemysqli

解决方案


$row === FALSE总是会抛出异常,因为在它获取所有行之后,它将$row是错误的。

$stmt->errno将返回 0,因为(引自文档: http: //php.net/manual/en/mysqli.errno.php)返回最后一个 MySQL 函数的错误号,如果没有发生错误,则返回 0(零)。


推荐阅读