Start · Sprachen · PHP · Referenz · mysqli_stmt_get_result

mysqli_stmt_get_result

Funktion

Ruft das Ergebnis einer ausgeführten vorbereiteten Anweisung als <code>mysqli_result</code>-Objekt ab, das anschließend wie ein normales Abfrageergebnis verwendet werden kann.

seit PHP 5.3.0 Kategorie: db

Signatur

mysqli_stmt_get_result(mysqli_stmt $statement): mysqli_result|false

Beschreibung

mysqli_stmt_get_result() wandelt das Ergebnis einer ausgeführten mysqli_stmt-Anweisung in ein mysqli_result-Objekt um. Damit können alle üblichen Ergebnisfunktionen wie mysqli_fetch_assoc(), mysqli_fetch_array() oder mysqli_num_rows() direkt auf dem Ergebnis genutzt werden, ohne zunächst Ausgabevariablen über mysqli_stmt_bind_result() definieren zu müssen.

Diese Funktion eignet sich besonders, wenn die Anzahl der zurückgegebenen Spalten nicht im Voraus bekannt ist oder wenn der Code lesbarer sein soll, da er dem gewohnten Workflow mit mysqli_query() ähnelt. Das zurückgegebene mysqli_result-Objekt muss nach der Verwendung mit mysqli_free_result() freigegeben werden, um Arbeitsspeicher zu sparen.

Wichtig: Die Funktion setzt das mysqlnd-Treiber (MySQL Native Driver) voraus. Wenn PHP mit libmysqlclient kompiliert wurde, steht sie nicht zur Verfügung und gibt einen fatalen Fehler aus.

Parameter

Name Typ Default Beschreibung
$statement Pflicht mysqli_stmt Ein gültiges, bereits ausgeführtes mysqli_stmt-Objekt, das mit mysqli_prepare() erstellt und mit mysqli_stmt_execute() ausgeführt wurde.

Rückgabewert

Typ
mysqli_result|false
Beschreibung
Gibt bei Erfolg ein mysqli_result-Objekt zurück, das alle Zeilen des Abfrageergebnisses enthält. Bei einem Fehler (z. B. fehlender mysqlnd-Treiber oder nicht ausgeführte Anweisung) wird false zurückgegeben.

Beispiele

Benutzer per vorbereiteter Anweisung abfragen

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

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

$stmt = $mysqli->prepare('SELECT id, name, email FROM benutzer WHERE aktiv = ?');
$stmt->bind_param('i', $aktiv);
$aktiv = 1;
$stmt->execute();

$result = mysqli_stmt_get_result($stmt);

if ($result === false) {
    die('Fehler beim Abruf des Ergebnisses: ' . $stmt->error);
}

while ($zeile = $result->fetch_assoc()) {
    echo $zeile['id'] . ' – ' . $zeile['name'] . ' (' . $zeile['email'] . ')' . PHP_EOL;
}

$result->free();
$stmt->close();
$mysqli->close();
1 – Max Mustermann (max@example.com) 2 – Erika Musterfrau (erika@example.com)

Anzahl der Ergebniszeilen ermitteln

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

$stmt = $mysqli->prepare('SELECT id, name FROM produkte WHERE kategorie = ?');
$stmt->bind_param('s', $kategorie);
$kategorie = 'Elektronik';
$stmt->execute();

$result = mysqli_stmt_get_result($stmt);

if ($result) {
    echo 'Gefundene Produkte: ' . mysqli_num_rows($result) . PHP_EOL;

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

    mysqli_free_result($result);
}

$stmt->close();
$mysqli->close();
Gefundene Produkte: 3 - Laptop - Smartphone - Tablet

// Wichtig · Fallstricke

Treiberabhängigkeit: mysqli_stmt_get_result() erfordert den mysqlnd-Treiber. Fehlt dieser, führt der Aufruf zu einem fatalen Fehler. Wer libmysqlclient nutzt, muss stattdessen mysqli_stmt_bind_result() zusammen mit mysqli_stmt_fetch() verwenden.

Speicherverwaltung: Das zurückgegebene mysqli_result-Objekt puffert alle Ergebniszeilen im Speicher. Bei sehr großen Ergebnismengen kann dies zu einem hohen Speicherverbrauch führen. Gib das Ergebnis daher stets mit mysqli_free_result() bzw. $result->free() frei.

Alternative: In modernem PHP-Code wird die Verwendung von PDO mit vorbereiteten Anweisungen empfohlen, da PDO keine Treibereinschränkungen hat und eine einheitlichere API bietet.