Tach!
mysqli bietet im Übrigen auch Unterstützung für prepared statements. Der Kontextwechsel findet dort allerdings nicht ganz automatisch wie bei PDO statt,
Kontextwechsel? Findet da keiner statt. Die Werte werden in Rohform übergeben. Das ist ein ganz normaler Funktionsaufruf mit Parameterübergabe. Kontextwechsel ist, wenn Daten als Literal in anderen Code eingefügt werden müssen.
Ich fasse Kontextwechsel allgemeiner auf, nämlich: … wenn Daten in anderen Code eingefügt werden müssen. Wenn Programmdaten in einer MySQL-Datenbank gespeichert werden sollen, müssen die Daten irgendwann ja in gültige MySQL-Querys verpackt werden. Das kann per Hand durch den Programmierer geschehen oder eben automatisch z.B. durch den mysqli-Treiber. Automatischer Kontextwechsel bedeutet für den Programmierer also kein Kontextwechsel, um den er sich kümmern müsste. Man könnte auch von impliziten und expliziten Kontextwechseln sprechen, das macht es noch deutlicher. Ganz grundsätzlich wäre es schön, wenn "implizit" der Normalfall wäre und nicht die Ausnahme.
man muss bei der Übergabe der Variablen noch zusätzliche Typinformationen mitgeben. Warum auch immer.
Weil das die darunterliegende in C geschriebene MySQL-API so möchte und PHP einfach nur die Funktionen gewrappt hat. Die Werte werden als Zeiger auf einen untypisierten Buffer übergeben. Und damit die Bind-Funktion weiß, welcher Datentyp da zu erwarten ist, muss man das mit diesen Buchstaben sagen. Für PHP ist das nicht wirklich sinnvoll, denn da gibt es keine untypisierten Datenstrukturen. Der Typ kann aus den Metadaten der Variablen ermittelt werden.
Ah, ein Artefakt aus C also. Das "s" in PHP steht für sophisticated.