Строгие стандарты: 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(), чтобы проверить, вызывать ли эту функцию / метод
Я пробовал добавлять и удалять -;
но не повезло.
3 ответа
В то время как pipodesign исправил ошибку в $querystring и облегчил проблему, фактическое решение не было предоставлено в отношении ошибки Strict Standards.
Я не согласен с советом SirBT, переход с DO WHILE на WHILE не обязателен.
Полученное вами сообщение о строгих стандартах довольно информативно. Чтобы повиноваться, используйте это:
do{} while(mysqli_more_results($db) && mysqli_next_result($db));
Тогда вам не нужно писать условный выход или разрыв внутри цикла, потому что условие while будет прерывать цикл при первом появлении ошибки. * примечание: оператор if перед do-while будет запрещать вход в цикл, если в первом запросе есть ошибка.
В вашем примере вы выполняете только запросы INSERT, поэтому вы не получите никаких наборов результатов для обработки. Если вы хотите подсчитать, сколько строк вы добавили, используйте mysqli_acted_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
Синтаксис изобретенного колеса "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
Таким образом, любой фрагмент с учетом следующих запросов даст одинаковый результат:
Массив запросов:
$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())
...do
Цикл должен это исправить. (На заметку: использование циклов после тестирования, как вы сделали, довольно редко встречается в программировании баз данных)
Если код - это поэзия, я пытаюсь быть Шекспиром!
(Написал ответ от имени ОП).
Решено:
$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";