Skip to the content
Documentation
Help Start
Reading in:
  • German: 9,059 of 9,059 pages
About the help in other languages
All help pages

Portables SQL schreiben

Wie Sie Abfragen schreiben, die auf jeder von Exponential unterstützten Datenbank laufen - Maskieren und Casten, Limits als Parameter, die Dialektunterschiede jedes Treibers (Zeilenlimits, IDs, Verkettung, MD5, bitweise…

Download as PDF

Address: https://doc.exponential.earth/exphelp/viewer/help/software-engineers/writing-portable-sql.md

On this page

This page is a translation. Read the English original

Portables SQL schreiben

Diese Seite richtet sich an Ingenieure, die SQL in Kernel- oder Erweiterungscode schreiben. Exponential läuft auf sechs Datenbanken; eine Abfrage, die auf Ihrer Entwicklungsdatenbank funktioniert, ist also nicht fertig, bis sie auf den anderen funktioniert. Die Regeln und die Dialekttabelle stammen aus Standards für Datenbanken und SQL.

Inhalt

  1. Die zwei verpflichtenden Regeln
  2. Die API dem SQL vorziehen
  3. Dialektunterschiede
  4. Muster, die portabel bleiben
  5. Auf mehr als einer Engine testen

Die zwei verpflichtenden Regeln

  1. Maskieren Sie jede Zeichenkette mit $db->escapeString( $value ), innerhalb einfacher Anführungszeichen. Jeder Treiber verwendet die eigene Funktion der Engine; der Oracle-Treiber verdoppelt einfache Anführungszeichen.
  2. Casten Sie jede Zahl mit (int), bevor sie ins SQL geht. Um einen Cast lässt sich nicht herummaskieren.

Diese Regeln hat die Sicherheitskorrektur von 6.0.13 im Kernel wiederhergestellt (Ganzzahl-Casts, escapeString(), eine Freigabeliste für Spalten in ORDER BY); dieselben Muster in Erweiterungscode werden durch eine Kernel-Aktualisierung nicht behoben (Sicherheitshärtung von 6.0.13).

Die API dem SQL vorziehen

  • eZPersistentObject::fetchObjectList() und die anderen Methoden der Persistenzobjekte maskieren für Sie.
  • Inhaltsabfragen laufen über Fetch-Funktionen oder die Inhaltsklassen; sie wenden Berechtigungen an und funktionieren auf jeder Engine, MongoDB eingeschlossen.
  • Übergeben Sie Offset und Limit als Parameter von arrayQuery(), damit jeder Treiber seine eigene Syntax schreibt.

Dialektunterschiede

ThemaSQLite 3PostgreSQLMySQL, MariaDBOracleMongoDB-Adapter
ZeilenlimitLIMIT offset, countLIMIT count OFFSET offsetLIMIT offset, countOFFSET n ROWS FETCH NEXT m ROWS ONLYlimit und skip
Neue IDslastInsertRowID()Sequenz <table>_<column>_seqAUTO_INCREMENTSequenz s_<table>ein Zählerdokument je Sequenz
Verkettung von Zeichenketten||||concat( ... )||concat( ... ), vom Adapter gelesen
MD5Benutzerfunktion md5()braucht pgcryptoMD5()STANDARD_HASH( s, 'MD5' )in PHP gehasht
UPDATE ... JOIN von MySQLumgeschrieben (braucht SQLite 3.33)nicht umgeschriebennativnicht umgeschriebennicht zutreffend
Leere Zeichenkette''''''als NULL gespeichertnicht geprüft
Vergleich von Zeichenketten= mit Groß- und Kleinschreibungmit Groß- und Kleinschreibungohne Groß- und Kleinschreibung (Standard-Kollationen)mit Groß- und Kleinschreibungmit Groß- und Kleinschreibung, sofern keine Kollation gesetzt ist
Beginn einer TransaktionBEGIN IMMEDIATE nach einer SchreibsperreBEGIN WORKBEGIN WORKkein Auto-Commitkeiner

Die vollständige Tabelle mit Quellen steht unter Dialektunterschiede, Treiber für Treiber.

Muster, die portabel bleiben

StattSchreiben Sie
LIMIT 10 in der SQL-Zeichenkettearray( 'offset' => 0, 'limit' => 10 ) als Parameter
UPDATE a JOIN b ...UPDATE a SET ... WHERE id IN ( SELECT ... ) oder zwei Anweisungen in einer Transaktion
Vergleich mit ''behandeln Sie '' und NULL gleich, weil Oracle die leere Zeichenkette als NULL speichert
Sich auf ein = ohne Groß- und Kleinschreibung verlassennormalisieren Sie die Schreibung in PHP oder auf beiden Seiten
SET @var := ...lesen Sie den Wert in PHP und übergeben Sie ihn an die nächste Anweisung
Eine Engine-Funktion (GROUP_CONCAT, ILIKE)erledigen Sie die Arbeit in PHP oder verzweigen Sie nach Treiber, mit einem Rückfall für jede Engine
ORDER BY mit einem Spaltennamen aus der Anfrageeine Freigabeliste erlaubter Spalten

Auf mehr als einer Engine testen

  • SQLite braucht keinen Server: Führen Sie Ihren Code als zweite Engine gegen eine SQLite-Installation aus.
  • Die CI führt die Datenbanktests auf MySQL 8.0 und PostgreSQL 15 (PHP 8.3) aus; reproduzieren Sie sie mit tests/runtests.php --dsn ... --db-per-test gegen eine Wegwerf-Datenbank (CI-Gates).
  • Tests, die eine laufende Datenbank brauchen, lesen ihren Ort aus Umgebungsvariablen und werden übersprungen, wenn er nicht gesetzt ist (Tests ohne Datenbank und Testsuiten).

Verwandte Seiten

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.

Something wrong on this page? Report an error

Documentation license

This documentation is free documentation, licensed under the GNU Free Documentation License 1.3 or later.

Exponential Copyright © 1998-2026 Exponential Foundation and 7x