Mysql fetch()返回FALSE

时间:2018-06-13 13:27:40

标签: php mysql database mysqli

我目前在mysql表的流式传输结果方面存在问题。该表有超过10,000,000行。和结构<​​/ p>

  

ID,IndexField1,Data1

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

在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。

1 个答案:

答案 0 :(得分:0)

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

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