PDO::ATTR_EMULATE_PREPARES
のデフォルト設定をオフにした場合 、それからそれは動作します。 mysqlの設定はデフォルトでオンになっていることがわかりました。つまり、プリペアドステートメントを実際に使用することはありません。phpは内部で動的SQLを作成し、値を引用してプレースホルダーを置き換えます。ああ、主要なwtf。
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$stmt = $pdo->prepare($sql);
$stmt->execute(array(5)); //works!
パフォーマンス上の理由から、準備はデフォルトでエミュレートされます。
PDO MySQL:も参照してください。 PDO ::ATTR_EMULATE_PREPARESを使用するかどうか?