Ihr PDO ist so konfiguriert, dass es vorbereitete Abfragen emuliert, während mysqli echte vorbereitete Abfragen verwendet.
Die vorbereitete Abfrage bindet den String ''1''
als ganzzahliger Parameterwert. PHP zwingt es mit etwas wie intval()
zu einer ganzen Zahl . Jede Zeichenfolge mit nicht numerischen führenden Zeichen wird von PHP als 0 interpretiert, daher wird der Parameterwert nach gesendet Vorbereiten ist der Wert 0.
Die gefälschte vorbereitete Abfrage verwendet String-Interpolation (anstatt zu binden), um die Zeichenfolge ''1''
hinzuzufügen in die SQL-Abfrage vorher MySQL parst es. Das Ergebnis ist jedoch ähnlich, da SQL auch einen String mit nicht numerischen führenden Zeichen in einem Integer-Kontext als den Wert 0 behandelt.
Der einzige Unterschied besteht darin, was im allgemeinen Abfrageprotokoll landet, wenn der Parameter vor der Vorbereitung oder nach der Vorbereitung gebunden wird.
Sie können PDO auch dazu bringen, echte vorbereitete Abfragen zu verwenden, also sollte es sich in diesem Fall genau wie mysqli verhalten:
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
PS:Dies kann einen guten Grund zeigen, warum es üblich ist, ID-Werte bei 1 statt bei 0 zu beginnen.