Start · Sprachen · PHP · Referenz · mysqli_real_query

mysqli_real_query

Funktion

Führt eine SQL-Abfrage auf einer MySQLi-Verbindung aus, ohne das Ergebnis automatisch abzurufen.

seit PHP 5.0.0 Kategorie: db

Signatur

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

Beschreibung

mysqli_real_query() sendet eine SQL-Abfrage an den MySQL-Server, holt das Ergebnis jedoch nicht automatisch ab. Es ist die prozedurale Entsprechung zu mysqli::real_query() und bildet die Grundlage für Funktionen wie mysqli_store_result() und mysqli_use_result(), mit denen das Ergebnis anschließend verarbeitet wird.

Im Gegensatz zu mysqli_query() übernimmt mysqli_real_query() selbst kein Ergebnis-Buffering. Das macht sie besonders nützlich, wenn man die Kontrolle darüber haben möchte, ob das Ergebnis komplett in den Speicher geladen (mysqli_store_result()) oder zeilenweise vom Server gestreamt werden soll (mysqli_use_result()).

Typischerweise wird diese Funktion verwendet, wenn man mehrere Abfragen nacheinander ausführen oder sehr große Ergebnismengen speichereffizient verarbeiten möchte. Für einfache Anwendungsfälle ist mysqli_query() meist die bessere Wahl, da sie das Ergebnis direkt zurückgibt.

Die Funktion gibt nur an, ob die Abfrage erfolgreich an den Server gesendet und dort ausgeführt wurde – nicht ob Ergebniszeilen vorhanden sind. Für SELECT-ähnliche Abfragen muss danach explizit mysqli_store_result() oder mysqli_use_result() aufgerufen werden.

Parameter

Name Typ Default Beschreibung
$mysql Pflicht mysqli Eine aktive MySQLi-Verbindungsressource, wie sie von mysqli_connect() oder mysqli_init() zurückgegeben wird.
$query Pflicht string Die auszuführende SQL-Abfrage als Zeichenkette. Die Abfrage darf kein abschließendes Semikolon enthalten. Mehrere Anweisungen in einer Abfrage werden nicht unterstützt.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Abfrage erfolgreich ausgeführt wurde, andernfalls false. Bei SELECT-Abfragen bedeutet true lediglich, dass die Abfrage gesendet wurde – das Ergebnis muss anschließend mit mysqli_store_result() oder mysqli_use_result() abgerufen werden.

Beispiele

Abfrage ausführen und Ergebnis mit mysqli_store_result() abrufen

<?php
$mysqli = mysqli_connect('localhost', 'benutzer', 'passwort', 'testdb');

if (!$mysqli) {
    die('Verbindungsfehler: ' . mysqli_connect_error());
}

// Abfrage senden, ohne Ergebnis direkt abzurufen
if (mysqli_real_query($mysqli, 'SELECT id, name FROM benutzer LIMIT 5')) {
    // Ergebnis komplett in den Speicher laden
    $result = mysqli_store_result($mysqli);

    if ($result) {
        while ($row = mysqli_fetch_assoc($result)) {
            echo 'ID: ' . $row['id'] . ' | Name: ' . $row['name'] . PHP_EOL;
        }
        mysqli_free_result($result);
    }
} else {
    echo 'Abfragefehler: ' . mysqli_error($mysqli);
}

mysqli_close($mysqli);
ID: 1 | Name: Alice ID: 2 | Name: Bob ID: 3 | Name: Carol ID: 4 | Name: Dave ID: 5 | Name: Eve

Speichereffizientes Streaming großer Ergebnismengen mit mysqli_use_result()

<?php
$mysqli = mysqli_connect('localhost', 'benutzer', 'passwort', 'testdb');

if (!$mysqli) {
    die('Verbindungsfehler: ' . mysqli_connect_error());
}

// Abfrage mit potenziell sehr großem Ergebnis
if (mysqli_real_query($mysqli, 'SELECT id, email FROM newsletter_abonnenten')) {
    // Ergebnis zeilenweise vom Server lesen (kein Vollbuffering)
    $result = mysqli_use_result($mysqli);

    if ($result) {
        $count = 0;
        while ($row = mysqli_fetch_assoc($result)) {
            // Jede Zeile direkt verarbeiten, z. B. E-Mail senden
            echo 'Verarbeite: ' . $row['email'] . PHP_EOL;
            $count++;
        }
        echo 'Gesamt: ' . $count . ' Abonnenten verarbeitet.' . PHP_EOL;
        mysqli_free_result($result);
    }
} else {
    echo 'Fehler: ' . mysqli_error($mysqli);
}

mysqli_close($mysqli);
Verarbeite: alice@example.com Verarbeite: bob@example.com ... Gesamt: 12500 Abonnenten verarbeitet.

// Wichtig · Fallstricke

Sicherheit: mysqli_real_query() führt keine automatische Maskierung von Benutzereingaben durch. Werden externe Daten in die Abfrage eingefügt, besteht ein hohes SQL-Injection-Risiko. Für parametrisierte Abfragen sollte stattdessen mysqli_prepare() in Kombination mit mysqli_bind_param() verwendet werden.

Ergebnis nicht vergessen: Wird nach einer SELECT-Abfrage weder mysqli_store_result() noch mysqli_use_result() aufgerufen, kann die Verbindung in einen inkonsistenten Zustand geraten und nachfolgende Abfragen schlagen fehl. Immer das Ergebnis abrufen und mit mysqli_free_result() freigeben.

Mehrere Abfragen: Für mehrere Abfragen in einem Aufruf steht mysqli_multi_query() zur Verfügung. mysqli_real_query() unterstützt nur eine einzelne SQL-Anweisung pro Aufruf.