Signatur
Beschreibung
CollectionFind ist Teil der mysql_xdevapi-Erweiterung und wird durch den Aufruf von Collection::find() erzeugt. Sie repräsentiert eine noch nicht ausgeführte Suchanfrage auf einer Collection (NoSQL-Dokumentensammlung), bei der JSON-Dokumente nach bestimmten Kriterien abgefragt werden können.
Die Klasse bietet eine Fluent-Interface-API: Methoden wie fields(), sort(), limit(), skip() und bind() können nacheinander verkettet werden, bevor execute() die Anfrage tatsächlich an den MySQL-Server sendet und ein DocResult-Objekt zurückliefert.
Typische Anwendungsfälle sind das Filtern von JSON-Dokumenten nach Feldinhalten, die Sortierung und Paginierung von Ergebnissen sowie das sichere Übergeben von Parametern über bind(), um SQL/NoSQL-Injection zu vermeiden.
- Verwende immer
bind()anstatt Benutzereingaben direkt in den Filterausdruck einzubauen. - Die Anfrage wird erst nach dem Aufruf von
execute()zum Server gesendet.
Beispiele
Einfache Dokumentensuche mit Filter und Limit
<?php
$session = mysql_xdevapi\getSession('mysqlx://user:pass@localhost');
$schema = $session->getSchema('mydb');
$collection = $schema->getCollection('users');
// Find-Operation erzeugen und ausführen
$result = $collection
->find('age > 18')
->fields(['name', 'email'])
->sort('name ASC')
->limit(10)
->execute();
foreach ($result->fetchAll() as $doc) {
echo $doc['name'] . ' - ' . $doc['email'] . PHP_EOL;
}
Sichere Parameterübergabe mit bind()
<?php
$session = mysql_xdevapi\getSession('mysqlx://user:pass@localhost');
$schema = $session->getSchema('mydb');
$collection = $schema->getCollection('products');
$minPrice = 10.0;
$category = 'electronics';
// Benutze Platzhalter und bind() für sichere Parametrisierung
$result = $collection
->find('price >= :minPrice AND category = :cat')
->bind(['minPrice' => $minPrice, 'cat' => $category])
->sort('price DESC')
->limit(5)
->skip(0)
->execute();
foreach ($result->fetchAll() as $doc) {
echo $doc['name'] . ': ' . $doc['price'] . ' EUR' . PHP_EOL;
}
// Wichtig · Fallstricke
Sicherheit: Baue niemals Benutzereingaben direkt in den Filterausdruck von find() ein. Nutze stattdessen benannte Platzhalter (z. B. :paramName) in Kombination mit der Methode bind(), um NoSQL-Injection-Angriffe zu verhindern.
Voraussetzungen: Die Erweiterung mysql_xdevapi ist nicht standardmäßig in PHP enthalten und muss separat über PECL installiert werden (pecl install mysql_xdevapi). Sie erfordert eine MySQL-Server-Version mit aktiviertem X Protocol (MySQL 5.7.12+).
Wichtig: CollectionFind wird nicht direkt instanziiert; das Objekt entsteht ausschließlich durch den Aufruf von Collection::find().