Datenbankzugriff und SQL
Diese Seite ist für Anwendungsentwickler, die SQL brauchen. Exponential läuft auf SQLite 3, PostgreSQL, MongoDB,
MariaDB, Oracle und MySQL (Datenbankunterstützung), daher zählt portabler Code mehr als bei
einem Produkt für nur ein Datenbanksystem. Bevorzugen Sie eZPersistentObject
(Persistente Objekte und eigene Tabellen); verwenden Sie SQL für Berichte und
Massenarbeit.
Inhalt
Die Verbindung
$db = eZDB::instance();Die Instanz verwendet die [DatabaseSettings] des Siteaccess; eine Verbindung pro Anfrage (unter Velocity pro Worker).
Lesen und schreiben
$rows = $db->arrayQuery( 'SELECT id, title FROM expdemo_item WHERE user_id = ' . (int)$userID . ' ORDER BY created DESC',
array( 'offset' => 0, 'limit' => 20 ) );
$db->query( "UPDATE expdemo_item SET title = '" . $db->escapeString( $title ) . "' WHERE id = " . (int)$id );arrayQuery() gibt ein Array von Zeilen (assoziativen Arrays) zurück; das zweite Argument nimmt offset und limit
entgegen, die der Treiber in die Syntax des jeweiligen Systems übersetzt. query() gibt bei Anweisungen, die Daten
ändern, true oder false zurück.
Escaping
| Wert | Vorgehen |
|---|---|
| Ganzzahl | umwandeln: (int)$id |
| Zeichenkette | $db->escapeString( $value ) innerhalb von Anführungszeichen |
| Liste von Ganzzahlen | implode( ',', array_map( 'intval', $ids ) ) |
| Bezeichner (Tabelle, Spalte) | nie aus Eingaben; aus einer Positivliste wählen |
Bauen Sie SQL niemals ohne diese Maßnahmen aus Eingaben der Anfrage.
Transaktionen
$db->begin();
try
{
// several writes
$db->commit();
}
catch ( Exception $e )
{
$db->rollback();
throw $e;
}Transaktionen lassen sich verschachteln: Nur das äußerste commit() schreibt. Unter SQLite warten schreibende Prozesse
in einer Schlange auf die Schreibsperre; halten Sie Transaktionen kurz (SQLite-Transaktionen).
Portables SQL schreiben
- Verwenden Sie Offset und Limit von
arrayQuery(), nichtLIMITin der Zeichenkette. - Vermeiden Sie systemspezifische Funktionen (
IFNULL,GROUP_CONCAT,MOD()): Die Korrekturen von eztags für SQLite habenMOD()durch%ersetzt (eztags). - Verlassen Sie sich nicht auf
SET @var := ...oder Zeichenketten mit mehreren Anweisungen. - MongoDB kennt keine Joins: Der Treiber des Kernels übersetzt gängige Anweisungen; für Ihre eigenen Tabellen sollten
Sie
eZPersistentObjectbevorzugen, das jedes System unterstützt (MongoDB-Unterstützung). - Testen Sie auf SQLite und auf dem System der Produktivumgebung.
- Der SQL-Abfrage-Cache kann Leseergebnisse cachen (
querycache.ini) (SQL-Abfrage-Cache).
Verwandte Seiten
- Persistente Objekte und eigene Tabellen
- Datenbankschema und .dba-Dateien
- Standard für Datenbanken und SQL
- Freie Dokumentation: Diese Seite darf unter der GNU FDL 1.3 frei kopiert, übersetzt und verbessert werden.
Werden Sie Exponential-Partner
Partner teilen ihre Informationen, stellen Mittel bereit, geben Beiträge zurück und entwickeln die Produkte mit uns, und so wächst Exponential. Eine Partner-Website und ein Dashboard sind für Mitte 2027 geplant: Werden Sie noch heute Partner, damit wir schneller wachsen und neue Funktionen früher liefern.