Signatur
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.