echo $begrüßung;
[...] aber eine Frage habe ich zu mysqli - muss ich dann kein mysql_real_escape_string mehr machen? Kann mir das jemand kurz erklären?
Sieh Dir mal http://de3.php.net/manual/de/function.mysqli-prepare.php an.
Um das Kind nochmal beim Namen zu nennen: Das Stichwort heißt Prepared Statements.
Das "Escaping" findet eigentlich nur an einer vorgezogenen Stelle statt, weil keine Daten mehr über eine Textschnittstelle übergeben werden, sondern Variablen über die Bind-Funktion.
Es mag einige Datenbank-Abstraktionsschichten geben, die Prepared Statements simulieren, aber mysqli gehört nicht zu diesen. Wenn die Prepared Statements unter mysqli genutzt werden, geht zuerst ein SQL-Statement mit Platzhaltern drin auf die Reise zu MySQL. Die Werte für die Platzhalter gehen anschließend auf eigenem Weg zum MySQL-Server.
Die Werte werden bei P.S. nicht in einen Befehlstext eingebunden. Es müssen keine Begrenzungszeichen gesetzt werden, um Befehl von Nutzdaten zu unterscheiden. Und es müssen auch keine mitten im Wert vorkommenden Begrenzungszeichen und andere für die Textschnittstelle ungünstige Zeichen für diese Texteinbindung behandelt werden. Deswegen fällt hier das Maskieren und Escapen weg.
Ich find's zu kompliziert.
Da stimme ich dir zu. Mir persönlich gefällt daran nicht, dass sowohl auf dem Hinweg als auch auf dem Rückweg einzelne Variablen an das $stmt (also das was mysqli_prepare() zurückliefert) gebunden werden müssen. Man kann nicht einfach ein Array mit Werten hingeben, nein, einzelne Variablen müssen es sein. Besonders beim Ergebnis ist das recht umständlich, weil ein Datensatz nun nicht mehr gebündelt vorliegt. Da ich trotzdem die Daten im Array übergeben und entgegennehmen möchte, muss ich hier mit call_user_func_array() rumhantieren. (Nein, nicht jedes Mal wieder neu. Das ist in meiner persönlichen Datenbankabstraktionsschicht implementiert.)
Dass das so [...] implementiert ist, ist der MySQL-API geschuldet, da ist das ebenfalls so kompliziert.
Bei PDO ist das deutlich benutzerfreundlicher gelöst. Allerdings werden die P.S. vom MySQL-PDO-Treiber nur simuliert statt direkt über die MySQL-API ausgeführt zu werden. (Zumindest war das bei meiner letzten Beobachtung so, die aber einge Zeit zurückliegt.)
echo "$verabschiedung $name";