Experimentar:
$sql = "INSERT INTO persist (user_id, hash, expire)
VALUES (:user_id, :hash, :expire)
ON DUPLICATE KEY UPDATE hash=:hash2";
e
$stm->execute(
array(":user_id" => $user_id,
":hash" => $hash,
":expire" => $future,
":hash2" => $hash)
);
Trecho da documentação (http://php.net/manual/en/pdo. prepare.php ):
Você deve incluir um marcador de parâmetro exclusivo para cada valor que deseja passar para a instrução ao chamar PDOStatement::execute(). Você não pode usar um marcador de parâmetro nomeado com o mesmo nome duas vezes em uma instrução preparada. Você não pode vincular vários valores a um único parâmetro nomeado, por exemplo, na cláusula IN() de uma instrução SQL.