Почему 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);
}