Prøv:
$sql = "INSERT INTO persist (user_id, hash, expire)
VALUES (:user_id, :hash, :expire)
ON DUPLICATE KEY UPDATE hash=:hash2";
og
$stm->execute(
array(":user_id" => $user_id,
":hash" => $hash,
":expire" => $future,
":hash2" => $hash)
);
Uddrag fra dokumentationen (http://php.net/manual/en/pdo. prepare.php ):
Du skal inkludere en unik parametermarkør for hver værdi, du ønsker at overføre til sætningen, når du kalder PDOStatement::execute(). Du kan ikke bruge en navngivet parametermarkør af samme navn to gange i en forberedt sætning. Du kan ikke binde flere værdier til en enkelt navngivet parameter i f.eks. IN()-sætningen i en SQL-sætning.