Regitrace uživatelů - čast. 2 ( práce s PHP a MySQL)

 2012-09-18 00:00:00
 Dmitry Burobin

Toto je pokračování první části o registraci uživatelů. Doplníme registraci o několik věci: přidame avatar ( obrázek ), šifrování hesla, ochranu proti hádání hesla, ukládání uživatele.

Začíname

Začneme tím, že doplníme naši tabulku users o pole avatar, kam budeme uklálát cestu k avataru uživatele.
phpmyadmin

phpmyadmin
Taktéž vytvoříme složku avatar, do které se budou ukládát obrázky. Složka avatar se musí nacházet ve stejné složce se všema skripty.

registration.php

Dál doplníme soubor registration.php, najděte tag form a dopište atribut enctype="multipart/form-data":

<h1>Registrace nového uživatele</h1>
<
form action="pridavani.php" method="POST" enctype="multipart/form-data">
a ještě pole pro přidávaní avataru:
<div><label for="login">login:</label></div>
    <
div><input type="text" name="login"></div>
<!--  Do 
textového pole se jménem login name="login" nový uživatel zadá svůj login  -->

    <
div><label for="avatar">AvatarObrázek musi být ve formatu jpggif nebo png:</label></div>
    <
div><input type="FILE" name="avatar"></div>
<!--  do 
proměnné avatar se uloži obrázekkterý vybral uživatel  -->
    
    <
div><label for="heslo">Heslo:</label></div>
    <
div><input type="password" name="heslo"></div>
Uložte soubor.

pridavani.php

Potom doplníme soubor pridavani.php:

  • 1. Na začátku vložíme soubor function.inc.php, který bude obsahovat funkce pro pro načtení obrázku na server a pro přizpůsobování velikosti obrázku.
  • 2. Pak zjistime, zda uživatel zadál avatar.
  • 3. Nezapomeňte doplnít příkaz pro vkládání dat do databázi o pole avatar.
<?php
header('Content-type: text/html;charset=UTF-8');

