Signatur
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
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);
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);
// 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.