PDOは準備されたクエリをエミュレートするように構成されていますが、mysqliは真の準備されたクエリを使用しています。
準備されたクエリは、文字列''1''
をバインドします 整数パラメータ値として。 PHPは、intval()
などを使用して整数に強制します 。数値以外の先頭文字を含む文字列は、PHPによって0として解釈されるため、パラメータ値は afterに送信されます。 prepareは値0です。
偽の準備されたクエリは文字列補間を使用します (バインドする代わりに)文字列''1''
を追加します 前のSQLクエリに MySQLはそれを解析します。ただし、SQLは整数コンテキストで数字以外の先頭文字を含む文字列も値0として扱うため、結果は同様です。
唯一の違いは、パラメータが準備前と準備後にバインドされたときに、一般的なクエリログに記録される内容です。
PDOに実際に準備されたクエリを使用させることもできるため、この場合はmysqliと同じように動作する必要があります。
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
PS:これは、id値を0ではなく1から開始するのが通例である理由を示している可能性があります。