aaah, daher weht da der wind. also isses wie vermutet, dass dennoch jedesmal eine anfrage gestartet wird, diese aber eben "in groben zügen" schon bekannt ist und das dbms so schlau ist, daraus einen geschwindigkeitsvorteil zu ziehen. sehr interessant. danke für die geduld und aufklärung
Naja der Geschwindigkeitsvporteil ist ja nur bedingt da. Es kommt, wenn man die SQL-Statements richtig ausformt selten dazu, das ein und das selbe Statement verwendet werden muss. Du darfst nicht vergessen, das gerade bei PHP die Datenbankverbindungen bei jeden Request wieder geschlossen werden und dadurch die Informationen verfallen.
Das wichtigste bei Prepared-Statements ist einfach der, das unser SQL-Statement getrennt von den Werten vorkompilliert werden, wodurch SQL-Anweisungen in den übergebenen Werten ungültig werden.
Um das mal zu verdeutlichen:
PHP:
$sql = "SELECT * FROM accounts WHERE password=";
$sql .= $_POST["password"]; // Übergabe von "0 or 1=1". Die hintere or-Anweisung wird auch ausgeführt
So mit Prepared-Statement:
PHP:
$sql = "SELECT * FROM accounts WHERE password=:pwstr";
$stmt = $db_pdo->prepare($sql);
// Das obere Statement wird kompilliert. Nehmen wir mal an, es wird in Token übersetzt (was nicht der realität entspricht, aber so ist es verständlicher):
// T_SELECT "*" T_FROM "accounts" T_WHERE "password" T_COMP T_VARIABLE:pwstr
$stmt->execute(array( ":pwstr" => $_POST["password"] ));
// Übergabe von "0 or 1=1". Die hintere or-Anweisung wird nicht ausgeführt. Der Interpreter versteht es in dem Stadium nicht
// Es wird sowas draus gemacht: T_SELECT "*" T_FROM "accounts" T_WHERE "password" T_COMP "0 or 1=1"
// Das Gleichheitszeichen müsste zum T_COMP werden und das or zum T_OR. Außerdem müsste die Anweisung in 3 Strings zerlegt werden.
Da aber Prepared nicht so arbeitet, wie ich es demonstriert habe, sondern deutlich effektiver, muss man für die Datenbank selbst kein Escaping der Werte mehr vornehmen. Denn SQL-Anweisungen werden innerhalb des kompilierten Statements nicht mehr verstanden, da diese Werte ausschließlich auch als solche erwartet und behandelt werden.
Und was die ganzen anderen hier betrifft, die sich wegen der Sprache den Kopf einschlagen. Ich frage mich echt, was der ganze Kram soll. PHP ist in sehr vielen Dingen einfach freier. In PHP kann man objektorientiert, prozedural oder in beidem arbeiten. Was für den einen ein schlechter Programmierstil ist, ist für andere eine ebenfalls funktionierende kreative Lösung. Und wer PHP nicht leiden kann, soll es einfach meiden. Ich arbeite jetzt schon seit etwa 10 Jahren mit PHP und es ist für mich bis heute noch die einzige Sprache für das Web, die mir auch beim programmieren Spaß macht. Mir macht es keinen Spaß, bei den Versuch, Probleme zu lösen ständig auf irgendwelche Debugger-/Compiler-Fehler zu treffen, weil die blöde Sprache mir vorkauen muss, wie ich ein Problem zu lösen habe. Wenn das ganze so weitergeht und die Sprachen noch strikter werden, brauch man dem Computer bald nur noch sagen, was man benötigt und er erzeugt den Code von alleine nach ISO- und DIN-Norm. Ob man das dann von Hand Tippt oder der Computer die Lösung generiert. Es würde bis auf die Bezeichner eh alles gleich aussehen.
Ich schweinere in Codes sogar sehr gerne rum. Ich tue alles, um Overheads zu minimieren. Am Ende muss das Ergebnis nur stimmen und es sollte sicher sein. Die Verantwortung dafür hat der Programmierer und nicht die Entwickler einer Programmiersprache. Diese muss nur Grundlegend sicher sein. Sie kann aber nicht für die Unsicherheit verantwortlich sein, die ein Programmierer in seine Software integriert hat!
Jetzt mit PHP 7 habe ich alle Singletons durch anonyme Klassen ersetzt. Callbacks werden fast nur noch mit anonymen Funktionen erstellt. Der Umfang an externen Hilfsbibliotheken ging dabei rapide zurück. Auch der neue Null-Coalescing Operator ?? findet aktuell regen Einsatz. Ich habe mit PHP meinen Spaß. Und egal ob VB.NET, Python oder Java. Mit alle diesen Sprachen will ich einfach im Web nicht arbeiten. Selbst für den Desktop habe ich mir andere Alternativen gesucht, anstatt diese Dinger zu benutzen. Das ist mir auch völlig schnuppe, ob Java, C#, VB.NET und Konsorten vor allem im Business-Bereich am weitesten verbreitet sind. Jeder soll sich da seinen eigenen Weg suchen. Aber je mehr mir eine Sprache eine feste Arbeitsweise aufdrängen will oder sogar strikt einfordert, um so unsymparischer ist mir die Sprache bzw. dessen Debugger/Compiler/Interpreter. Ich hätte gerne in den ersten 2 Jahrzehnten des Computerzeitalters schon gelebt, wo damals die ganz großen der Szene mit "Schweinecode" noch das Computerzeitalter mitgeformt haben. Heute fehlt dem ganzen einfach die Seele. Aber wie ich schon gesagt habe. Das soll jeder für sich selbst entscheiden.
Viele Argumente sind vielleicht richtig. Aber diskutiiert bitte differenzierter. Denn nicht alle teilen eure Meinung und wenn jemand denkt, auf Grund einer Aussage diese Person für dieses Thema gänzlich zu disqualifizieren, dann ist das sein Bier. Aber denkt bitte daran, das eine solch entsprechende Aussage beleidigend ist. Nehmt eure Nasen bitte wieder runter!