// Vložime potřebné funkce
require_once 'function.inc.php';

    
if(isset(
$_POST['go'])){    //jestli tlačítko bylo zmačknuté tak jdi dál, jinak budete přesměrování na stránku pro registraci nového uživatele

    
if(isset($_POST['name']))
    {
        
$name stripcslashes(htmlspecialchars(trim($_POST['name'])));
        if(
$name == '')
        {
                unset(
$name);
        }
    }
//uložime do proměnné $name jméno, které uživatel zadál ve formuláři, 
//a hned ji ošetříme několika funkcemi, aby ani tagy ani skripty nefungovali a odstraníme mezery ( trim ) 
//Jestli je proměnná prázdna tak ji odstraníme.

    
    
if(isset($_POST['login']))
    {
        
$login stripcslashes(htmlspecialchars(trim($_POST['login'])));
        if(
$login == '')
        {
                unset(
$login);
        }
    }
//uložime do proměnné $login login, který uživatel zadál ve formuláři, 
//a hned ji ošetříme několika funkcemi, aby ani tagy ani skripty nefungovali a odstraníme mezery ( trim ) 
//Jestli je proměnná prázdna tak ji odstraníme.
    
    
if(isset($_POST['heslo']))
    {
        
$heslo stripcslashes(htmlspecialchars(trim($_POST['heslo'])));
        if(
$heslo == '')
        {
                unset(
$heslo);
        }
    }
//uložime do proměnné $heslo heslo, které uživatel zadál ve formuláři, 
//a hned ji ošetříme několika funkcemi, aby ani tagy ani skripty nefungovali a odstraníme mezery ( trim ) 
//Jestli je proměnná prázdna tak ji odstraníme.


//V případě, že jakákoli proměnná je prázdna, zastavíme skript a vyvedeme hlášení    
    
if(empty($name) or empty($login) or empty($heslo))
    {
        exit(
"Vyplňte všechna pole");
    }


//--------------NOVÉ------------------------------------------//


// ověřujeme, zda uživatel vložil obrázek
if(!empty($_FILES['avatar']['name']))
{
// Uložime obrázek ( název ) do proměnné avatar a ošetřime ji
   
$avatar upload_file();
// Jestli se proměnná rovna 0 nebo je prázdna  
   
if($avatar == '' OR empty($avatar)) 
   {
// V případě, že proměnná je prázdna odstraníme ji
      
unset($avatar);
   }
}



if(!isset(
$avatar) OR empty($avatar) OR $avatar == '')
{
// V případě, že proměnná neexistuje, automatický přiřádime uživateli obrázek s nadpisem "Nemá avatar"
// nakreslete obrázek no_avatar.jpg nebo stáhněte jej z archivu k článku
    
$avatar "no_avatar.jpg"
} else {
// Uděláme z původního obrázku, obrázek o velikosti 90x90    
    
$mini_av resizeimg("avatar/$avatar","avatar/mini-$avatar",90,90);     
        
$avatar 'mini-'.$avatar;
}   

// Zašifrujeme heslo pomocí algoritmu md5       
$heslo    md5($heslo); 
// Ještě přidáme reverzí       
$heslo    strrev($heslo); 

// můžete přidat několik sybmolů, např. "g5ds8". V případě, že takto ošetřené heslo někdo bude chtít prolomit Brute Forcem ( hádání hesla )
// a použijí k tomu md5, pak se ničeho nedocíli. Můžete taky přidat symboly na začátku nebo uprostřed hesla.          
$heslo    $heslo."g5ds8";


// Nezapomeňte přidat pole `avatar` do SQL příkazu pro vkládáni dat do databáze  

//--------------KONEC NOVÉHO------------------------------------------//



//Vložíme soubor s připojením k databázi. ( musí se nacházet ve stejné složce )    
    
require_once 'db.php';

//Ověřujeme, zda jíž není uživatel se stejným loginem    
    
$q1 mysql_query("SELECT * FROM `users` WHERE `login`='".$login."'");
    if(!
$q1) { echo mysql_error() . ' - ' mysql_errno(); }
    else {
//Jestli existuje tak vyvedeme hlášení
        
if(mysql_num_rows($q1)==1){
            exit(
"Uživatelské jméno je obsazené, vyberte si jiné");
        } else {
//V případě, že není tak vložíme data o novém uživateli do databáze
            
$q2 mysql_query("INSERT INTO `users`(`name`,`login`,`pass`,`avatar`) VALUES('".$name."','".$login."','".$heslo."','".$avatar."')");
            if(!
$q2) { echo mysqll_error() . ' - ' mysql_errno(); }
            else {
                echo 
"Děkuji za registraci, teď se můžete <a href=\"index.php\">přihlásit</a>.";
                
            }
        }
    }
    
} else { 
header("Location: ".$_SERVER['SERVER_ROOT']."registration.php"); }
?>

function.inc.php

Soubor function.inc.php:

<?php
// Funkce pro načtení obrázku na server
function upload_file()
{
// pole s dostupnými formáty obrázků
    
$arr = array(".jpeg",".gif",".png",".jpg",".JPG",".PNG",".GIF");
    
// jestli nenastala žádna chyba a velikost obrázku je větší jak 0
    
if($_FILES['avatar']['error'] ==&amp;&amp$_FILES['avatar']['size'] >0)
    {
// zjistime formát obrázku
        
$type strrchr($_FILES['avatar']['name'], ".");
// do proměnné $name uložime název obrázku
        
$name $_FILES['avatar']['name'];
// cesta, kam se uloži obrázek
        
$upname "avatar/".$_FILES['avatar']['name'];

// Jestli formát nahráneho souboru odpovída formátům povoleným v poli $arr
// Soubor se přesune do složky avatar        
        
if(in_array($type,$arr))          
            
move_uploaded_file($_FILES['avatar']['tmp_name'], $upname);

// Zjistime, zda soubor byl nahrán na server      
        
if(file_exists($upname))
            return 
$name;
        else
            return 
false;          
    }
    else
    {
        return 
false;
    }
}


