Почему mysqli::multi_query останавливается после определенного количества строк?

Я пытаюсь запустить довольно большое количество обновлений / вставок в таблицу, используя multi_query. Всего ~14 000 запросов, но функция выполняет только ~480, затем она останавливается без ошибок, а PHP продолжает выполнение сценария, описанного ниже:

if($this->db->conn_id->multi_query($sql)){
    do{
        // echo $line.' '.mysqli_sqlstate($this->db->conn_id).'<br>';
    }while($this->db->conn_id->more_results() && $this->db->conn_id->next_result());
    $this->message->set('Import complete.','success',TRUE);
}else{
    $this->message->set('Import could not be completed. '.mysqli_error($this->db->conn_id),'error',TRUE);
}

1 ответ

mysqli::multi_query возвращает false только в случае неудачи первого оператора. Чтобы получить ошибки от других запросов в вашем наборе, вам сначала нужно вызвать mysqli::next_result(), что и делает ваш while().

Однако, поскольку mysqli::next_result() возвращает false при сбое, это приведет к завершению цикла и появлению сообщения "Импорт завершен". Возможно, вам нужно проверить наличие ошибки перед установкой сообщения об успешном завершении, и только если ошибка пуста, вернуть сообщение об успехе.

Следующее должно по крайней мере показать вам ошибку, если она была позже в утверждении.

if($this->db->conn_id->multi_query($sql)){
    do{
        // echo $line.' '.mysqli_sqlstate($this->db->conn_id).'<br>';
    } while($this->db->conn_id->more_results() && $this->db->conn_id->next_result());

    if ($error = mysqli_error($this->db->conn_id)) {
        $this->message->set('Import could not be completed. ' . $error,'error',TRUE);
    } else $this->message->set('Import complete.','success',TRUE);
} else {
    $this->message->set('Import could not be completed. '.mysqli_error($this->db->conn_id),'error',TRUE);
}
Другие вопросы по тегам