PHP (71) - Přihlašování uživatelů na portál

Tož, uživatele již máme. Pojďme je tedy přihlásit (a odhlásit) z našeho výcvikového portálu.

26.11.2004 15:00 | Petr Zajíc | přečteno 123206×

Dnes na náš portál doplníme funkci pro přihlašování a odhlašování uživatelů, které jsme si v předchozím díle seriálu vytvořili. Uvidíte, že to nemusí být až tak jednoduché, jak to na první pohled může vypadat.

Pozn.: Množí se dotazy, zda demoverze portálu bude umět všechny popisované funkce - ano, bude. Takže si skutečně můžete založit "účet" a testovat to s námi. Jak budou v jednotlivých dílech přibývat funkce, tak bude příklad upravován, aby vždy fungoval tak, jak je v článku vysvětleno.

Rozbor

Jednoduše - v odkazech v levé části stránky je položka Přihlásit. Ta povede na skript, který bude zajišťovat přihlašování uživatelů. Jestliže bude uživatel již přihlášen, změní se text odkazu z "Přihlásit" na "Odhlásit" a odkaz povede na skript pro odhlášení. Časem možná budeme chtít někde vypsat, kdo je aktuálně přihlášen (alespoň přezdívku), takže bychom na to již v této fázi měli myslet na o přihlášeném uživateli bychom si měli uložit na dobře dostupné místo nějaké informace.

Přihlašování uživatelů

Teď napíšu něco triviálního - pro přihlášení bude muset uživatel znát přezdívku a heslo. Takže přihlašovací skript (nazveme si jej třeba prihlaseni.php) bude pochopitelně obsahovat formulář pro zadání přezdívky a hesla a při ověřování je musí porovnat s údaji v databázi. Podstatnou část formuláře přitom můžeme opsat z minulého dílu - z formuláře pro registraci.

Co je nové a co se musí nějak rozhodnout je následující věc: co udělat s uživatelem, jehož přihlašovací údaje souhlasí? Tento údaj je od nynějška nutné vést v patrnosti, a to tak dlouho, dokud se uživatel neodhlásí. Navíc, je tuto skutečnost nutné nějak sdělit všem následujícím stránkám, které uživatel před svým odhlášením navštíví. Takové věci se dají udělat například pomocí cookies nebo pomocí sessions. Jedno i druhé jsme již v seriálu rozebírali.

Zvolíme například sessions. Jako praktické se mi ukázalo nejen evidovat zda je nějaký uživatel přihlášen, ale rovněž jaký to je uživatel. Pravděpodobně si vzpomínáte, že v minulém díle jsme v tabulce uživatelů definovali pole ID, které se automaticky zvyšuje o jedničku s každým novým uživatelem. Právě toto pole pro daného uživatele budeme ukládat do session proměnné $_SESSION["id"] a tak budeme mít uživatele jednoznačně určeného.

Neboli, po úspěšném přihlášení se skript postará o to, aby v proměnné $_SESSION["id"] byl identifikátor aktuálního uživatele. Ověřovací část skriptu prihlaseni.php potom může vypadat nějak takto:

<?
function iduzivatele ($prezdivka, $heslo, $link)
{
  
$vysledek=mysql_query("select id from uzivatele where prezdivka='".$prezdivka."' and heslo='".$heslo."'", $link);
  if (
mysql_num_rows($vysledek)==0)
    return
false;
  else {
    
$radek = mysql_fetch_array($vysledek);
    return
$radek["id"];
  }
}  
// tělo skriptu - nejprve si vytvoříme odkaz na databázi
$link=mysql_connect(SQL_HOST, SQL_USERNAME, SQL_PASSWORD);
mysql_select_db(SQL_DBNAME);

$BudemeZobrazovat=true;
if (!empty(
$_POST)) // už se odeslalo
{
  
$id =iduzivatele($_POST["prezdivka"], $_POST["heslo"], $link);
  if (!
$id) echo "Uživatelské jméno a/nebo heslo nesouhlasí";
  else
  {
    
$BudemeZobrazovat=false;
    
$_SESSION["id"]= $id;
  }
}
?>

Bude tento přístup fungovat? Sám o sobě jistě fungovat bude. Problém je, že údaj o tom, že se přihlášení zdařilo budeme mít k dispozici až v okamžiku vyhodnocení funkce iduzivatele(). Pečlivý čtenář si jistě všimne, že tato funkce je až ve skriptu prihlaseni.php. To může vadit a nemusí. Kdybychom například ihned po přihlášení chtěli v souboru navigace.php změnit příkaz "Přihlásit" na "Odhlásit" a zapsat něco ve smyslu:

<?if (isset($_SESSION["id"])):?>
<p><a href="index.php?clanek=odhlaseni">Odhlásit</a></p>
<?else:?>
<p><a href="index.php?clanek=prihlaseni">Přihlásit</a></p>
<?endif?>

tak to NEBUDE fungovat podle očekávání. Důvod je prostý - soubor navigace.php se totiž do výsledné stránky vkládá dřív než soubor prihlaseni.php a chudák navigace.php nemá ani ponětí, že budeme nastavovat nějakou session proměnnou, tatož aby věděl, jaká bude její hodnota. Takže kdybyste upravili soubor navigace.php podle receptu uvedeného výše, bude to fungovat až po opětovném načtení stránky.

Jelikož to vypadá neprofesionálně, zkusíme to trochu vylepšit. Trik spočívá v tom, že když se budeme přihlašovat (a následně rovněž odhlašovat), provede se nastavení (nebo zrušení) proměnné $_SESSION["id"] jako úplně první věc ve skriptu, ještě předtím, než se začne zpracovávat soubor navigace.php. My to ve výukovém příkladu celé umístíme rovnou do souboru index.php, dalo by se to však i včlenit jako samostatný soubor. Podívejte se, jak nyní vypadá soubor index.php.

Odhlašování

Uvědomme si, že "přihlášení" znamenalo pro náš skript dvě věci:

Proto je proces "odhlašování" velmi jednoduchý. Nic se kontrolovat nemusí, a opravdu tedy stačí zrušit nastavení proměnné $_SESSION["id"]. Což uděláme rovněž ve skriptu index.php. V tu chvíli již zbytek stránky bude vědět o tom, že jsme se odhlásili.

Změny na portálu

Přijde mi praktické okomentovat nějak všechny změněné soubory, takže se o to počínaje tímto dílem pokusím:

Nové soubory:

Změněné soubory:

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.

Online verze článku: http://www.linuxsoft.cz/article.php?id_article=543