Ich habe versucht, multi_query zu verwenden, aber ich erhalte immer wieder eine strenge Standardmeldung.
$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";
Die Fehlermeldung, die ich bekomme, ist:
Strenge Standards: mysqli_next_result(): Es gibt keine nächste Ergebnismenge. Rufen Sie bitte mysqli_more_results()/mysqli::more_results() auf, um zu prüfen, ob diese Funktion/Methode aufgerufen werden soll
Ich habe versucht, hinzuzufügen und zu entfernen -;
hatte aber kein glück.
Während pipodesign den Fehler in $querystring korrigiert und das Problem gemildert hat, wurde die eigentliche Lösung bezüglich des Fehlers „Strict Standards“ nicht bereitgestellt.
Ich stimme dem Rat von SirBT nicht zu, ein Wechsel von DO WHILE zu WHILE ist nicht erforderlich.
Die Nachricht „Strict Standards“, die Sie erhalten, ist sehr informativ. Verwenden Sie Folgendes, um zu gehorchen:
do{} while(mysqli_more_results($db) && mysqli_next_result($db));
Dann müssen Sie keinen bedingten Ausgang oder Abbruch in die Schleife schreiben, da die While-Bedingung die Schleife beim ersten Auftreten eines Fehlers unterbricht. * Beachten Sie, dass die if-Anweisung vor dem do-while den Eintritt in die Schleife verweigert, wenn die erste Abfrage einen Fehler enthält.
In Ihrem Beispiel führen Sie nur INSERT-Abfragen aus, sodass Sie keine zu verarbeitenden Resultsets erhalten. Wenn Sie zählen möchten, wie viele Zeilen Sie hinzugefügt haben, verwenden Sie mysqli_affected_rows().
Als Komplettlösung für Ihre Frage:
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";
Ausgabe:
// 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
SPÄTE BEARBEITUNG:
Da mysqli-Neulinge über diesen Beitrag stolpern, biete ich ein allgemeines, aber robustes Snippet an, um Abfragen mit/ohne Ergebnismengen mit multi_query() zu verarbeiten, und füge eine Funktion hinzu, um anzuzeigen, welche Abfrage im Array verarbeitet wird …
Klassische „IF(){DO{} WHILE}“-Syntax:
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
Neu erfundenes Rad “WHILE{}”-Syntax (… für diejenigen, die Post-Test-Loops nicht mögen):
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
Daher bieten beide Snippets bei den folgenden Abfragen dieselbe Ausgabe:
Abfragearray:
$queries[]="SELECT * FROM `TEST`";
$queries[]="INSERT INTO `TEST` (Col) VALUES ('string1'),('string2')";
$queries[]="SELECT * FROM `TEST`";
$queries[]="DELETE FROM `TEST` WHERE Col LIKE 'string%'";
Ausgabe:
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
Passen Sie meine Snippets an Ihre Bedürfnisse an. Hinterlasse einen Kommentar, wenn du einen Fehler entdeckst.
Der Grund, warum Sie diese Warnung erhalten, ist einfach, weil Sie a verwenden do
…while
Schleife, die die Bedingung nach dem Ausführen des Befehlsblocks auswertet. Wenn also keine weiteren Ergebnisse vorliegen, wird der Inhalt der Schleife ein weiteres Mal ausgeführt, was zu dieser Warnung führt.
Verwendung einer while ($mysql->next_result())
…do
Schleife sollte dies beheben. (Eine allgemeine Anmerkung: Die Verwendung von Post-Test-Schleifen wie Sie es getan haben, ist in der Datenbankprogrammierung ziemlich ungewöhnlich.)
Wenn Code Poesie ist, versuche ich Shakespeare zu sein!
(Gepostete Antwort im Namen von OP).
Gelöst:
$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";
“Ich habe versucht, hinzuzufügen und zu entfernen” Haben Sie auch versucht, … hhmmmm. idunno Hinzufügen eines Schecks für
mysqli::more_results()
?– PeeHaa
5. Februar 2013 um 20:04 Uhr
Das ist eine ziemlich nutzlose Warnung. Im Grunde fordert es Sie auf, hässlicheren Code zu schreiben. Was steckt hinter dieser Warnung?
– Kalmarius
16. Februar 2014 um 13:42 Uhr