Как получить все ошибки после вызова mysqli_multi_query? - PullRequest
0 голосов
/ 23 октября 2011

Я использую этот код:

$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();
  if (!$result)
    report_error();
}

Однако цикл while в приведенном выше коде оказался бесконечным циклом.Что-то не так?

Ответы [ 2 ]

3 голосов
/ 23 октября 2011

На самом деле ваш код не имеет смысла. Правильный способ работы с несколькими запросами следующий (см. php manual )

if ($mysqli->multi_query($query)) {
    do {
        // store first result set 
        if ($result = $mysqli->store_result()) {
            while ($row = $result->fetch_row()) {
                // do something with the row
            }
            $result->free();
        }
        else { error_report(); }
    } while ($mysqli->next_result());
}
else { error_report(); }
2 голосов
/ 23 октября 2011

Код, указанный в вопросе, попадает в цикл 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...