Hallo MB,
, dass der Query Als String mit Platzhaltern (:platzhalter
) erstellt und die zu übergebenden Werte z.B. mit bindParam
nachgereicht werden.
Ich arbeite mit ? nicht mit :colname. Wäre das n sicherheitstechnischer oder performance Grund???
nein, das sollte keinen Unterschied machen. Die benannte Schreibweise mit dem Doppelpunkt ist nur besser lesbar und weniger Fehleranfällig, weil dann die Reihenfolge der Zuordnung keine Rolle spielt.
mein toller Dozent hat uns htmlspecialchars() eingebleut :/.
Dann hat er entweder keine Ahnung und/oder es nicht richtig erklärt oder bei Dir ist was falsches hängen geblieben. Oder von beidem etwas.
Ich finde es auch etwas merkwürdig das ja mit bindeParam überflüssig wird.
Ne, überflüssig ist das nicht. Die bind()-Funktionen ersetzen nicht htmlspecialchars() o.ä.. Es kommt immer darauf an, von wo nach wo Du Daten "verschieben" möchtest.
Eigentlich ist das mit dem Kontextwechsel vom Prinzip her gar nicht so fürchterlich kompliziert. Stell Dir vor, Du möchtest einen Text vom Englischen ins Deutsche übersetzen. Beide Sprachen haben bestimmte Regeln, auch Grammatik oder Syntax genannt. Diese Regeln musst Du kennen und anwenden. Was machst Du also? Du schaust Dir die Regeln im Duden an und übersetzt den Text manuell. Da Du etwas ins Deutsche übersetzen möchtest, siehst Du hier auch, dass Dich ein französisches Wörterbuch nicht weiterbringt. Das würdest Du nur brauchen, wenn Du den Text ins Französische übersetzen wolltest.
Wenn Du jetzt Englisch = PHP, Deutsch = SQL und Französisch = HTML setzt, bist Du beim Verständnis des Kontextwechsels schon nah dran. Die Wörterbücher in dem Beispiel entsprechen den jeweiligen Specs der Systeme.
Jetzt hast Du keine Lust mehr, immer wieder ins Wörterbuch zu gucken und Deine Texte von Hand zu übersetzen. Du nimmst Dir also ein Übersetzungsprogramm. Das kennt schon viele der Regeln, Du gibst ihm Deinen Englischen Text und bekommst ihn auf Deutsch zurück. Wichtig ist hier nur, dass Du im Programm die richtige Sprache einstellst, hier also "von Englisch nach Deutsch" und nicht bspw. "von Englisch nach Französisch". Das ist im Endeffekt das, was die ganzen escape()-Funktionen machen. Möchtest Du etwas in die SQL-Datenbank schreiben, nimmst Du die SQL-escape-Funktion. Möchtest Du hingegen etwas als HTML auf Deiner Seite ausgeben, nimmst Du die HTML-escape-Funktion.
Kommen wir zum Schluss: Nach einiger Zeit nervt es Dich, dass Du die Texte immer in das Übersetzungsprogramm eingeben musst, weil Du da immer noch einiges beachten musst. Was machst Du also? Du stellst einen Dolmetscher ein. Dem sagst Du einfach in Deiner Sprache, was Du möchtest und er soll sich um den Rest kümmern. Das wäre dann sozusagen das Grundprinzip von PDO und Co. Das übernimmt die Übersetzung von PHP (Englisch) nach SQL (Deutsch) und zurück.
Hier müssen wir noch eine Besonderheit beachten, um die Analogie zu vervollständigen: Stell Dir vor, Du hast ein Dokument, sagen wir eine Rechnung. Oben ist z.B. Dein Firmenlogo drauf, das sieht auf jeder Rechnung gleich aus. Wir haben also eine Vorlage (Template). Du möchtest aber nicht, dass der Dolmetscher Dir Dein Logo ersetzt, sondern nur die Rechnungspositionen. Das machst Du, indem Du in der Vorlage Platzhalter einbaust. Nur hier soll der Dolmetscher übersetzen. Das gleiche passiert bei PDO: Das SQL-Statement ist Deine Vorlage und hat Platzhalter. Und mit den bind()-Funktionen sagst Du dem Dolmetscher jetzt in Deiner Sprache (PHP bzw. Englisch), was Du machen möchtest. Den Rest erledigt er dann für Dich.
Sorry für den langen Text. Ich hoffe, er kann etwas zum Verständnis beitragen. Falls nicht, frag einfach nach.
Gruß
Dennis