Start · Sprachen · PHP · Referenz · mysql_xdevapi\TableSelect

mysql_xdevapi\TableSelect

Klasse

Repräsentiert eine SELECT-Anweisung auf einer MySQL-Tabelle über die X DevAPI und ermöglicht das Abrufen von Datensätzen mit Filterung, Sortierung und Begrenzung.

seit PHP 7.4.0 Kategorie: db

Signatur

class mysql_xdevapi\TableSelect extends mysql_xdevapi\Executable

Beschreibung

mysql_xdevapi\TableSelect ist Teil der MySQL X DevAPI und stellt eine fluent-interface-basierte SELECT-Anweisung für relationale Tabellen dar. Objekte dieser Klasse werden typischerweise über Table::select() erzeugt und nicht direkt instanziiert. Sie erlauben das Zusammenstellen einer Abfrage durch das Verketten von Methodenaufrufen wie where(), orderby(), limit() und offset(), bevor die Ausführung mit execute() ausgelöst wird.

Im Gegensatz zu klassischen MySQL-Erweiterungen wie mysqli oder PDO arbeitet die X DevAPI über das X Protocol (Port 33060) und bietet eine objektorientierte, ausdrucksstarke API. TableSelect eignet sich insbesondere für Anwendungen, die modernisierte Datenbankinteraktionen nutzen und auf MySQL 8.0+ oder MySQL 5.7 mit aktiviertem X Plugin setzen.

Die Klasse unterstützt das Binden von Parametern über bind(), das Projizieren bestimmter Spalten per select() (beim Erstellen der Abfrage) sowie das Sperren von Zeilen über lockShared() und lockExclusive(). Das Ergebnis wird als mysql_xdevapi\RowResult-Objekt zurückgegeben, das schrittweise oder vollständig ausgelesen werden kann.

Typischer Einsatz ist das Abrufen gefilterter, sortierter und seitenweiser Datenmengen aus MySQL-Tabellen in modernen PHP-Anwendungen, die das MySQL X Protocol verwenden.

Beispiele

Einfache SELECT-Abfrage mit WHERE und ORDER BY

<?php
// Verbindung über X DevAPI herstellen
$session = mysql_xdevapi\getSession('mysqlx://user:password@localhost');
$schema = $session->getSchema('meine_datenbank');
$table  = $schema->getTable('produkte');

// TableSelect-Objekt erstellen und Abfrage aufbauen
$result = $table
    ->select('id', 'name', 'preis')
    ->where('preis > :minPreis AND kategorie = :kat')
    ->bind(['minPreis' => 10.00, 'kat' => 'Elektronik'])
    ->orderby('preis ASC')
    ->limit(10)
    ->execute();

// Ergebnisse verarbeiten
foreach ($result->fetchAll() as $row) {
    echo $row['id'] . ' | ' . $row['name'] . ' | ' . $row['preis'] . PHP_EOL;
}

$session->close();
42 | Smartphone | 299.99 43 | Tablet | 399.00 ...

Paginierte Abfrage mit LIMIT und OFFSET

<?php
$session = mysql_xdevapi\getSession('mysqlx://user:password@localhost');
$schema  = $session->getSchema('shop');
$table   = $schema->getTable('bestellungen');

$seite     = 2;
$proSeite  = 5;

// Seite 2 der Bestellungen abrufen (Datensätze 6–10)
$result = $table
    ->select('bestellnummer', 'kunde', 'gesamtbetrag')
    ->where('status = :status')
    ->bind(['status' => 'abgeschlossen'])
    ->orderby('erstellt_am DESC')
    ->limit($proSeite)
    ->offset(($seite - 1) * $proSeite)
    ->execute();

$rows = $result->fetchAll();
echo 'Gefundene Datensätze: ' . count($rows) . PHP_EOL;
foreach ($rows as $row) {
    printf("#%s | %s | %.2f EUR\n", $row['bestellnummer'], $row['kunde'], $row['gesamtbetrag']);
}

$session->close();
Gefundene Datensätze: 5 #1006 | Müller, Hans | 89.90 EUR #1007 | Schmidt, Anna | 124.50 EUR ...

// Wichtig · Fallstricke

Sicherheit: Verwende stets die bind()-Methode für Benutzereingaben, um SQL-Injection zu vermeiden. Baue Benutzerdaten niemals direkt per String-Konkatenation in den where()-Ausdruck ein.

Voraussetzungen: Die Erweiterung mysql_xdevapi (auch bekannt als mysql-xdevapi) muss über PECL installiert sein (pecl install mysql_xdevapi). Außerdem muss auf dem MySQL-Server das X Plugin aktiv sein (standardmäßig ab MySQL 8.0 der Fall). Die Verbindung erfolgt über Port 33060 mit dem Schema mysqlx://.

Kein direktes Instanziieren: TableSelect-Objekte sollten ausschließlich über Table::select() erzeugt werden, da der Konstruktor nicht für den direkten Aufruf vorgesehen ist.

Rowlocking: Für transaktionale Szenarien stehen lockShared() (entspricht FOR SHARE) und lockExclusive() (entspricht FOR UPDATE) zur Verfügung.