// Funkce pro přizpůsobování velikosti obrázku, uděláme obrázek 90x90
function resizeimg($filename$smallimage$w$h


// Definujeme poměr komprese obrázku     
    
$ratio $w/$h
// Velikost původního obrazu    
    
$size_img getimagesize($filename); 
// Pokud je velikost menší, pak nemusíme škálovat
    
if (($size_img[0]<$w) &amp;&amp; ($size_img[1]<$h)) return true
// Kompresní poměr původního obrázku
    
$src_ratio=$size_img[0]/$size_img[1]; 

// Dále vypočítame velikost zmenšené kopie, abysme zachovali proporce původního obrazu 
// Toto můžete odstranit abyste měli obrázky velikosti přesně 90x90  
    
if ($ratio<$src_ratio
    { 
      
$h $w/$src_ratio
    } 
    else 
    { 
      
$w $h*$src_ratio
    } 
// Vytvořime prázdný obrázek s definovanou velikosti 
    
$dest_img imagecreatetruecolor($w$h);   
    
$white imagecolorallocate($dest_img255255255);        
    if (
$size_img[2]==2)  $src_img imagecreatefromjpeg($filename);                       
    else if (
$size_img[2]==1$src_img imagecreatefromgif($filename);                       
    else if (
$size_img[2]==3$src_img imagecreatefrompng($filename);  

// škálujeme obrázek pomocí funkci imagecopyresampled() 
// $dest_img - zmenšená kopie
// $src_img - původní obrázek 
// $w - šířka zmenšene kopie
// $h - výška zmenšene kopie         
// $size_img[0] - šířka původního obrázeku 
// $size_img[1] - výška původního obrázeku 
    
imagecopyresampled($dest_img$src_img0000$w$h$size_img[0], $size_img[1]);                 
// Uložime zmenšenou kopii do souboru  
    
if ($size_img[2]==2)  imagejpeg($dest_img$smallimage);                       
    else if (
$size_img[2]==1imagegif($dest_img$smallimage);                       
    else if (
$size_img[2]==3imagepng($dest_img$smallimage);  
// Vyčístime paměť od vytvořených obrázků 
    
imagedestroy($dest_img); 
    
imagedestroy($src_img); 
    return 
true;          
}
?>

Tabulka chyba

Teď přidame ještě jednu tabulku ( chyba ) do stejné databázi, ve které budou uložený ip adresy všech uživatelů, kdo udělal chybu při zadávání dat při přihlášení. Tímto omezíme přístup uživatelům, kteři chybovali víc jak 3 krát, například na 15 minut.

CREATE TABLE `chyba` (
`id` INT( 5 ) NOT NULL AUTO_INCREMENT,
`ip` VARCHAR( 12 ) NOT NULL,
`date` DATETIME,
`errors` INT( 1 ) NOT NULL,
PRIMARY KEY (`id`)
)ENGINE=MYISAM CHARACTER SET utf8 COLLATE utf8_unicode_ci

ip - ip adresa uživatele, errors - množstvi chybných přihlášení.

overeni.php

Upravíme soubor overeni.php

<?php
.
.
.
//V případě, že jakákoli proměnná je prázdna, zastavíme skript a zobrazime hlášení        
    
if(empty($login) or empty($heslo))
    {
        exit(
"Vyplňte všechna pole");
    }

//Vložíme soubor s připojením k databázi. ( musí se nacházet ve stejné složce )        
    
require_once 'db.php';




//--------------NOVÉ------------------------------------------//

// Zjistime ip 
    
$ip=getenv("HTTP_X_FORWARDED_FOR");
    if(empty(
$ip) || $ip=='unknown') { $ip=getenv("REMOTE_ADDR"); } 

// Odstraňujeme ip uživatelů, kteři chybovali při přihlášení, po 15 minutách                       
    
mysql_query("DELETE FROM `chyba` WHERE UNIX_TIMESTAMP() - UNIX_TIMESTAMP(`date`) > 900");
    
// Vypišeme z databáze množstvi chybných pokusů přihlášení u uživatele s určitým ip 
    
$error mysql_query("SELECT `errors` FROM `chyba` WHERE `ip`='".$ip."'");
    
$r_error mysql_fetch_assoc($error);

    if(
$r_error['errors'] > 2
    {
// V případě, že chybných přihlášení je víc jak 2, zobrazíme hlášení
        
exit("Zadali jste nesprávně uživatelské jméno nebo heslo 3 krát. Počkejte 15 minut pro další pokus.");
    }          
    
// Zašifrujeme heslo pomocí algoritmu md5       
    
$heslo    md5($heslo); 
// Ještě přidáme reverzí       
    
$heslo    strrev($heslo); 

// můžete přidat několik sybmolů, např. "g5ds8". V případě, že takto ošetřené heslo někdo bude chtít prolomit Brute Forcem ( hádání hesla )
// a použijí k tomu md5, pak se ničeho nedocíli. Můžete taky přidat symboly na začátku nebo uprostřed hesla.          
    
$heslo    $heslo."g5ds8";

// Vypišeme z databáze veškera data o uživateli s zadaným loginem a heslem
    
$q1 mysql_query("SELECT * FROM `users` WHERE `login`='".$login."' AND `pass`='".$heslo."'");
    if(!
$q1) { echo mysql_error() . ' - ' mysql_errno(); }
    else
    {
        
$r1 mysql_fetch_assoc($q1);

        if(empty(
$r1['id']))
        {
// V případě, že uživatel neexistuje, přidame záznam do tabulky chyba, že uživatel s touto ip adresou se nepřihlásil  
            
$sel_ip mysql_query("SELECT `ip` FROM `chyba` WHERE `ip`='".$ip."'");
            
$r_ip mysql_fetch_row($sel_ip);
            
// Ověřujeme, zda uživatel jíž není v tabulce
            
if($ip == $r_ip[0])
            {
                
$sel_errors mysql_query("SELECT `errors` FROM `chyba` WHERE `ip`='".$ip."'");
                
$r_errors mysql_fetch_assoc($sel_errors);
// Přidame ještě jeden nepovedený pokus
                
$count $r_errors['errors'] + 1;
                
// Dále aktualizujeme tabulku chyba
                
mysql_query("UPDATE `chyba` SET `errors` = '".$count."', date = NOW() WHERE `ip`='".$ip."'");
            } else {
// V případě, že uživatel ještě nechyboval přidame nový záznam
                
mysql_query("INSERT INTO `chyba` (`ip`,`date`,`errors`) VALUES('".$ip."',NOW(),'1')");
            }
            
            exit(
"Je nám líto, zadali jste chybné uživatelské jméno nebo heslo");
        } else {
// V připadě, že uživatelské jméno a heslo odpovídají ( jsou v databázi ),
// Vytvořime uživatelsou session.            
            
$_SESSION['heslo'] = $r1['pass']; 
            
$_SESSION['login'] = $r1['login']; 
            
$_SESSION['id'] = $r1['id'];

// Dále uložime data do COOKIE, pro pozdější přihlášení                
// POZOR!!! DATA V COOKIE NEJSOU ŠIFROVÁNÁ, DĚLEJTE TO NA ZÁKLADĚ VLASTNÍHO UVÁŽENÍ            
            
if($_POST['save'] == 1
            {
// Jestli uživetel chce, aby jeho data byla uložena pro pozdější přihlášení, pak uložime je do COOKIE souboru prohlížeče 
                
setcookie("login"$_POST['login'], time()+9999999);
                
setcookie("password"$_POST['heslo'], time()+9999999);
            }                  
            
            
header("Location: ".$_SERVER['SERVER_ROOT']."index.php");
        }
    }

//--------------KONEC NOVÉHO------------------------------------------//

    

} else { header("Location: ".$_SERVER['SERVER_ROOT']."index.php"); }
?>

index.php

Úplně změnime soubor index.php, zobrazíme avatar a checkbox pro pamatování hesla a logina.

<?php
session_start();
//Celý postup funguje na sessions. Právě v session se ukládají data uživatele, zatímco se nacházi na stránkach. Je důležite spustit sessions na začátku stránky!  

if($_GET['action']=='odhlasit_se'){

    
$_SESSION['login']='';
    
$_SESSION['heslo']='';
    
$_SESSION['id']='';
    unset(
$_SESSION['login']);
    unset(
$_SESSION['heslo']);
    unset(
$_SESSION['id']);
    
}

//Vložíme soubor s připojením k databázi. ( musí se nacházet ve stejné složce )    
require_once 'db.php';
 
// V případě, že session nejsou prázdné a obsahují heslo a login, vybereme z databáze avatar tohoto uživatele
if(!empty($_SESSION['login']) and !empty($_SESSION['heslo']))
{
    
$login $_SESSION['login'];
    
$heslo $_SESSION['heslo'];
    
$q_ava mysql_query("SELECT `id`,`avatar` FROM `users` WHERE `login` = '".$login."' AND `pass` = '".$heslo."'"); 
    
$r_ava mysql_fetch_array($q_ava);
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
>
<
html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<
head>
    <
title>Přihlašení uživatele</title>
    <
meta http-equiv="content-type" content="text/html;charset=utf-8" />

<
style>

.
back{
    
font-size:10pt;
    
margin-top:20px;
}

</
style>
    
</
head>

<
body>
<?php
//Ověřujeme, zda byla vybrána nějaka data z databáze ( avatar ). Jestli ne v COOKIE jsou špatné heslo nebo login.
if(empty($r_ava['avatar']) OR !isset($r_ava['avatar']) OR $r_ava['avatar']=='')
{
echo 

<h1>Přihlaste se</h1>
<form action="overeni.php" method="POST">
<!--  overeni.php je skript pro ověření zadaných dat, tzn. po klíknutí na tlačítko Ok se data pošlou do tohoto souboru metodou POST  -->

    <div><label for="login">login:</label></div>'
;
// Jestli existuje proměnná COOKIE['login']. Bude jestli uživatel při předchozím přihlášení zaškrtnul políčko "Zapamatovat mě"   
    
if(isset($_COOKIE['login']))
    {
// Do atributu value přidame hodnotu proměnné COOKIE s loginem
        
echo '<div><input type="text" name="login" value="'.$_COOKIE['login'].'"></div>';
    } else {
        echo 
'<div><input type="text" name="login" ></div>';
    }    
    
echo 
'    <div><label for="heslo">Heslo:</label></div>';
// Jestli existuje proměnná COOKIE['login']. Bude jestli uživatel při předchozím přihlášení zaškrtnul políčko "Zapamatovat mě"   
    
if(isset($_COOKIE['password']))
    {
// Do atributu value přidame hodnotu proměnné COOKIE s heslem
        
echo '<div><input type="password" name="heslo" value="'.$_COOKIE['password'].'"></div>';
    } else {
        echo 
'<div><input type="password" name="heslo" ></div>';
    }
           
echo 
'
<div><input name="save" type="checkbox" value="1">Zapamatovat mě.</div>
<div><input type="submit" name="go" value="Ok"></div>
</form>'
;

echo 
"Ahoj návtěvníku. Tyto <a href=\"#\">stránky</a> můžou navštívit jen registrované uživatele";        
echo 
'<div class="back"><a href="registration.php">registrace</a></div>';  
    
} else {
//V případě, že v databázi je obrázek u uživatele s heslem a loginem, které máme uložené v COOKIE    
 
 
  
echo "<h1>Ahoj ".$_SESSION['login']."</h1> 
 <p>Tyto <a href=\"http://www.complux.eu/cz/\">stránky</a> můžou navštívit jen registrované uživatele</p>
 <p><a href=\""
.$_SERVER['PHP_SELF']."?action=odhlasit_se\">Odhlásit se</a></p>";

// Zobrazime Váš obrázek ( avatar ), cestu máme v proměnné $r_ava 
  
echo 'Váš obrázek:<br><img alt='.$_SESSION['login'].' src=avatar/'.$r_ava['avatar'].'>';         
}
?>
</body></html>

Závěr

Už máme funkčnější registraci. V dalším článku přidame captchu, osobní stránky uživatelů, soukromé zprávy uživatelům.

Systém Orphus
Napište komentář.
Celkem komenrářů(43)
Haroreab - 2017-11-07  11:45:35
 Propecia Canada Online Cash On Delivery Fluoxetine Overseas [url=http://cheapvia100mg.com]viagra[/url] Online Meds Why Is My Alli So Expensive
Haroreab - 2017-11-07  11:45:33
 Propecia Canada Online Cash On Delivery Fluoxetine Overseas [url=http://cheapvia100mg.com]viagra[/url] Online Meds Why Is My Alli So Expensive
Haroreab - 2017-11-07  11:45:32
 Propecia Canada Online Cash On Delivery Fluoxetine Overseas [url=http://cheapvia100mg.com]viagra[/url] Online Meds Why Is My Alli So Expensive
Haroreab - 2017-11-07  11:45:30
 Propecia Canada Online Cash On Delivery Fluoxetine Overseas [url=http://cheapvia100mg.com]viagra[/url] Online Meds Why Is My Alli So Expensive
Haroreab - 2017-11-02  22:17:58
 Magasin Levitra 20mg Buy Amitriptyline No Percription [url=http://cheapviapills.com]viagra[/url] E Drugstog Viagra Baclofene Dose Seuil Viagra Europe
Haroreab - 2017-10-29  08:51:25
 Viagra Rezeptfrei Auf Rechnung Cialis 20 Mg 8 Compresse [url=http://mailordervia.com]viagra[/url] Cyklokapron
Haroreab - 2017-10-29  08:51:23
 Viagra Rezeptfrei Auf Rechnung Cialis 20 Mg 8 Compresse [url=http://mailordervia.com]viagra[/url] Cyklokapron
Haroreab - 2017-10-29  08:51:22
 Viagra Rezeptfrei Auf Rechnung Cialis 20 Mg 8 Compresse [url=http://mailordervia.com]viagra[/url] Cyklokapron
Haroreab - 2017-10-29  08:51:20
 Viagra Rezeptfrei Auf Rechnung Cialis 20 Mg 8 Compresse [url=http://mailordervia.com]viagra[/url] Cyklokapron
Haroreab - 2017-10-25  07:55:27
 Advances Keflex Commander Xenical En Ligne [url=http://cheapestcial.com]cialis[/url] Cialis Jambes Lourdes Keflex Drug Interactions Amoxicillin For Strep
Haroreab - 2017-10-25  07:55:26
 Advances Keflex Commander Xenical En Ligne [url=http://cheapestcial.com]cialis[/url] Cialis Jambes Lourdes Keflex Drug Interactions Amoxicillin For Strep
Haroreab - 2017-10-25  07:55:24
 Advances Keflex Commander Xenical En Ligne [url=http://cheapestcial.com]cialis[/url] Cialis Jambes Lourdes Keflex Drug Interactions Amoxicillin For Strep
Haroreab - 2017-10-25  07:55:23
 Advances Keflex Commander Xenical En Ligne [url=http://cheapestcial.com]cialis[/url] Cialis Jambes Lourdes Keflex Drug Interactions Amoxicillin For Strep
Haroreab - 2017-10-22  08:11:17
 Liquid Amoxicillin Dosage Propecia Where To Buy Pharmacy [url=http://leviinusa.com]generic levitra l tabs[/url] Forum Priligy 2012 England Study Gonerrhea Amoxicillin Hiconcil Buy Online
Haroreab - 2017-10-06  21:05:46
 buy accutane in usa Cialis Viagra Online Mejor Ora Para Tomar Propecia [url=http://costofcial.com]cialis buy online[/url] Cheap Generic Drugs From India Comprar Levitra 20 Mg Levitra 40 Mg Best Price
Haroreab - 2017-10-06  21:05:45
 buy accutane in usa Cialis Viagra Online Mejor Ora Para Tomar Propecia [url=http://costofcial.com]cialis buy online[/url] Cheap Generic Drugs From India Comprar Levitra 20 Mg Levitra 40 Mg Best Price
Haroreab - 2017-10-06  21:05:43
 buy accutane in usa Cialis Viagra Online Mejor Ora Para Tomar Propecia [url=http://costofcial.com]cialis buy online[/url] Cheap Generic Drugs From India Comprar Levitra 20 Mg Levitra 40 Mg Best Price
Haroreab - 2017-10-06  21:05:42
 buy accutane in usa Cialis Viagra Online Mejor Ora Para Tomar Propecia [url=http://costofcial.com]cialis buy online[/url] Cheap Generic Drugs From India Comprar Levitra 20 Mg Levitra 40 Mg Best Price
Haroreab - 2017-10-01  01:14:10
 Levitra Effetto Ritardante [url=http://cialtobuy.com ]online pharmacy[/url] Baclofene Commander
Haroreab - 2017-10-01  01:14:09
 Levitra Effetto Ritardante [url=http://cialtobuy.com ]online pharmacy[/url] Baclofene Commander
[1] [2] [3] 
*v komentářich nesmíte používat sprostá slova a odkazy!!!Děkuji za pochopeni.