Код, указанный в вопросе, попадает в цикл infitie, потому что «если ваш второй или поздний запрос не возвращает результата или даже если ваш запрос не является допустимым запросом SQL, more_results (); в любом случае возвращает true».эта заметка на php.net: http://us3.php.net/manual/en/mysqli.multi-query.php#104076
И еще, mysqli_more_results всегда возвращает true в коде, потому что результаты не отбрасываются, необходимо вызвать mysqli_store_results, чтобы отбрасывать результат после каждого вызова mysqli_next_result.См .: http://us3.php.net/manual/en/mysqli.multi-query.php#91677
Не существует официального способа отловить все ошибки при выполнении текста MySQL (несколько команд, разделенных точкой с запятой) с помощью mysqli_multi_query.Функция mysqli_multi_query остановит выполнение, когда она столкнется с неверной командой SQL, поэтому ее можно отследить только в первой ошибке (независимо от того, где произошла ошибка, в первой команде SQL или любой другой команде SQL в тексте SQL).
Относится к ответу Джона на этот вопрос: Когда mysqli_multi_query останавливает выполнение?
И, как отмечено в http://www.php.net/manual/en/mysqli.multi-query.php#106126 Первая ошибка может быть обнаружена путем сканирования mysqli_next_result coz: $ mysqli-> next_result () вернет false, если в нем нет операторов ИЛИ, если в следующем операторе есть ошибка.
Наконец, ответ заключается в том, что результаты должны быть отброшены после вызова mysqli_next_result с помощью mysqli_store_result:
$mysqli = new mysqli(...);
$sql = file_get_contents("my_sql_file.sql");
$result = $mysqli->multi_query($sql);
if (!$result)
report_error(); //my function
while ($mysqli->more_results()) {
$result = $mysqli->next_result();
//important to make mysqli_more_results false:
$discard = $mysqli->store_result();
if (!$result)
report_error();
}