Si desactiva la configuración predeterminada de PDO::ATTR_EMULATE_PREPARES
, entonces funcionará. Me acabo de enterar de que esa configuración está activada de forma predeterminada para mysql, lo que significa que en realidad nunca usa declaraciones preparadas, php crea internamente sql dinámico para usted, citando los valores para usted y reemplazando los marcadores de posición. Ya, un gran wtf.
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$stmt = $pdo->prepare($sql);
$stmt->execute(array(5)); //works!
Los preparados se emulan de forma predeterminada por motivos de rendimiento.
Consulte también PDO MySQL:¿Usar PDO::ATTR_EMULATE_PREPARES o no?