Zkuste:
$sql = "INSERT INTO persist (user_id, hash, expire)
VALUES (:user_id, :hash, :expire)
ON DUPLICATE KEY UPDATE hash=:hash2";
a
$stm->execute(
array(":user_id" => $user_id,
":hash" => $hash,
":expire" => $future,
":hash2" => $hash)
);
Výňatek z dokumentace (http://php.net/manual/en/pdo. připravit.php ):
Musíte zahrnout jedinečnou značku parametru pro každou hodnotu, kterou chcete předat do příkazu, když voláte PDOStatement::execute(). V připraveném příkazu nemůžete dvakrát použít značku pojmenovaného parametru se stejným názvem. Nemůžete svázat více hodnot s jedním pojmenovaným parametrem, například v klauzuli IN() příkazu SQL.