Wenn Sie die Standardeinstellung von PDO::ATTR_EMULATE_PREPARES
deaktivieren , dann klappt es. Ich habe gerade herausgefunden, dass diese Einstellung für mysql standardmäßig aktiviert ist, was bedeutet, dass Sie niemals vorbereitete Anweisungen verwenden, PHP erstellt intern dynamisches SQL für Sie, zitiert die Werte für Sie und ersetzt die Platzhalter. Ja, ein großes Wtf.
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$stmt = $pdo->prepare($sql);
$stmt->execute(array(5)); //works!
Die Prepares werden aus Performance-Gründen standardmäßig emuliert.
Siehe auch PDO MySQL:PDO::ATTR_EMULATE_PREPARES verwenden oder nicht?