php - 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。
解决方案
$row === FALSE
总是会抛出异常,因为在它获取所有行之后,它将$row
是错误的。
$stmt->errno
将返回 0,因为(引自文档: http: //php.net/manual/en/mysqli.errno.php)返回最后一个 MySQL 函数的错误号,如果没有发生错误,则返回 0(零)。
推荐阅读
- android - 替换 AAR 库中的字符串资源
- android - 我想为带有色度视频的相机创建 Android 应用程序
- oauth-2.0 - 如果我通过 UI 将秘密发送给 BE,我的客户是否被视为公开/机密
- javascript - 如何在 Javascript 中播放相同音频时暂停音频
- java - 从另一个包调用的函数无法访问参数
- sql-server-2012 - 是否可以在此处动态传递值 --> activity('AcitivityName').output.rowsCopied 而不是在 ADF 中硬编码 'Activityname'
- java - 硒有时找不到元素
- apache-spark - pyspark 合并覆盖为一个具有固定名称的文件
- angular - Angular 应用程序中的错误日志记录选项,不依赖于后端框架
- php - 搜索范围重叠