Skip to main content

Stell dir vor, du schreibst einen Brief und möchtest den Namen des Empfängers an einer bestimmten Stelle einfügen. Anstatt für jeden Empfänger einen komplett neuen Brief zu schreiben, lässt du eine Lücke frei: „Sehr geehrte/r _________,“. Diese Lücke ist ein Platzhalter.

In PHP und SQL ist es genau dasselbe. Ein Platzhalter ist eine Markierung in deiner SQL-Anweisung, die du später sicher mit einem echten Wert füllst. Das ist der Kern von Prepared Statements.


 

Warum braucht man Platzhalter? 🧐

 

Der Hauptgrund ist Sicherheit. Würdest du Benutzereingaben direkt in deine SQL-Abfrage einfügen, könnte jemand schädlichen Code einschleusen (das nennt man SQL-Injection).

Unsicheres Beispiel (BITTE NICHT VERWENDEN):

PHP

$user_id = $_GET['id']; // Kommt vom Benutzer, z.B. "123"
$sql = "SELECT * FROM users WHERE id = $user_id"; // Gefahr!

Wenn ein Angreifer statt „123“ den Text 123; DROP TABLE users; eingibt, würde deine Datenbank den Befehl ausführen und die users-Tabelle löschen!

Platzhalter lösen dieses Problem, indem sie die SQL-Anweisung und die Daten strikt voneinander trennen. Die Datenbank weiß: „Das eine ist der Befehl, das andere sind nur Daten, die niemals als Befehl interpretiert werden dürfen.“


 

Wie funktionieren sie? Der Zwei-Schritte-Prozess

 

Die Verwendung von Platzhaltern erfolgt immer in zwei Schritten:

  1. Vorbereiten (prepare): Du schickst die SQL-Anweisung mit den Platzhaltern an die Datenbank. Die Datenbank schaut sich den „Bauplan“ der Abfrage an und bereitet ihn vor, ohne die endgültigen Werte zu kennen.
  2. Ausführen (execute): Du schickst die eigentlichen Daten separat an die Datenbank. Die Datenbank setzt diese Daten sicher in die vorbereiteten Lücken ein und führt die fertige Anweisung aus.

 

Die zwei Arten von Platzhaltern

 

Es gibt zwei simple Arten, die du verwenden kannst. Welche du nimmst, ist meist Geschmackssache.

 

1. Positions-Platzhalter (?)

 

Das sind einfache Fragezeichen. Sie sind anonym und werden der Reihe nach befüllt.

  • Wie sie aussehen: ?
  • Wie man sie verwendet: Du übergibst bei execute() ein einfaches, nummeriertes Array. Das erste ? bekommt den ersten Wert aus dem Array, das zweite ? den zweiten und so weiter. Die Reihenfolge ist entscheidend.

Beispiel: Finde einen Benutzer mit einem bestimmten Status und einer Mindestanzahl an Posts.

PHP

// Die Daten, die wir sicher einfügen wollen
$status = 'active';
$min_posts = 10;

// 1. Vorbereiten mit ?-Platzhaltern
$sql = "SELECT * FROM users WHERE status = ? AND post_count > ?";
$stmt = $pdo->prepare($sql);

// 2. Ausführen mit einem Array. Die Reihenfolge muss stimmen!
// 'active' wird für das erste ?, 10 für das zweite ? eingesetzt.
$stmt->execute([$status, $min_posts]);

$users = $stmt->fetchAll();

Vorteil: Schnell zu schreiben, wenn man nur wenige Parameter hat.

 

2. Benannte Platzhalter (:name)

 

Das sind Platzhalter mit einem Namen, dem ein Doppelpunkt vorangestellt ist.

  • Wie sie aussehen: :benutzername, :email, :id (der Name ist frei wählbar)
  • Wie man sie verwendet: Du übergibst bei execute() ein assoziatives Array (Schlüssel => Wert). Der Schlüssel im Array muss dem Namen des Platzhalters entsprechen. Die Reihenfolge ist egal.

Beispiel: Ein Produkt mit Namen und Preis in die Datenbank einfügen.

PHP

// Die Daten, die wir sicher einfügen wollen
$product_name = 'Laptop Pro';
$product_price = 1299.99;
$category_id = 4;

// 1. Vorbereiten mit benannten Platzhaltern
$sql = "INSERT INTO products (name, price, category_id) VALUES (:name, :price, :cat_id)";
$stmt = $pdo->prepare($sql);

// 2. Ausführen mit einem assoziativen Array. Die Reihenfolge ist egal.
$stmt->execute([
    ':name' => $product_name,
    ':cat_id' => $category_id,
    ':price' => $product_price
]);

Vorteile:

  • Dein Code ist viel lesbarer, weil du sofort siehst, welcher Wert wohin gehört.
  • Du kannst einen Platzhalter mehrmals verwenden, ohne den Wert mehrfach im Array angeben zu müssen.

 

Zusammenfassung ✅

 

Eigenschaft Positions-Platzhalter (?) Benannte Platzhalter (:name)
Aussehen ? :platzhalter_name
Datenübergabe Nummeriertes Array ['wert1', 'wert2'] Assoziatives Array [':name' => 'wert']
Reihenfolge Wichtig! Muss exakt übereinstimmen. Egal! Wird über den Namen zugeordnet.
Lesbarkeit Gut für sehr kurze Abfragen. Besser für komplexe Abfragen.
Empfehlung Für simple Abfragen okay. Für die meisten Fälle empfohlen.

Goldene Regel: Sobald eine Variable (besonders eine, die von einem Benutzer kommen könnte) in einer SQL-Abfrage verwendet wird, benutze immer Platzhalter!

One Comment

Leave a Reply