Start · Sprachen · PHP · Referenz · cubrid_unbuffered_query

cubrid_unbuffered_query

Funktion

Führt eine SQL-Abfrage gegen eine CUBRID-Datenbank aus, ohne das Ergebnis vollständig in den Speicher zu puffern.

seit PHP 5.0.0 Kategorie: db

Signatur

cubrid_unbuffered_query(string $query, resource $conn_identifier = null): resource|false

Beschreibung

cubrid_unbuffered_query() sendet eine SQL-Abfrage an den CUBRID-Datenbankserver und gibt sofort einen Ergebnis-Handle zurück, ohne alle Zeilen vorab in den PHP-Speicher zu laden. Dies ist besonders bei großen Ergebnismengen nützlich, da der Speicherbedarf deutlich reduziert wird: Zeilen werden erst dann vom Server abgerufen, wenn sie tatsächlich gelesen werden.

Im Gegensatz zur gepufferten Variante cubrid_query() können bei ungepufferten Abfragen keine Funktionen verwendet werden, die die Gesamtanzahl der Zeilen benötigen (z. B. cubrid_num_rows()), bis alle Zeilen abgerufen wurden. Außerdem muss das Ergebnis vollständig durchiteriert oder mit cubrid_free_result() freigegeben werden, bevor eine neue Abfrage auf derselben Verbindung ausgeführt werden kann.

Die Funktion eignet sich ideal für SELECT-Abfragen, die sehr viele Datensätze zurückliefern, und für Szenarien, in denen der verfügbare PHP-Arbeitsspeicher begrenzt ist. Für INSERT-, UPDATE- oder DELETE-Abfragen bietet die ungepufferte Variante keinen wesentlichen Vorteil.

Parameter

Name Typ Default Beschreibung
$query Pflicht string Die auszuführende SQL-Abfrage als Zeichenkette. Typischerweise eine SELECT-Anweisung.
$conn_identifier resource null Die CUBRID-Verbindungskennung, die von cubrid_connect() oder cubrid_connect_with_url() zurückgegeben wurde. Wird dieser Parameter weggelassen, wird die zuletzt geöffnete Verbindung verwendet.

Rückgabewert

Typ
resource|false
Beschreibung
Bei Erfolg ein CUBRID-Ergebnis-Handle (resource), das mit den üblichen Fetch-Funktionen wie cubrid_fetch() oder cubrid_fetch_assoc() verarbeitet werden kann. Im Fehlerfall wird false zurückgegeben.

Beispiele

Große Ergebnismenge speicherschonend verarbeiten

<?php
$conn = cubrid_connect('localhost', 33000, 'demodb', 'dba', '');
if (!$conn) {
    die('Verbindung fehlgeschlagen: ' . cubrid_error());
}

$result = cubrid_unbuffered_query('SELECT id, name, email FROM users ORDER BY id', $conn);
if ($result === false) {
    die('Abfrage fehlgeschlagen: ' . cubrid_error($conn));
}

while ($row = cubrid_fetch_assoc($result)) {
    echo $row['id'] . ' - ' . $row['name'] . ' (' . $row['email'] . ')' . PHP_EOL;
}

cubrid_free_result($result);
cubrid_disconnect($conn);
1 - Alice (alice@example.com) 2 - Bob (bob@example.com) ...

Ungepufferte Abfrage mit Fehlerbehandlung und Zeilenverarbeitung

<?php
$conn = cubrid_connect('localhost', 33000, 'demodb', 'dba', '');

$sql = "SELECT product_id, product_name, price FROM products WHERE price > 100";
$result = cubrid_unbuffered_query($sql, $conn);

if (!$result) {
    echo 'Fehler: ' . cubrid_error($conn);
    cubrid_disconnect($conn);
    exit;
}

$count = 0;
while ($row = cubrid_fetch_row($result)) {
    // Zeile direkt verarbeiten, ohne alle im Speicher zu halten
    printf("Produkt #%d: %s — %.2f EUR\n", $row[0], $row[1], $row[2]);
    $count++;
}

echo "Insgesamt verarbeitet: $count Zeilen\n";

cubrid_free_result($result);
cubrid_disconnect($conn);
Produkt #5: Widget A — 149.99 EUR Produkt #12: Gadget B — 299.00 EUR ... Insgesamt verarbeitet: 42 Zeilen

// Wichtig · Fallstricke

Wichtige Einschränkungen: Funktionen wie cubrid_num_rows() liefern bei ungepufferten Ergebnissen möglicherweise keine korrekten Werte, solange nicht alle Zeilen abgerufen wurden. Plane daher keine Logik ein, die auf der Gesamtzeilenzahl vor dem vollständigen Durchlaufen basiert.

Verbindungssperre: Solange ein ungepuffertes Ergebnis nicht vollständig gelesen oder mit cubrid_free_result() freigegeben wurde, kann auf derselben Verbindung keine weitere Abfrage ausgeführt werden. Bei Bedarf an parallelen Abfragen sollte eine separate Verbindung geöffnet werden.

Sicherheit: SQL-Injection vermeiden — Benutzereingaben niemals direkt in die Abfragezeichenkette einbauen. Stattdessen vorbereitete Anweisungen über cubrid_prepare() verwenden.