Строгие стандарты: 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";
Другие вопросы по тегам