Start · Sprachen · PHP · Referenz · mysqli_multi_query

mysqli_multi_query

Funktion

Führt mehrere durch Semikolon getrennte SQL-Abfragen auf einer MySQL-Datenbankverbindung aus.

seit PHP 5.0.0 Kategorie: db

Signatur

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

Beschreibung

mysqli_multi_query() ermöglicht das Ausführen mehrerer SQL-Anweisungen in einem einzigen Funktionsaufruf. Die einzelnen Abfragen werden dabei durch Semikolons (;) voneinander getrennt. Die Funktion initiiert die Ausführung aller übergebenen Abfragen und gibt sofort zurück, sobald die erste Abfrage verarbeitet wurde.

Um die Ergebnisse der einzelnen Abfragen abzurufen, muss anschließend eine Schleife mit mysqli_next_result() durchlaufen werden. Jedes Ergebnis kann über mysqli_store_result() oder mysqli_use_result() abgerufen werden. Mit mysqli_more_results() lässt sich prüfen, ob weitere Ergebnissätze vorhanden sind.

Typische Einsatzgebiete sind das Einspielen von SQL-Dump-Dateien mit mehreren Anweisungen, das Ausführen von gespeicherten Prozeduren, die mehrere Ergebnismengen zurückliefern, oder die Ausführung mehrerer zusammengehöriger Abfragen in einem einzelnen Netzwerk-Roundtrip zur Datenbankverbesserung der Performance.

Achtung: Diese Funktion ist besonders anfällig für SQL-Injection-Angriffe, da Nutzereingaben niemals direkt in den Abfrage-String eingebettet werden dürfen. Da Prepared Statements mit mysqli_multi_query() nicht unterstützt werden, ist äußerste Vorsicht beim Umgang mit dynamischen Werten geboten.

Parameter

Name Typ Default Beschreibung
$mysql Pflicht mysqli Eine aktive MySQL-Verbindungsressource, die mit mysqli_connect() oder new mysqli() erstellt wurde.
$query Pflicht string Ein String mit einer oder mehreren SQL-Anweisungen, die durch Semikolons (;) getrennt sind.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die erste Abfrage erfolgreich ausgeführt wurde, andernfalls false. Fehler in nachfolgenden Abfragen werden erst beim Abrufen der jeweiligen Ergebnisse mit mysqli_next_result() sichtbar.

Beispiele

Mehrere SELECT-Abfragen ausführen und Ergebnisse abrufen

<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');

if ($mysqli->connect_error) {
    die('Verbindungsfehler: ' . $mysqli->connect_error);
}

$sql = "SELECT id, name FROM users LIMIT 3;
        SELECT COUNT(*) AS total FROM orders;
        SELECT id, title FROM products WHERE active = 1 LIMIT 2";

if (mysqli_multi_query($mysqli, $sql)) {
    do {
        if ($result = mysqli_store_result($mysqli)) {
            while ($row = mysqli_fetch_assoc($result)) {
                print_r($row);
            }
            mysqli_free_result($result);
        }
        echo "---\n";
    } while (mysqli_more_results($mysqli) && mysqli_next_result($mysqli));
} else {
    echo 'Fehler: ' . mysqli_error($mysqli);
}

$mysqli->close();
?>
Array ( [id] => 1 [name] => Alice ) Array ( [id] => 2 [name] => Bob ) --- Array ( [total] => 42 ) --- Array ( [id] => 1 [title] => Produkt A ) Array ( [id] => 2 [title] => Produkt B ) ---

INSERT- und UPDATE-Abfragen kombinieren

<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');

if ($mysqli->connect_error) {
    die('Verbindungsfehler: ' . $mysqli->connect_error);
}

$sql = "INSERT INTO logs (message, created_at) VALUES ('Benutzer eingeloggt', NOW());
        UPDATE users SET last_login = NOW() WHERE id = 5;
        DELETE FROM sessions WHERE expires_at &lt; NOW()";

if (mysqli_multi_query($mysqli, $sql)) {
    // Durch alle Ergebnisse iterieren, auch wenn kein SELECT vorhanden ist
    do {
        // Ergebnis verwerfen (kein SELECT)
        if ($result = mysqli_store_result($mysqli)) {
            mysqli_free_result($result);
        }
    } while (mysqli_more_results($mysqli) && mysqli_next_result($mysqli));

    echo 'Alle Abfragen erfolgreich ausgeführt.';
} else {
    echo 'Fehler beim Ausführen: ' . mysqli_error($mysqli);
}

$mysqli->close();
?>
Alle Abfragen erfolgreich ausgeführt.

// Wichtig · Fallstricke

Sicherheitswarnung (SQL-Injection): mysqli_multi_query() unterstützt keine Prepared Statements. Benutzereingaben dürfen niemals direkt in den Abfrage-String eingebettet werden. Verwende mysqli_real_escape_string() oder — besser noch — vermeide dynamische Werte in Multi-Querys vollständig. Ziehe für parametrisierte Abfragen mysqli_prepare() vor.

Ergebnisverarbeitung: Nach dem Aufruf von mysqli_multi_query() muss die Verbindung mit mysqli_next_result() vollständig geleert werden, bevor weitere Abfragen (z. B. via mysqli_query()) auf derselben Verbindung ausgeführt werden können. Andernfalls kommt es zu einem Fehler (Commands out of sync).

Fehlerbehandlung: Ein false-Rückgabewert zeigt nur Fehler der ersten Abfrage an. Fehler in späteren Abfragen werden erst beim Aufruf von mysqli_next_result() sichtbar und müssen separat mit mysqli_error() abgefragt werden.

OOP-Stil: Im objektorientierten Stil steht die Methode als $mysqli->multi_query($sql) zur Verfügung.