Veritabanında sifirlamakodu tablosu oluşturacaksın. (kod_id - uye_id - kod - tarih)
Biri sıfırlama sayfasına girip mailini yazacak ve bu formda öyle bir mail adresi kayıtlı mı kontrol edeceksin kayıtlıysa random bir kod oluşturup bu kodu önce sifirlama tablosuna hangi uye_id ve kod şeklinde kaydedeceksin. Ardından mail gönderteceksin.

siten.com/sifirla.php?kod=fdkljlskdfjsldg şeklinde mail gidecek üyeye. Bu linke tıkladığında get ile kodu çekip sifirlamakodu tablosunda böyle bir kod var mı kontrol edip eğer varsa sayfayı açıp bu sayfada yeni şifreyi isteyeceksin. Ardından yeni şifreyi update edip kullanılmış duruma geçen kodu veritabanından sildireceksin.

Tüm bu aşamalarda oluşturduğun formlarda capctha olması önemli. Ayrıca random oluşturudğun kodu md5 ile şifrelersen 32 karakterli uzun bir kod elde edersin daha iyi olur.

Devamında ayrıca şifre değişikliğini post ettiğinde kod oluşturma tarihini de kontrol ederek eğer kod 3 günden eski ise kodu sildirip ekrana hata yazdırıp yeni kod talebi isteyebilirsin.

Böyle bir şeyin hazır kodu olmaz kendine göre bu mantık ile yaz.