Wypróbuj:
$sql = "INSERT INTO persist (user_id, hash, expire)
VALUES (:user_id, :hash, :expire)
ON DUPLICATE KEY UPDATE hash=:hash2";
i
$stm->execute(
array(":user_id" => $user_id,
":hash" => $hash,
":expire" => $future,
":hash2" => $hash)
);
Fragment dokumentacji (http://php.net/manual/en/pdo. przygotowanie.php ):
Musisz dołączyć unikalny znacznik parametru dla każdej wartości, którą chcesz przekazać do instrukcji, gdy wywołujesz PDOStatement::execute(). W przygotowanej instrukcji nie można użyć dwukrotnie nazwanego znacznika parametru o tej samej nazwie. Nie można powiązać wielu wartości z jednym nazwanym parametrem, na przykład w klauzuli IN() instrukcji SQL.