Start · Sprachen · PHP · Referenz · mysql_unbuffered_query

mysql_unbuffered_query

Funktion

Sendet eine SQL-Anfrage an MySQL, ohne die Ergebniszeilen sofort abzuholen und zu puffern.

seit PHP 4.0.6 Kategorie: db

Signatur

mysql_unbuffered_query(string $query, resource $link_identifier = null): resource|false

Beschreibung

mysql_unbuffered_query() sendet eine SQL-Anfrage an den MySQL-Server, wartet jedoch nicht darauf, dass alle Ergebniszeilen vollständig in den PHP-Speicher geladen werden. Stattdessen werden die Zeilen erst dann vom Server abgerufen, wenn sie tatsächlich mit mysql_fetch_row(), mysql_fetch_assoc() oder ähnlichen Funktionen abgerufen werden.

Dies ist besonders nützlich bei sehr großen Ergebnismengen, da der PHP-Speicherbedarf deutlich gesenkt wird: Es muss nicht die gesamte Ergebnismenge im Speicher gehalten werden. Die Daten können bereits verarbeitet werden, während MySQL noch mit der Ausführung der Abfrage beschäftigt ist.

Ein wesentlicher Nachteil ist, dass Funktionen wie mysql_num_rows() und mysql_data_seek() nicht zuverlässig funktionieren, solange nicht alle Zeilen abgerufen wurden. Außerdem darf auf derselben Verbindung keine weitere Abfrage gesendet werden, bevor alle Ergebniszeilen verarbeitet wurden.

Achtung: Die gesamte mysql_*-Erweiterung ist seit PHP 5.5.0 als veraltet markiert und wurde in PHP 7.0.0 vollständig entfernt. Für neue Projekte sollten stattdessen mysqli (mit MYSQLI_USE_RESULT) oder PDO verwendet werden.

Parameter

Name Typ Default Beschreibung
$query Pflicht string Die SQL-Abfrage, die an den MySQL-Server gesendet werden soll. Die Abfrage darf kein abschließendes Semikolon enthalten.
$link_identifier resource null Die MySQL-Verbindungsressource, die von mysql_connect() zurückgegeben wurde. Wird kein Wert übergeben, wird die zuletzt geöffnete Verbindung verwendet. Ist keine Verbindung offen, wird automatisch eine neue ohne Argumente aufgebaut.

Rückgabewert

Typ
resource|false
Beschreibung
Bei erfolgreichen Abfragen (z. B. SELECT, SHOW, DESCRIBE) wird eine Ergebnis-Ressource zurückgegeben. Bei nicht-datenproduzierenden Abfragen (z. B. INSERT, UPDATE) wird true zurückgegeben. Im Fehlerfall wird false zurückgegeben.

Beispiele

Große Ergebnismenge speicherschonend verarbeiten

<?php
$link = mysql_connect('localhost', 'benutzer', 'passwort');
mysql_select_db('meine_datenbank', $link);

// Ungepufferte Abfrage – Ergebnisse werden nicht sofort in den Speicher geladen
$result = mysql_unbuffered_query('SELECT id, name FROM sehr_grosse_tabelle', $link);

if ($result === false) {
    die('Abfrage fehlgeschlagen: ' . mysql_error($link));
}

// Zeilen einzeln abrufen und verarbeiten
while ($row = mysql_fetch_assoc($result)) {
    echo $row['id'] . ': ' . htmlspecialchars($row['name']) . "\n";
}

mysql_free_result($result);
mysql_close($link);
?>
1: Alice 2: Bob 3: Charlie ...

Vergleich mit gepufferter Abfrage bei INSERT

<?php
$link = mysql_connect('localhost', 'benutzer', 'passwort');
mysql_select_db('meine_datenbank', $link);

// Ungepufferte INSERT-Abfrage
$success = mysql_unbuffered_query(
    "INSERT INTO protokoll (nachricht) VALUES ('Test-Eintrag')",
    $link
);

if ($success) {
    echo 'Eintrag erfolgreich eingefügt. Betroffene Zeilen: ' . mysql_affected_rows($link);
} else {
    echo 'Fehler: ' . mysql_error($link);
}

mysql_close($link);
?>
Eintrag erfolgreich eingefügt. Betroffene Zeilen: 1

// Wichtig · Fallstricke

Veraltete Erweiterung: Die mysql_*-Funktionen sind seit PHP 5.5.0 als veraltet (deprecated) markiert und wurden in PHP 7.0.0 vollständig entfernt. Verwende stattdessen mysqli_query($link, $query, MYSQLI_USE_RESULT) oder PDO mit entsprechender Konfiguration.

Einschränkungen bei ungepufferten Abfragen: Solange nicht alle Zeilen mit Fetch-Funktionen abgerufen wurden, können auf derselben Datenbankverbindung keine weiteren Abfragen ausgeführt werden. Außerdem liefert mysql_num_rows() erst nach dem vollständigen Abruf der Ergebnismenge ein korrektes Ergebnis, und mysql_data_seek() funktioniert bei ungepufferten Abfragen gar nicht.

Ressourcen freigeben: Nach der Verarbeitung sollte mysql_free_result() aufgerufen werden, um die Verbindungsressource vollständig freizugeben und weitere Abfragen zu ermöglichen.

Sicherheit: Benutzereingaben dürfen niemals direkt in die Abfrage eingefügt werden, ohne zuvor mit mysql_real_escape_string() maskiert zu werden, um SQL-Injection zu verhindern. Besser jedoch: auf mysqli mit Prepared Statements umsteigen.