Start · Sprachen · PHP · Referenz · mysql_xdevapi\Statement

mysql_xdevapi\Statement

Klasse

Repräsentiert eine ausführbare X DevAPI-Anweisung und bildet die Basisklasse für alle konkreten Statement-Typen der MySQL X DevAPI.

seit PHP 7.4.0 Kategorie: db

Signatur

class mysql_xdevapi\Statement

Beschreibung

Die Klasse mysql_xdevapi\Statement ist die abstrakte Basisklasse für alle ausführbaren Anweisungsobjekte der MySQL X DevAPI (auch bekannt als mysql_xdevapi). Sie kapselt eine Datenbankoperation, die noch nicht gegen den Server ausgeführt wurde, und ermöglicht das Verketten weiterer Methoden vor dem eigentlichen Ausführen.

Konkrete Unterklassen wie mysql_xdevapi\CollectionFind, mysql_xdevapi\TableSelect oder mysql_xdevapi\CollectionModify erben von Statement. In der Regel arbeitet man nicht direkt mit Statement, sondern erhält Instanzen davon über Methoden wie Collection::find(), Table::select() oder Session::sql().

Das zentrale Entwurfsmuster ist ein Fluent Interface (Method Chaining): Man konfiguriert die Anweisung schrittweise durch Aufrufe wie fields(), where(), sort() oder limit() und führt sie abschließend mit execute() aus. Erst execute() sendet die Anweisung tatsächlich an den MySQL-Server.

Diese Architektur eignet sich besonders für dynamisch zusammengestellte Abfragen, da der Code lesbarer bleibt und die Anweisung vor der Ausführung vollständig konfiguriert werden kann. Die X DevAPI kommuniziert über das X Protocol (Port 33060) und unterstützt sowohl relationale als auch dokumentenbasierte Datenzugriffe.

Beispiele

Einfache Collection-Suche mit Statement-Verkettung

<?php
// Verbindung zur MySQL-Instanz über X DevAPI
$session = mysql_xdevapi\getSession('mysqlx://user:password@localhost/mydb');
$schema = $session->getSchema('mydb');
$collection = $schema->getCollection('users');

// find() gibt ein CollectionFind-Statement-Objekt zurück (Unterklasse von Statement)
$statement = $collection->find('age > :minAge');

// Statement konfigurieren (Method Chaining)
$statement = $statement
    ->bind(['minAge' => 18])
    ->fields(['name', 'age', 'email'])
    ->sort('age ASC')
    ->limit(10);

// Erst execute() führt die Anweisung tatsächlich aus
$result = $statement->execute();

foreach ($result->fetchAll() as $user) {
    echo $user['name'] . ' (' . $user['age'] . ')' . PHP_EOL;
}

$session->close();

SQL-Anweisung über Session::sql()

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

// sql() gibt ein SqlStatement-Objekt zurück – eine Unterklasse von Statement
$statement = $session->sql('SELECT id, name FROM mydb.products WHERE price < ?');

// Platzhalter binden
$statement = $statement->bind([99.99]);

// Anweisung ausführen
$result = $statement->execute();

while ($row = $result->fetchOne()) {
    echo 'Produkt: ' . $row['name'] . ' (ID: ' . $row['id'] . ')' . PHP_EOL;
}

$session->close();

// Wichtig · Fallstricke

Basisklasse, nicht direkt instanziieren: mysql_xdevapi\Statement ist eine abstrakte Basisklasse. Objekte dieser Klasse erhält man ausschließlich über Factory-Methoden wie Collection::find(), Collection::modify(), Table::select(), Session::sql() usw.

X Protocol vs. klassische MySQL-Erweiterung: Die X DevAPI kommuniziert über das X Protocol auf Port 33060, nicht über den klassischen MySQL-Port 3306. Stellen Sie sicher, dass das X Plugin auf dem MySQL-Server aktiviert ist (INSTALL PLUGIN mysqlx SONAME 'mysqlx.so').

Erweiterung muss geladen sein: Die Erweiterung mysql_xdevapi ist nicht standardmäßig aktiviert. Sie muss in der php.ini mit extension=mysql_xdevapi eingebunden werden und setzt die Bibliothek Connector/C++ 8.0 voraus.

Sicherheitshinweis: Verwenden Sie stets parametrisierte Abfragen mit bind(), um SQL-Injection-ähnliche Angriffe zu vermeiden, auch wenn die X DevAPI-Syntax sich von klassischem SQL unterscheidet.