Signatur
Beschreibung
expression() ist eine Hilfsfunktion im Kontext von Datenbank-Abfrage-Buildern (z. B. Laravel Query Builder / Eloquent), die es ermöglicht, rohe SQL-Ausdrücke zu kapseln und dabei gleichzeitig Werte sicher als gebundene Parameter zu übergeben. So kann man komplexe SQL-Konstrukte (Berechnungen, Funktionsaufrufe, CASE-Ausdrücke) verwenden, ohne auf Prepared Statements verzichten zu müssen.
Der übergebene $expression-String enthält Platzhalter (üblicherweise ?), die durch die nachfolgenden $values ersetzt werden. Die Werte werden dabei nicht direkt in den SQL-String interpoliert, sondern als gebundene Parameter übergeben – das verhindert SQL-Injection-Angriffe.
Typischer Anwendungsfall ist die Übergabe des Rückgabewerts an Methoden wie selectRaw(), whereRaw() oder orderByRaw(), die rohe Ausdrücke akzeptieren. So lassen sich z. B. Datumsfunktionen, Aggregierungen oder mathematische Operationen sicher und lesbar einbetten.
- Sicherheit: Werte werden gebunden, nicht konkateniert.
- Lesbarkeit: Komplexe SQL-Fragmente bleiben im Code nachvollziehbar.
- Flexibilität: Kombination von rohem SQL mit dem Komfort des Query Builders.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $expression Pflicht | string | Der rohe SQL-Ausdruck als Zeichenkette. Kann Platzhalter (?) enthalten, die durch $values ersetzt werden. |
|
| $values | mixed | [] | Ein oder mehrere Werte, die sicher als gebundene Parameter an den Ausdruck übergeben werden. Die Reihenfolge entspricht den ?-Platzhaltern im Ausdruck. |
Rückgabewert
Beispiele
Roher Ausdruck mit gebundenem Parameter in einer WHERE-Klausel
<?php
// Beispiel mit Laravel Query Builder
use Illuminate\Support\Facades\DB;
$minPrice = 100;
$results = DB::table('products')
->where(DB::raw('price * quantity'), '>', DB::expression('?', [$minPrice]))
->get();
foreach ($results as $row) {
echo $row->name . PHP_EOL;
}
Mathematischen Ausdruck sicher in SELECT einbetten
<?php
// Datumsformatierung mit gebundenem Format-Parameter
use Illuminate\Support\Facades\DB;
$format = '%Y-%m';
$results = DB::table('orders')
->select(
'id',
DB::expression("DATE_FORMAT(created_at, ?)", [$format])
)
->get();
foreach ($results as $row) {
echo $row->id . ': ' . $row->created_at . PHP_EOL;
}
// Wichtig · Fallstricke
Sicherheitshinweis: Auch wenn expression() Werte als gebundene Parameter übergibt, sollte der $expression-String selbst niemals direkt aus Benutzereingaben zusammengesetzt werden – andernfalls droht SQL-Injection. Nur die Werte stammen aus nicht vertrauenswürdigen Quellen, die SQL-Struktur muss immer fest im Code definiert sein.
Framework-Abhängigkeit: expression() ist keine native PHP-Funktion der Standardbibliothek, sondern Teil von Datenbank-Abstraktionsschichten wie Laravel (DB::expression()) oder ähnlichen Query Buildern. Die genaue Signatur und das Verhalten können je nach Framework variieren.
Bei der direkten Verwendung von PDO oder MySQLi stehen die Methoden PDO::prepare() und PDOStatement::bindParam() als natürliche Alternativen zur Verfügung.