Tengo la enorme satisfacción de anunciar que ya me funciona.
Al final he decidido cambiarlo de servidor. Las características del nuevo comparado con el otro son:
Servidor antiguo: unix PHP 5.1.6 MySQL 5.037
Servidor nuevo: unix PHP 5.2.1 MySQL 5.037
Los métodos fetch() y prepare() funcionan correctamente, pero el execute() me sigue dando problemas con los "?" en la sentencia SQL, así que he seguido la sugerencia de GatorV de más arriba y usar
sprintf().
Durante mi investigación he encontrado un problema parecido, cuya solución no ha servido para mí, pero que quizá ayude a otros:
Error PDO::Statement->execute()
Un cordial saludo!