mysqli::multi_query
mysqli_multi_query
(PHP 5, PHP 7, PHP 8)
mysqli::multi_query -- mysqli_multi_query — Führt eine oder mehrere Abfragen in einer Datenbank durch
Beschreibung
Objektorientierter Stil
Warnung
Sicherheitswarnung: SQL-Injection
Wenn die Abfrage
irgendwelche Eingabevariablen enthält, sollten stattdessen
parametrisierte Prepared Statements
verwendet werden. Alternativ dazu müssen die Daten korrekt formatiert sein und
alle Strings müssen mit der Funktion
mysqli_real_escape_string() maskiert werden.
Die Abfragen werden dabei asynchron in einem einzigen Aufruf an die
Datenbank gesendet, aber die Datenbank verarbeitet sie sequentiell.
mysqli_multi_query() wartet, bis die erste Abfrage
abgeschlossen ist, bevor es die Kontrolle an PHP zurückgibt. Der
MySQL-Server verarbeitet dann der Reihe nach die nächsten Abfragen. Sobald
das nächste Ergebnis vorliegt, wartet MySQL darauf, dass die Funktion
mysqli_next_result() von PHP erneut ausgeführt wird.
Es wird empfohlen, eine
do-while-Schleife zu
verwenden, um mehrere Abfragen zu verarbeiten. Die Verbindung ist so lange
belegt, bis alle Abfragen abgeschlossen sind und ihre Ergebnisse an PHP
übermittelt wurden. Solange nicht alle Abfragen abgearbeitet sind, kann
keine andere Anweisung auf derselben Verbindung ausgeführt werden. Um mit
der nächsten Abfrage in der Reihenfolge fortzufahren, muss
mysqli_next_result() verwendet werden. Wenn das nächste
Ergebnis noch nicht bereit ist, wartet mysqli auf die Antwort des
MySQL-Servers. Um zu prüfen, ob es weitere Ergebnisse gibt, kann
mysqli_more_results() verwendet werden.
Bei Abfragen, die eine Ergebnismenge zurückgeben, also zum Beispiel
SELECT, SHOW, DESCRIBE
oder EXPLAIN
,
können die Funktionen mysqli_use_result() oder
mysqli_store_result() verwendet werden, um die
Ergebnismenge abzurufen. Bei Abfragen, die keine Ergebnismenge zurückgeben,
können die gleichen Funktionen verwendet werden, um Informationen wie die
Anzahl der betroffenen Zeilen abzurufen.
Tipp
Wenn CALL
-Anweisungen für gespeicherte Prozeduren
ausgeführt werden, können mehrere Ergebnismengen erzeugt werden. Wenn die
gespeicherte Prozedur SELECT
-Anweisungen enthält,
werden die Ergebnismengen in der Reihenfolge zurückgegeben, in der sie bei
der Ausführung der Prozedur erzeugt werden. Im Allgemeinen kann der
Aufrufende nicht wissen, wie viele Ergebnismengen eine Prozedur
zurückgeben wird, und muss damit rechnen, mehrere Ergebnisse abrufen zu
müssen. Das letzte Ergebnis der Prozedur ist ein Statusergebnis, das keine
Ergebnismenge enthält. Der Status gibt an, ob die Prozedur erfolgreich war
oder ein Fehler aufgetreten ist.
Parameter-Liste
-
mysql
-
Nur bei prozeduralem Aufruf: ein von
mysqli_connect() oder mysqli_init()
zurückgegebenes mysqli-Objekt.
-
query
-
Eine Zeichenkette mit den Abfragen, die ausgeführt werden sollen.
Mehrere Abfragen müssen durch ein Semikolon getrennt werden.
Rückgabewerte
Wenn die erste Anweisung fehlgeschlagen ist, wird false
zurückgegeben. Um
nachfolgende Fehler von anderen Anweisungen zu erhalten, muss zuerst die
Funktion mysqli_next_result() aufgerufen werden.
Fehler/Exceptions
If mysqli error reporting is enabled (MYSQLI_REPORT_ERROR
) and the requested operation fails,
a warning is generated. If, in addition, the mode is set to MYSQLI_REPORT_STRICT
,
a mysqli_sql_exception is thrown instead.
Beispiele
Beispiel #1 mysqli::multi_query()-Beispiel
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$query = "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";
/* Mehrfachabfrage ausführen */
$mysqli->multi_query($query);
do {
/* Ergebnismenge in PHP speichern */
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_row()) {
printf("%s\n", $row[0]);
}
}
/* Trennlinie ausgeben */
if ($mysqli->more_results()) {
printf("-----------------\n");
}
} while ($mysqli->next_result());
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
$query = "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";
/* Mehrfachabfrage ausführen */
mysqli_multi_query($link, $query);
do {
/* Ergebnismenge in PHP speichern */
if ($result = mysqli_store_result($link)) {
while ($row = mysqli_fetch_row($result)) {
printf("%s\n", $row[0]);
}
}
/* Trennlinie ausgeben */
if (mysqli_more_results($link)) {
printf("-----------------\n");
}
} while (mysqli_next_result($link));
Oben gezeigte Beispiele erzeugen
eine ähnliche Ausgabe wie:
my_user@localhost
-----------------
Amersfoort
Maastricht
Dordrecht
Leiden
Haarlemmermeer