Als u de standaardinstelling van PDO::ATTR_EMULATE_PREPARES
uitschakelt , dan zal het werken. Ik kwam er net achter dat die instelling standaard is ingeschakeld voor mysql, wat betekent dat je nooit echt voorbereide instructies gebruikt, php maakt intern dynamische sql voor je aan, waarbij de waarden voor je worden geciteerd en de tijdelijke aanduidingen worden vervangen. Ja, een grote wtf.
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$stmt = $pdo->prepare($sql);
$stmt->execute(array(5)); //works!
De voorbereidingen worden standaard geëmuleerd vanwege prestatieredenen.
Zie ook BOB MySQL:PDO::ATTR_EMULATE_PREPARES gebruiken of niet?