Coba:
$sql = "INSERT INTO persist (user_id, hash, expire)
VALUES (:user_id, :hash, :expire)
ON DUPLICATE KEY UPDATE hash=:hash2";
dan
$stm->execute(
array(":user_id" => $user_id,
":hash" => $hash,
":expire" => $future,
":hash2" => $hash)
);
Kutipan dari dokumentasi (http://php.net/manual/en/pdo. persiapan.php ):
Anda harus menyertakan penanda parameter unik untuk setiap nilai yang ingin Anda berikan ke pernyataan saat Anda memanggil PDOStatement::execute(). Anda tidak dapat menggunakan penanda parameter bernama dengan nama yang sama dua kali dalam pernyataan yang disiapkan. Anda tidak dapat mengikat beberapa nilai ke satu parameter bernama di, misalnya, klausa IN() dari pernyataan SQL.