Si vous désactivez le paramètre par défaut de PDO::ATTR_EMULATE_PREPARES
, alors ça marchera. Je viens de découvrir que ce paramètre est activé par défaut pour mysql, ce qui signifie que vous n'utilisez jamais d'instructions préparées, php crée en interne un sql dynamique pour vous, citant les valeurs pour vous et remplaçant les espaces réservés. Ya, un wtf majeur.
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$stmt = $pdo->prepare($sql);
$stmt->execute(array(5)); //works!
Les préparations sont émulées par défaut pour des raisons de performances.
Voir aussi PDO MySQL :Utiliser PDO::ATTR_EMULATE_PREPARES ou non ?