Signatur
Beschreibung
mysql_xdevapi\SqlStatement kapselt eine rohe SQL-Anweisung, die über eine X DevAPI-Sitzung ausgeführt werden soll. Instanzen dieser Klasse werden typischerweise durch den Aufruf von Session::sql() erzeugt und repräsentieren eine noch nicht ausgeführte Abfrage.
Die Klasse unterstützt parametrisierte Abfragen mittels Platzhaltern (?). Über die Methode bind() können Parameterwerte gebunden werden, bevor die Anweisung mit execute() tatsächlich auf dem Server ausgeführt wird. Dies ist sowohl für SELECT-Abfragen als auch für DML-Anweisungen (INSERT, UPDATE, DELETE) geeignet.
Das Ergebnis von execute() ist ein mysql_xdevapi\SqlStatementResult-Objekt, das Zugriff auf Ergebniszeilen, betroffene Zeilen, generierte IDs und Warnungen bietet. Diese Klasse gehört zum modernen X-Protokoll-Stack und ist nicht mit der veralteten ext/mysql- oder ext/mysqli-Erweiterung zu verwechseln.
Wichtig: Die mysql_xdevapi-Erweiterung erfordert MySQL Server 5.7.12+ mit aktiviertem X Plugin sowie die PECL-Erweiterung mysql_xdevapi.
Beispiele
Einfache SQL-Abfrage über SqlStatement ausführen
<?php
// Verbindung über X DevAPI herstellen
$session = mysql_xdevapi\getSession('mysqlx://root:password@localhost');
// SqlStatement-Objekt erzeugen
$stmt = $session->sql('SELECT id, name FROM users WHERE active = 1');
// Anweisung ausführen und Ergebnis abrufen
$result = $stmt->execute();
// Zeilen iterieren
while ($row = $result->fetchOne()) {
echo $row['id'] . ': ' . $row['name'] . PHP_EOL;
}
?>
Parametrisierte Abfrage mit bind()
<?php
$session = mysql_xdevapi\getSession('mysqlx://root:password@localhost');
// Platzhalter ? für parametrisierte Abfrage
$stmt = $session->sql('SELECT id, email FROM users WHERE role = ? AND active = ?');
// Parameter binden (verhindert SQL-Injection)
$stmt->bind(['admin', 1]);
$result = $stmt->execute();
foreach ($result->fetchAll() as $row) {
echo $row['id'] . ' => ' . $row['email'] . PHP_EOL;
}
// DML-Beispiel: INSERT mit Parametern
$insertStmt = $session->sql('INSERT INTO logs (message, created_at) VALUES (?, NOW())');
$insertStmt->bind(['Benutzer hat sich angemeldet']);
$insertResult = $insertStmt->execute();
echo 'Eingefügte ID: ' . $insertResult->getAutoIncrementValue() . PHP_EOL;
?>
// Wichtig · Fallstricke
Sicherheit: Verwende immer parametrisierte Abfragen mit bind() und ?-Platzhaltern, anstatt Benutzereingaben direkt in den SQL-String zu interpolieren. Auch wenn die X DevAPI moderner ist als die klassischen MySQL-Erweiterungen, schützt nur das konsequente Binden von Parametern vor SQL-Injection.
Verfügbarkeit: Diese Klasse ist nur verfügbar, wenn die PECL-Erweiterung mysql_xdevapi installiert und aktiviert ist (extension=mysql_xdevapi in der php.ini). Sie ist nicht Bestandteil der PHP-Standarddistribution.
X Protocol: Die Erweiterung kommuniziert über den MySQL X Protocol Port (Standard: 33060), nicht über den klassischen MySQL-Port (3306). Stelle sicher, dass das X Plugin auf dem MySQL-Server aktiviert ist (INSTALL PLUGIN mysqlx SONAME 'mysqlx.so').