http://php.net/manual/en/pdo.prepare.php afirma:
Como isso indica, a provável razão por trás do seu código funcionar em um servidor e não em outro é que
PDO::ATTR_EMULATE_PREPARES
está desabilitado no servidor em que o código falha. Como a documentação diz, esse atributo remove efetivamente a restrição que impede você de usar um marcador de parâmetro com o mesmo nome duas vezes (juntamente com algumas outras restrições).