Strenge Standards: Fehler mysqli_next_result() mit mysqli_multi_query

Lesezeit: 5 Minuten

Strenge Standards Fehler mysqli next result mit mysqli multi query
Phil

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.

  • “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

Strenge Standards Fehler mysqli next result mit mysqli multi query
mickmackusa

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.

1646642648 546 Strenge Standards Fehler mysqli next result mit mysqli multi query
SirBT

Der Grund, warum Sie diese Warnung erhalten, ist einfach, weil Sie a verwenden dowhile 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";

964490cookie-checkStrenge Standards: Fehler mysqli_next_result() mit mysqli_multi_query

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy