Строгие стандарты: mysqli_next_result () ошибка с mysqli_multi_query

Я попытался использовать multi_query, но я продолжаю получать строгие сообщения стандартов.

$querystring = "INSERT INTO responses VALUES('1', '2', '3', '4'); INSERT INTO responses VALUES('1', '2', '3', '4')"; if (mysqli_multi_query($db, $querystring)) { do { if ($result = mysqli_store_result($db)) { // } } while (mysqli_next_result($db)); } echo "end"; 

Сообщение об ошибке, которое я получаю:

Строгие стандарты : mysqli_next_result (): Следующий набор результатов не существует. Пожалуйста, вызовите mysqli_more_results () / mysqli :: more_results (), чтобы проверить, следует ли вызывать эту функцию / метод

Я попытался добавить и удалить -; но не повезло.

В то время как pipodesign исправил ошибку в $ querystring и облегчил проблему, фактическое решение не было предоставлено в отношении ошибки строгих стандартов.

Я не согласен с советом SirBT, изменяя его с DO WHILE до WHILE.

Сообщение о строгих стандартах, которое вы получаете, довольно информативно. Чтобы повиноваться, используйте это:

 do{} while(mysqli_more_results($db) && mysqli_next_result($db)); 

Тогда вам не нужно писать условный выход или прерывать внутри цикла, потому что условие while прерывает цикл при первом вхождении ошибки. * Обратите внимание, что оператор if перед do-while будет отрицать запись в цикл, если первый запрос имеет ошибку.

В вашем примере вы выполняете только запросы INSERT, поэтому вы не получите никаких наборов результатов для обработки. Если вы хотите подсчитать, сколько строк вы добавили, используйте mysqli_affected_rows ().

В качестве полного решения для вашего вопроса:

 if(mysqli_multi_query($db,$querystring)){ do{ $cumulative_rows+=mysqli_affected_rows($db); } while(mysqli_more_results($db) && mysqli_next_result($db)); } if($error_mess=mysqli_error($db)){echo "Error: $error_mess";} echo "Cumulative Affected Rows: $cumulative_rows"; 

Вывод:

  // if no errors Cumulative Affected Rows: 2 // if error on second query Error: [something] Cumulative Affected Rows: 1 // if error on first query Error: [something] Cumulative Affected Rows: 0 

ПОСЛЕДНИЙ РЕДАКТ:

Поскольку люди, новые для mysqli, сталкиваются с этим сообщением, я предлагаю общий, но надежный фрагмент для обработки запросов с / без наборов результатов с использованием multi_query () и добавления функции для отображения того, какой запрос в массиве обрабатывается …

Классический "IF () {DO {} WHILE}" Синтаксис :

 if(mysqli_multi_query($mysqli,implode(';',$queries))){ do{ echo "<br><br>",key($queries),": ",current($queries); // display key:value @ pointer if($result=mysqli_store_result($mysqli)){ // if a result set while($rows=mysqli_fetch_assoc($result)){ echo "<br>Col = {$rows["Col"]}"; } mysqli_free_result($result); } echo "<br>Rows = ",mysqli_affected_rows($mysqli); // acts like num_rows on SELECTs } while(next($queries) && mysqli_more_results($mysqli) && mysqli_next_result($mysqli)); } if($mysqli_error=mysqli_error($mysqli)){ echo "<br><br>",key($queries),": ",current($queries),"Syntax Error:<br>$mysqli_error"; // display array pointer key:value } //if you want to use the snippet again... $mysqli_error=null; // clear variables reset($queries); // reset pointer в if(mysqli_multi_query($mysqli,implode(';',$queries))){ do{ echo "<br><br>",key($queries),": ",current($queries); // display key:value @ pointer if($result=mysqli_store_result($mysqli)){ // if a result set while($rows=mysqli_fetch_assoc($result)){ echo "<br>Col = {$rows["Col"]}"; } mysqli_free_result($result); } echo "<br>Rows = ",mysqli_affected_rows($mysqli); // acts like num_rows on SELECTs } while(next($queries) && mysqli_more_results($mysqli) && mysqli_next_result($mysqli)); } if($mysqli_error=mysqli_error($mysqli)){ echo "<br><br>",key($queries),": ",current($queries),"Syntax Error:<br>$mysqli_error"; // display array pointer key:value } //if you want to use the snippet again... $mysqli_error=null; // clear variables reset($queries); // reset pointer 

Reinvented Wheel "WHILE {}" Синтаксис (… для тех, кто не любит посттест-циклы):

 while((isset($multi_query) && (next($queries) && mysqli_more_results($mysqli) && mysqli_next_result($mysqli))) || (!isset($multi_query) && $multi_query=mysqli_multi_query($mysqli,implode(';',$queries)))){ echo "<br><br>",key($queries),": ",current($queries); // display array pointer key:value if($result=mysqli_store_result($mysqli)){ while($rows=mysqli_fetch_assoc($result)){ echo "<br>Col = {$rows["Col"]}"; } mysqli_free_result($result); } echo "<br>Rows = ",mysqli_affected_rows($mysqli); // acts like num_rows on SELECTs } if($mysqli_error=mysqli_error($mysqli)){ echo "<br><br>",key($queries),": ",current($queries),"Syntax Error:<br>$mysqli_error"; // display array pointer key:value } //if you want to use the snippet again... $multi_query=$mysqli_error=null; // clear variables reset($queries); // reset pointer в while((isset($multi_query) && (next($queries) && mysqli_more_results($mysqli) && mysqli_next_result($mysqli))) || (!isset($multi_query) && $multi_query=mysqli_multi_query($mysqli,implode(';',$queries)))){ echo "<br><br>",key($queries),": ",current($queries); // display array pointer key:value if($result=mysqli_store_result($mysqli)){ while($rows=mysqli_fetch_assoc($result)){ echo "<br>Col = {$rows["Col"]}"; } mysqli_free_result($result); } echo "<br>Rows = ",mysqli_affected_rows($mysqli); // acts like num_rows on SELECTs } if($mysqli_error=mysqli_error($mysqli)){ echo "<br><br>",key($queries),": ",current($queries),"Syntax Error:<br>$mysqli_error"; // display array pointer key:value } //if you want to use the snippet again... $multi_query=$mysqli_error=null; // clear variables reset($queries); // reset pointer 

Таким образом, любой фрагмент, заданный по следующим запросам, будет предлагать тот же результат:

Массив запросов:

 $queries[]="SELECT * FROM `TEST`"; $queries[]="INSERT INTO `TEST` (Col) VALUES ('string1'),('string2')"; $queries[]="SELECT * FROM `TEST`"; $queries[]="DELETE FROM `TEST` WHERE Col LIKE 'string%'"; 

Вывод:

 0: SELECT * FROM `TEST` Rows = 0 1: INSERT INTO `TEST` (Col) VALUES ('string1'),('string2') Rows = 2 2: SELECT * FROM `TEST` Col = string1 Col = string2 Rows = 2 3: DELETE FROM `TEST` WHERE Col LIKE 'string%' Rows = 2 

Измените мои фрагменты в соответствии с вашими потребностями. Оставьте комментарий, если вы обнаружите ошибку.

Причина, по которой вы получаете это предупреждение, просто потому, что вы используете цикл do … while, который оценивает условие после запуска блока команд. Поэтому, когда результатов больше нет, содержимое цикла выполняется еще один раз, что дает это предупреждение.

Использование while ($mysql->next_result()) … цикл должен исправить это. (В общем случае: использование циклов после теста, как вы это делали, довольно необычно в программировании базы данных)

Если код – это поэзия, я стараюсь быть Шекспиром!

(Отправленный ответ от имени ОП) .

Решено:

 $querystring = "INSERT INTO responses VALUES('1', '2', '3', '4'); INSERT INTO responses VALUES('1', '2', '3', '4')"; if (mysqli_multi_query($db, $querystring)) { do { if (!mysqli_more_results($db)) { exit(); } } while (mysqli_next_result($db)); } echo "end";