Diskusní fórum v PHP s využitím databáze – registrace uživatelů

6. listopadu 2001

V tomto dílu se podíváme na registraci uživatelů a procvičíme si hlavně práci s obrázky (zvětšování, zmenšování). Jelikož se jedná o zatím poslední článek, budete si moci celou aplikaci konečně stáhnout.

Registrace uživatelů (reg.php)

Proč vůbec zavádět registraci uživatelů? Hlavním důvodem je znemožnit ostatním uživatelům podepsat se mým jménem nebo přezdívkou. To znamená, že pokud si zaregistruji jméno ‚Jan Novák‘, nikdo jiný nebude moci v daném diskusním fóru toto jméno použít. Při registraci můžeme také snadno provést upload obrázku uživatele, který se následně objeví u všech jeho příspěvků.

Formulář i kód, který zpracuje odeslané údaje, bude tentokrát v jednom souboru (reg.php). Od uživatele budeme získávat tyto údaje: Jméno, Heslo, Heslo znovu (povinné), Email, Obrázek (nepovinné). Na úvod zjistíme, zda-li byl formulář odeslán. Pokud ano, uložíme do proměnné $write hodnotu true (předpokládáme úspěšný zápis). Následně zkontrolujeme, zda byly vyplněny všechny povinné údaje. Pokud ne, do proměnné $error uložíme chybovou hlášku a hodnotu proměnné $write nastavíme na false (zápis se neprovede). Obdobně postupujeme i při kontrole rovnosti hesel.

if(IsSet($sent)):            //byl odeslán formulář?
    require("db.php");    //otevřeme databázi
    $write = true;            //předpokládáme úspěšný zápis
    if($name=="" || $password=="" || $password_2==""):    //byly vyplněny všechny povinné údaje?
        $error = ‚Musíte vyplnit všechny povinné údaje – označeny tučným písmem.‘;
        $write = false;
    elseif($password!=$password_2):                  //rovnají se hesla?
        $error = ‚Heslo nebylo zadáno správně.‘;
        $write = false;

Nyní musíme zkontrolovat, jestli zadané jméno není již zaregistrované. Z tabulky users vybereme všechna jména a pomocí jednoduchého cyklu zjišťujeme, zda se zadané jméno rovná některému jménu z databáze. Ještě předtím ale převedeme obě jména pomocí funkce StrToLower() na malá písmena, aby nemohlo dojít k registraci jmen ‚Jan Novák‘ i ‚jan novák‘.

    else:
        //existuje zadané jméno?
        $user = MySQL_Query("SELECT name FROM users") or die($query_error);
        while($entry = MySQL_Fetch_Array($user)):
            if(StrToLower($name)==StrToLower($entry["name"])):
                $error = ‚Toto uživ. jméno již existuje, vyberte si prosím jiné.‘;
                $write = false;
                break;
            endif;
        endwhile;
    endif;

Pokud vše proběhlo v pořádku, zjistíme, zda byl odeslán i obrázek. Jestliže ano, zkontrolujeme, zda se jedná o námi akceptovatelný formát (GIF, JPEG). Protože některé prohlížeče používají pro obrázky JPEG označení image/jpeg a některé image/pjpeg, musíme kalkulovat s oběma hodnotami. Následně zjistíme, jestli je velikost obrázku do 10 kB. Pokud ne, zápis se neprovede.

    if($write):    //vše zatím proběhlo v pořádku
        if($picture_name!=""):    //byl odeslán obrázek?
            if($picture_type=="image/gif" || $picture_type== "image/pjpeg" || $picture_type=="image/jpeg"):    //jedná se o námi akceptovatelný obrázek?
                if($picture_size>10240):    //je velikost obrázku do 10 kB
                    $error = ‚Příliš velký obrázek – vložte prosím jiný (do 10 kB).‘;
                    $write=false;

Jestliže je vše v pořádku, do proměnných uložíme jména funkcí a koncovky v závislosti na typu obrázku. Poté odstraníme escape sekvence z názvu souboru, vytvoříme unikátní ID obrázku a načteme GD knihovnu pro práci s obrázky.

                else:
                    //do proměnných uložíme jména funkcí a koncovky v závislosti na typu obrázku
                    if($picture_type=="image/gif"):
                        $ext = "gif";
                        $src_function = "ImageCreateFromGIF";
                        $dst_function = "ImageGIF";
                    else:
                        $ext = "jpg";
                        $src_function = "ImageCreateFromJPEG";
                        $dst_function = "ImageJPEG";
                    endif;
                    $picture = StripSlashes($picture);    //odstraníme escape sekvence z názvu souboru
                    $unique = UniqID("");   //vytvoříme unikátní ID obrázku
                    dl("php_gd.dll");     //načteme knihovnu pro práci s obrázky

