Я попытался использовать 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";