Mysql fetch () возвращает FALSE - PullRequest
0 голосов
/ 13 июня 2018

У меня сейчас проблема с потоковой передачей результатов из таблицы mysql.Эта таблица содержит более 10 000 000 строк.И структура

ID, IndexField1, Data1

С Primaryindex для ID и Index для IndexField1.

В PHP я привязан к потоковым частямДанные (около 7 млн.) для расчета и проверки некоторых частей.По этой причине у меня есть обратный вызов, который вызывается для каждого отдельного ответа.

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 и PHP 7.0.29.

1 Ответ

0 голосов
/ 13 июня 2018

Исключение в $row === FALSE всегда будет выброшено, потому что после извлечения всех строк $row будет ложным.

$stmt->errno вернет 0, поскольку (цитируется по документам: http://php.net/manual/en/mysqli.errno.php) Возвращает номер ошибки из последней функции MySQL или 0 (ноль), если ошибки не было.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...