mysqli::multi_query

mysqli_multi_query

(PHP 5, PHP 7, PHP 8)

mysqli::multi_query -- mysqli_multi_queryFührt eine oder mehrere Abfragen in einer Datenbank durch

Beschreibung

Objektorientierter Stil

publicmysqli::multi_query(string$query): bool

Prozeduraler Stil

mysqli_multi_query(mysqli$mysql, string$query): bool

Führt eine oder mehrere Abfragen aus, die durch Semikolons getrennt sind.

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

Objektorientierter Stil

<?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";


$mysqli->multi_query($query);
do {

if ($result = $mysqli->store_result()) {
while (
$row = $result->fetch_row()) {
printf("%s\n", $row[0]);
}
}

if ($mysqli->more_results()) {
printf("-----------------\n");
}
} while (
$mysqli->next_result());

Prozeduraler Stil

<?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";


mysqli_multi_query($link, $query);
do {

if ($result = mysqli_store_result($link)) {
while (
$row = mysqli_fetch_row($result)) {
printf("%s\n", $row[0]);
}
}

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

Siehe auch

To Top