http://php.net/manual/en/pdo.prepare.php indique :
Comme cela l'indique, la raison probable pour laquelle votre code fonctionne sur un serveur et pas sur un autre est que PDO::ATTR_EMULATE_PREPARES
est désactivé sur le serveur sur lequel le code échoue. Comme le dit la documentation, cet attribut supprime efficacement la restriction vous empêchant d'utiliser deux fois un marqueur de paramètre du même nom (ainsi que d'autres restrictions).