multi_query
Erfahren Sie mehr über die Funktion mysqli_multi_query() in PHP, mit der mehrere SQL-Abfragen in einem einzigen Aufruf ausgeführt werden können.
In diesem Artikel befassen wir uns mit der Funktion mysqli_multi_query() in PHP, die eine oder mehrere SQL-Anweisungen in einem einzigen Aufruf ausführt. Wir behandeln ihre Syntax, Parameter und den Rückgabewert, gehen ein ausführbares Beispiel durch und erklären, wie mehrere Ergebnismengen sicher ausgelesen werden können.
Was ist mysqli_multi_query()?
mysqli_multi_query() ist eine eingebaute PHP-Funktion, die eine oder mehrere SQL-Anweisungen, durch Semikolons getrennt, in einem einzigen Roundtrip an den MySQL-Server sendet. Sie ist Teil der MySQLi-Erweiterung, der verbesserten Schnittstelle von PHP zur Kommunikation mit MySQL.
Sie ist nützlich, wenn Sie einen Stapel von Anweisungen auf einmal ausführen möchten — zum Beispiel beim Befüllen mehrerer Tabellen beim Setup oder beim Ausführen einer gespeicherten Prozedur, die mehrere Ergebnismengen zurückgibt. Da jede Anweisung auf dem Server weiterhin unabhängig ausgeführt wird, ist mysqli_multi_query() kein Ersatz für eine Transaktion, wenn Sie Alles-oder-nichts-Verhalten benötigen (siehe Wann Sie es nicht verwenden sollten).
Syntax
Die Funktion funktioniert sowohl im prozeduralen als auch im objektorientierten Stil:
// Procedural style
mysqli_multi_query(mysqli $mysqli, string $query): bool
// Object-oriented style
$mysqli->multi_query(string $query): boolParameter
| Parameter | Beschreibung |
|---|---|
$mysqli | Eine gültige Verbindung, die von mysqli_connect() zurückgegeben wird. |
$query | Ein String mit einer oder mehreren SQL-Anweisungen, getrennt durch ein Semikolon (;). |
Rückgabewert
Die Funktion gibt false zurück, wenn die erste Anweisung fehlschlägt, andernfalls true. Ein Rückgabewert von true bedeutet nur, dass die erste Abfrage akzeptiert wurde — Sie müssen die Ergebnisse durchlaufen, um Fehler in späteren Anweisungen zu erkennen.
Verwendung von mysqli_multi_query()
Rufen Sie die Funktion mit einer gültigen MySQLi-Verbindung und einem String von durch Semikolons getrennten Anweisungen auf, und durchlaufen Sie dann die Ergebnismengen. Hier ist ein vollständiges Beispiel:
<?php
$mysqli = mysqli_connect("localhost", "username", "password", "database");
if (!$mysqli) {
die("Connection failed: " . mysqli_connect_error());
}
$query = "INSERT INTO table1 VALUES ('value1', 'value2', 'value3');";
$query .= "UPDATE table2 SET column1 = 'newvalue' WHERE id = 1;";
if (mysqli_multi_query($mysqli, $query)) {
do {
if ($result = mysqli_store_result($mysqli)) {
while ($row = mysqli_fetch_row($result)) {
print_r($row);
}
mysqli_free_result($result);
}
} while (mysqli_next_result($mysqli));
} else {
echo "Error: " . mysqli_error($mysqli);
}
mysqli_close($mysqli);
?>Was jeder Teil bewirkt:
mysqli_connect()öffnet eine Verbindung zur MySQL-Datenbank; wir brechen frühzeitig ab, wenn sie fehlschlägt.- Wir erstellen einen einzelnen String mit zwei durch Semikolons getrennten Anweisungen.
mysqli_multi_query()sendet beide Anweisungen in einem Aufruf an den Server.- Die
do...while-Schleife liest jede Ergebnismenge der Reihe nach.mysqli_store_result()puffert das aktuelle Ergebnis,mysqli_fetch_row()liest seine Zeilen, undmysqli_next_result()wechselt zur nächsten Ergebnismenge. mysqli_close()gibt die Verbindung frei.
Umgang mit mehreren Ergebnismengen
Dies ist der Teil, den Entwickler am häufigsten falsch machen. Nach einem erfolgreichen mysqli_multi_query() müssen Sie jede Ergebnismenge verarbeiten — auch die leeren, die von INSERT oder UPDATE erzeugt werden — bevor Sie eine weitere Abfrage auf derselben Verbindung ausführen können. Das Überspringen dieses Schritts löst einen "Commands out of sync"-Fehler aus.
Das sichere Muster lautet:
<?php
do {
// Buffer the current result set, if any.
if ($result = mysqli_store_result($mysqli)) {
while ($row = mysqli_fetch_row($result)) {
print_r($row);
}
mysqli_free_result($result);
}
// mysqli_more_results() avoids a spurious warning on the last loop.
} while (mysqli_more_results($mysqli) && mysqli_next_result($mysqli));
?>mysqli_next_result() gibt false zurück, wenn keine weiteren Ergebnisse vorhanden sind, wodurch die Schleife beendet wird. Die vorherige Prüfung mit mysqli_more_results() verhindert, dass nach der letzten Anweisung eine Warnung ausgegeben wird.
Wann Sie es nicht verwenden sollten
mysqli_multi_query() ist leistungsstark, aber leicht zu missbrauchen:
- Übergeben Sie niemals Benutzereingaben direkt in den Query-String. Das Verketten von nicht vertrauenswürdigen Daten ist hier ein klassischer SQL-Injection-Angriffsvektor, und diese Funktion kann keine gebundenen Parameter verwenden. Für alles, was Benutzereingaben betrifft, führen Sie jede Anweisung separat mit Prepared Statements aus — siehe
mysqli_prepare(). - Sie ist nicht atomar. Wenn die zweite Anweisung fehlschlägt, wurde die erste bereits übertragen. Wenn mehrere Anweisungen gemeinsam erfolgreich sein oder fehlschlagen müssen, umschließen Sie einzelne Abfragen in einer Transaktion mit
mysqli_begin_transaction(),mysqli_commit()undmysqli_rollback(). - Überprüfen Sie immer den Rückgabewert und iterieren Sie die Ergebnisse, um Fehler in Anweisungen nach der ersten zu erkennen.
Fazit
Die Funktion mysqli_multi_query() ermöglicht es Ihnen, mehrere SQL-Anweisungen in einem einzigen Aufruf auszuführen, was für Stapeloperationen praktisch ist. Der Schlüssel zur korrekten Verwendung liegt darin, jede Ergebnismenge mit mysqli_next_result() zu verarbeiten, um "Commands out of sync"-Fehler zu vermeiden, und auf Prepared Statements und Transaktionen zurückzugreifen, wenn Benutzereingaben oder Atomarität im Spiel sind.