Start · Sprachen · PHP · Referenz · mysql_xdevapi\SqlStatementResult

mysql_xdevapi\SqlStatementResult

Klasse

Repräsentiert das Ergebnis einer über die X DevAPI ausgeführten SQL-Anweisung und bietet Zugriff auf zurückgegebene Zeilen, Metadaten und Ausführungsstatistiken.

seit PHP 7.4.0 Kategorie: db

Signatur

class mysql_xdevapi\SqlStatementResult

Beschreibung

mysql_xdevapi\SqlStatementResult ist das Ergebnis-Objekt, das nach der Ausführung einer SQL-Anweisung über die mysql_xdevapi-Erweiterung zurückgegeben wird. Es ermöglicht den Zugriff auf alle Ergebniszeilen einer SELECT-Abfrage sowie auf Statusangaben wie die Anzahl betroffener Zeilen (affected rows) oder den zuletzt eingefügten Primärschlüssel.

Die Klasse implementiert das Interface mysql_xdevapi\BaseResult und bietet damit einheitliche Methoden zum Durchlaufen von Ergebnismengen. Für SQL-Anweisungen, die mehrere Ergebnismengen liefern (z. B. gespeicherte Prozeduren mit mehreren SELECT-Anweisungen), kann mit nextResult() zur nächsten Ergebnismenge gewechselt werden.

Typischerweise wird dieses Objekt nicht direkt instanziiert, sondern als Rückgabewert von mysql_xdevapi\SqlStatement::execute() erhalten. Es eignet sich besonders für Anwendungsfälle, bei denen rohe SQL-Anweisungen statt des Document-Store-APIs benötigt werden, etwa bei komplexen JOIN-Abfragen oder datenbankspezifischen Operationen.

  • fetchOne() – Gibt die nächste Zeile als Array zurück.
  • fetchAll() – Gibt alle verbleibenden Zeilen zurück.
  • getAffectedItemsCount() – Anzahl betroffener Zeilen bei DML-Operationen.
  • getLastInsertId() – Zuletzt generierter Auto-Increment-Wert.
  • nextResult() – Wechselt zur nächsten Ergebnismenge.

Beispiele

SELECT-Abfrage ausführen und Zeilen abrufen

<?php
$session = mysql_xdevapi\getSession('mysqlx://user:password@localhost');

// Rohe SQL-Anweisung ausführen
$statement = $session->sql('SELECT id, name, email FROM users WHERE active = 1 LIMIT 5');

/** @var mysql_xdevapi\SqlStatementResult $result */
$result = $statement->execute();

// Alle Zeilen auf einmal abrufen
$rows = $result->fetchAll();

foreach ($rows as $row) {
    echo 'ID: ' . $row['id'] . ' | Name: ' . $row['name'] . ' | E-Mail: ' . $row['email'] . PHP_EOL;
}

$session->close();
ID: 1 | Name: Alice | E-Mail: alice@example.com ID: 2 | Name: Bob | E-Mail: bob@example.com

INSERT ausführen und betroffene Zeilen sowie letzte ID abfragen

<?php
$session = mysql_xdevapi\getSession('mysqlx://user:password@localhost');

$result = $session->sql(
    "INSERT INTO users (name, email, active) VALUES ('Charlie', 'charlie@example.com', 1)"
)->execute();

// Anzahl der eingefügten Zeilen
$affected = $result->getAffectedItemsCount();
echo 'Betroffene Zeilen: ' . $affected . PHP_EOL;

// Zuletzt generierter Auto-Increment-Primärschlüssel
$lastId = $result->getLastInsertId();
echo 'Neue ID: ' . $lastId . PHP_EOL;

$session->close();
Betroffene Zeilen: 1 Neue ID: 3

Mehrere Ergebnismengen mit nextResult() verarbeiten

<?php
$session = mysql_xdevapi\getSession('mysqlx://user:password@localhost');

// Gespeicherte Prozedur, die zwei SELECT-Ergebnisse liefert
$result = $session->sql('CALL get_users_and_orders()')->execute();

do {
    $rows = $result->fetchAll();
    foreach ($rows as $row) {
        print_r($row);
    }
    echo '--- Nächste Ergebnismenge ---' . PHP_EOL;
} while ($result->nextResult());

$session->close();

// Wichtig · Fallstricke

Sicherheitshinweis: Bei der Verwendung von $session->sql() mit Benutzereingaben besteht ein erhöhtes SQL-Injection-Risiko. Nutze grundsätzlich parametrisierte Anweisungen über mysql_xdevapi\SqlStatement::bind(), anstatt Eingaben direkt in den SQL-String zu konkatenieren.

Verfügbarkeit: Die mysql_xdevapi-Erweiterung ist nicht im Standard-PHP-Paket enthalten und muss separat über PECL installiert werden (pecl install mysql_xdevapi). Sie setzt einen MySQL-Server mit aktiviertem X Plugin (Port 33060) voraus.

Ergebniszeiger: fetchOne() und fetchAll() bewegen den internen Zeiger vorwärts. Nach einem fetchAll()-Aufruf liefert ein weiterer Abruf eine leere Ergebnismenge. Ein Zurücksetzen des Zeigers ist nicht möglich.