Nyní přichází na řadu zmenšení nebo zvětšení obrázku na šířku 70 px. Práce s obrázky již byla na Intervalu popsána v několika článcích, proto okomentuji pouze část. Nejprve spočítáme poměr zmenšení/zvětšení obrázku, tak aby jeho šířka byla 70 px a následně spočítáme výšku obrázku při daném poměru.

                    //zvětšení/zmenšení obrázku
                    $src = $src_function($picture);     //načteme obrázek ze souboru
                    $ratio = ImageSX($src)/70;            //poměr zmenšení/zvětšení obrázku na šířku 70 px
                    $height = Round(ImageSY($src)/$ratio); //výška obrázku při daném poměru
                    $dst = ImageCreate(70,$height);        //vytvoříme prostor pro cílový obrázek
                    ImageCopyResized($dst,$src,0,0,0,0,70,$height,ImageSX($src),ImageSY($src)); //zmenšíme obrázek
                    $dst_function($dst,"images/" . $unique . "." .$ext); //zapíšeme nový obrázek do souboru
                    ImageDestroy($src); //uvolníme paměť zdrojového obrázku
                    ImageDestroy($dst); //uvolníme paměť cílového obrázku
                endif;
            else:    //nejedná se obrázek gif, ani jpg
                $error = ‚Nejedná se o obrázek typu GIF, ani JPG, vložte prosím jiný.‘;
                $write=false;
            endif;
        endif;

Pokud uživatel poslal svůj obrázek (je zinicializovaná proměnná $unique), můžeme vytvořit cestu k obrázku. Jestliže vše proběhlo korektně, provedeme zápis do databáze a odešleme cookies, aby uživatel nemusel při vkládání příspěvků znovu vyplňovat svoje jméno a email. Na závěr ještě vypíšeme hlášku o úspěšné registraci, kterou si můžete samozřejmě jakkoli vizuálně upravit.

        if(IsSet($unique)) $link = $unique . "." . $ext; //vytvoříme cestu k obrázku
        //vše proběhlo v pořádku – provedeme zápis do databáze
        if($write):
        $add = MySQL_Query("INSERT INTO users VALUES (‚$name‘, ‚$password‘, ‚$email‘, ‚$link‘)") or die($query_error);
        //odešleme cookies
        SetCookie("cookie_author", $name);
        SetCookie("cookie_email", $email);
        //vypíšeme hlášku o úspěšné registraci a po 5s se vrátíme na úvodní stránku
        echo ‚<html><head><META HTTP-EQUIV="Refresh" CONTENT="5; URL=index.php">
             <body>
                 <b>Registrace proběhla úspěšně</b>:<br><br>
                 Jméno:‘ . $name . ‚<br>
                Email:‘ . $email . ‚<br>
                Obrázek: <img src="images/‘ . $link . ‚" border="0" alt=""><br><br><br>
                Za 5 vteřin budete přesměrováni.
             </body></head></html>‘;
        endif;
    endif;
    MySQL_Close();            //zavřeme databázi
endif;

Pokud však zápis neproběhl, musíme pochopitelně zobrazit registrační formulář a na jeho konci případnou chybovou hlášku. Další komentář snad tento jednoduchý formulář nepotřebuje.

if(!$write): //neproběhl zápis?
    $width=50;
    require ("header.php");    //vložíme hlavičku
?>
    <table width="50%" border="0" cellspacing="0" cellpadding="1" align="center" bgcolor="Black"><tr><td>
    <table width="100%" border="0" cellspacing="0" cellpadding="3" align="center" bgcolor="white">
     <tr bgcolor="#4A4A4A"><td colspan="2" class="tableheading">Registrace nového uživatele </td></tr>
     <form method="post" enctype="multipart/form-data">
     <tr><td class="table">Obrázek:</td><td><input type="file" name="picture" size="30" class="input" style="WIDTH: 250px"></td></tr>
     <tr><td class="table"><b>Vaše jméno (přezdívka):</b></td><td><input type="text" name="name" value="<?echo $name?>" size="30" maxlength="50" class="input" style="WIDTH: 250px"></td></tr>
     <tr><td class="table"><b>Heslo:</b></td><td><input type="password" name="password" size="30" maxlength="20" class="input" style="WIDTH: 250px"></td></tr>
     <tr><td class="table"><b>Heslo znovu:</b></td><td><input type="password" name="password_2" size="30" maxlength="20" class="input" style="WIDTH: 250px"></td></tr>
     <tr><td class="table">Váš email:</td><td><input type="text" name="email" value="<?echo $email?>" size="30" maxlength="50" class="input" style="WIDTH: 250px"></td></tr>
     <input type="hidden" name="sent" value="">
     <tr><td colspan="2" align="center"><input type="submit" name="send" value="Odeslat" class="input"></td></tr>
    </table></td></tr></table>
    </form>
    <?if (IsSet($error)) echo ‚<center><font class="error">‘ . $error . ‚</font></center>‘;    //chybová hláška?>
    </body></html>
<?endif;?>

Tímto končí úvodní série článků o Diskusní fóru v PHP s použitím databáze. Podle ohlasů budou možná následovat další díly a s nimi samozřejmě některá vylepšení. Každopádně kompletní zdrojový kód si můžete stáhnout již teď.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *