Jeśli wyłączysz domyślne ustawienie PDO::ATTR_EMULATE_PREPARES
, wtedy zadziała. Właśnie dowiedziałem się, że to ustawienie jest domyślnie włączone dla mysql, co oznacza, że nigdy nie używasz przygotowanych instrukcji, php wewnętrznie tworzy dla Ciebie dynamiczny sql, cytując wartości za Ciebie i zastępując symbole zastępcze. Tak, główny wtf.
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$stmt = $pdo->prepare($sql);
$stmt->execute(array(5)); //works!
Przygotowania są domyślnie emulowane ze względu na wydajność.
Zobacz także PDO MySQL:Użyj PDO::ATTR_EMULATE_PREPARES czy nie?