Dnes si ukážeme, jak by se dala na portálu pomocí PHP provádět registrace uživatelů.
24.11.2004 15:00 | Petr Zajíc | read 118713×
DISCUSSION
Poté, co jsme vyřešili základní navigaci, budeme dnes pokračovat v
našem hudebním portálu věcmi, které zajistí jeho funkcionalitu. Pojďme
si nejprve projít zadání a rozhodnout se, čím začít.
Čím začít
V předminulém díle seriálu jsme si stanovili jakýsi cílový koncept
celé aplikace. Když si jej pořádně přečtete,
zjistíte, že se skládá ze čtyř hlavních věcí - koncerty, diskografie,
texty písní a uživatelé. Texty písní mají být k dispozici pouze
registrovaným uživatelům, zadávat koncerty smí jen uživatel -
administrátor. Z toho vyplývá, že by bylo praktické začít nějakými
skripty pro uložení uživatelů, abychom na to později mohli navázat.
Připomeňme, že s uživatelem by portál měl být schopen provádět
následující kousky:
- registrace (přezdívka, mail, heslo)
- změna hesla
- odeslání zapomenutého hesla
- zrušení registrace
Budeme postupovat tak, že každou z akcí bude realizovat nějaký PHP
skript. Celkem budeme tedy mít 4 skripty, které se budou jmenovat
registrace.php, zmenahesla.php, zapomenuteheslo.php a
zruseniregistrace.php.
Pozn.: V praxi byste možná zvolili
kratší názvy souborů. Někdo se rovněž rozhodne používat anglické názvy
ve stylu useradd, userdel a podobně. My to uděláme takto z výukových
důvodů.
Databáze
Je jasné, že na uložení informací o uživatelích bude sloužit jedna
tabulka v databázi mysql. Když se nad tím zamyslíte, bude potřeba
ukládat následující věci:
- přezdívku uživatele
- jeho e-mail
- jeho heslo
Nicméně, pokud se nad tím zamyslíte trochu hlouběji, zjistíte
rovněž, že přímo do této tabulky bychom mohli ukládat informaci o tom,
zda je daný uživatel administrátorem (můžete mít více administrátorů).
Stejně tak z potřeby na odeslání zapomenutého hesla maximálně 1x denně
vyplývá, že bude užitečné sledovat datum a čas, kdy se naposledy
odesílalo zapomenuté heslo, a patří to logicky do téže tabulky.
Nebudeme chtít, aby se uživatelé přihlašovali pod falešným e-mailem,
takže instrukce pro dokončení registrace budou zaslány na uvedený
e-mail a my budeme považovat registraci za úspěšnu pouze v případě, kdy
uživatel splní instrukce z e-mailu. Pro databázi to znamená, že
zavedeme pole registracedokoncena, které nastavíme až v případě, že si
uživatel přečte instrukce z mailu, který při registraci uvedl a provede
je. Rovněž teprve poté budeme považovat registraci za dokončenou.
V praxi
ještě bývá zvykem mít možnost dočasně znemožnit uživateli přihlášení
pomocí nějakého příznaku u jeho záznamu v databázi, například pokud
uživatel příliš obtěžuje v diskusích. Z důvodů souvisejících z databází
bude rovněž užitečné jednotlivé řádky číslovat pomocí sloupce s
automatickým přírůstkem. Celkem shrnuto budeme mít tedy 8 polí a SQL
příkaz pro návrh tabulky by potom mohl vypadat následovně:
CREATE TABLE `uzivatele`
(
`id` INT NOT NULL AUTO_INCREMENT ,
`prezdivka` VARCHAR( 50 ) NOT NULL ,
`email` VARCHAR( 50 ) NOT NULL ,
`heslo` VARCHAR( 10 ) NOT NULL ,
`jeadmin` TINYINT DEFAULT '0' NOT NULL ,
`pripomenuto` DATETIME NULL ,
`registracedokoncena` TINYINT
DEFAULT '0' NOT NULL ,
`jeblokovan` TINYINT DEFAULT '0' NOT NULL ,
PRIMARY KEY ( `id` )
);
Asi jste si všimli, že v
databázi ukládáme heslo tak, jak jej uživatel zadal. To je z principu
dost nebezpečné. Návod, jak to udělat lépe, byl v seriálu již popsán. Dělám to kvůli jednoduchosti.
Registrační skript
Registrační skript registrace.php by měl obsahovat především
formulář pro zadání přezdívky, jména a hesla. To se následně
odkontroluje a uloží do databáze. Na e-mail uvedený v registraci bude
zaslána zpráva obsahující url, které musí uživatel navštívit, aby byla
jeho registrace dokončena. Jakmile toto url uživatel navštíví, v
databázi nastavíme příznak 'registracedokoncena' na jedničku a uživatel
se bude moci přihlásit.
Při tvorbě formuláře si vypůjčím informace z 25. dílu
našeho seriálu (o zpracování formulářů), takže pokud jste jej
nečetli, možná je ten správný čas udělat to nyní. Při odeslání
formuláře budeme provádět následujících 5 kontrol, než jej prohlásíme
za správně vyplněný:
- zda zadaný údaj e-mail obsahuje platný formát e-mailu
- zda tam již e-mail není
- zda tam již přezdívka není
- zda je přezdívka mezi 3 a 50 znaky délky
- zda je heslo 3 až 50 znaků dlouhé
Na skript v celé jeho kráse se můžete podívat, a
trochu jej okomentuji. Vlastní formulář je zabalen do tabulky, aby byl
na stránce alespoň trochu zarovnán. Jakmile uživatel vyplní požadovné
údaje, provede se několik věcí:
- Nejprve se zadané údaje zkontrolují. Všimněte si, že na kontrolu
toho, zda zadaná přezdívka či e-mail již nejsou v databázi obsaženy
jsem sestavil dvě samostatné funkce emailvdb a prezdivkavdb.
- Pokud kontrolou projdeme, především uživateli poděkujeme za jeho
snahu a řekneme mu, že zbytek informací má v e-mailu.
- Následně vložíme e-mail, přezdívku a heslo do databáze. V tabulce
uzivatele vznikne nový řádek. Pole jeadmin, registracedokoncena a
jeblokovan se přitom nastaví na nulu, protože to je jejich výchozí
hodnota (a žádné konkrétnější zadání jsme neupřesnili). Pole id se
nastaví na nejnižší nepoužité id v tabulce (o tyto "drobnosti" se stará
mysql).
- Pomocí funkce mysql_insert_id si zjistíme id posledně vloženého
řádku
- Sestavíme e-mail obsahující instrukci, že k dokončení registrace
uživatel musí navštívit danou stránku a tento e-mail odešleme
- Skript registracedokoncene.php
se postará o to, že daný uživatel bude mít v databázi příznak
registracedokoncena nastaven na jedničku, protože je jasné, že četl
zaslaný e-mail a tudíž jeho e-mailová adresa je platná a funkční.
Na současný stav projektu se můžete na našem webu podívat
nebo si jej můžete stáhnout.
Pozn.: Aby Vám stažená verze
fungovala na lokálním stroji, upravte si hodnotu konstant SQL_HOST,
SQL_USERNAME, SQL_PASSWORD a SQL_DBNAME. Případně si je můžete včlenit
do konfiguračního souboru podobně, jako jsem to udělal v souboru
func.php.