Ако изключите настройката по подразбиране на 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 или не?