Jump to content

Tutorial Php Login / Register (Logare / Inregistrare)


Courage

Recommended Posts

  • Moderators

Mai întâi introducem datele bazei de date în fişierul conf_global.php:

<?php

//--------------------------------------------------
// Editaţi cele 4 variabile de mai jos
//--------------------------------------------------

$sql_host = 'localhost';
$sql_user = 'utilizator';
$sql_parola = 'parola';
$sql_baza_de_date = 'baza_de_date';

/**
 * Functia de conectare la baza de date
 * 
 * @param $host
 * @param $user
 * @param $pass
 * @param $db
 * @return connection
 */

function conectare($host, $user, $pass, $db) 
{ 
	$mysqli = new mysqli($host, $user, $pass, $db);
	if($mysqli->connect_error) 
	{
		die('Eroare la conectare (' . mysqli_connect_errno() . ') '. mysqli_connect_error());
	}
	return $mysqli;
}


$conexiune = conectare($sql_host, $sql_user, $sql_parola, $sql_baza_de_date);


?>

Apoi creăm tabelul `membri` cu următoarea comandă SQL:

CREATE TABLE IF NOT EXISTS `membri` (
`id` int(11) NOT NULL,
  `nume` varchar(255) NOT NULL,
  `parola` varchar(1000) NOT NULL,
  `email` varchar(50) NOT NULL
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Vom avea 4 câmpuri:

  • id - Auto Increment
  • nume
  • parola
  • email

Dacă mai doriţi, puteţi adăuga după :)

 

În fişierul index.php, adăugăm sus de tot

<?php 
require_once('functii.php');
?>

În locul unde vrem să adăugăm link-urile de Logare / Înregistrare / Delogare, adăugăm

<?php
echo member_navigation();
?>

Iar în locul unde vrem să adăugăm căsuţele de logare / înregistrare, adăugăm:

<?php
echo content();
?>

Vor apărea nişte erori, deoarece facem apel la nişte funcţii nedeclarate (nu îmi place să aglomerez index-ul, aşa că prefer să fac totul în fişiere separate)

 

Acum creăm fişierul functii.php.

 

 

Sus de tot adăugăm

<?php
session_start(); // începerea sesiunii
require_once('conf_global.php'); // fişierul care include conectarea la baza de date

Pentru a cripta parola în baza de date, ne vom folosi de funcţia următoare: (nu folosesc md5 simplu deoarece am văzut site-uri cu sute de mii / milioane parole salvate, cu echivalentul lor în md5)

function criptare ($text)
{
	return hash('sha512', hash('sha256', sha1(sha1(sha1(md5(md5($text)))))));
}

Pentru a afişa link-ul de logare / înregistrare / delogare, includem următoarea funcţie:

function member_navigation()
{
	if (!isset($_SESSION['uid']))
	{
		echo "<a href='?action=login'>Autentificare</a> | <a href='?action=register'>Înregistrare</a>";
	}
	else
	{
		echo "Bun venit, ".$_SESSION['username'].". <a href='?action=logout'>Delogare</a>";
	}
}

Pentru conţinutul site-ului, adăugăm funcţia următoare:

function content()
{
	if (!isset($_GET['action'])) // link-ul pe care ne aflăm este index.php
	{	
		echo 'Conţinutul site-ului';
	}
	else
	{
		$action = $_GET['action'];
		if ($action == 'login') // link-ul este index.php?action=login
		{
			echo login();
		}
		elseif ($action == 'register') // link-ul este index.php?action=register
		{	
			echo register();
		}
		else if ($action == 'logout') // link-ul este index.php?action=logout
		{	
			logout();
		}
	}
}

În continuare vom include cele 3 funcţii de mai sus (login, register şi logout).

 

 

 

Funcţia login:

function login()
{
    global $conexiune;
    $mesaj = '';
    
    /* Formularul de logare a fost trimis */
    if (isset($_POST['user']))
    {
        $user = $_POST['user'];
        $pass = $_POST['pass'];

        //-----------------------------------------
        // Verificam daca a rămas cel puţin o
        // casuţă necompletată
        //-----------------------------------------
        
        if ($user == '' OR $pass == '')
        {
            $mesaj = '<br /><b style="color: darkred">Cel puţin un câmp a rămas necompletat!</b><br /><br />';
        }
        
        else
        {
            $sql = "SELECT * FROM `membri` WHERE nume='".htmlentities($user)."' AND parola='".criptare($pass)."' LIMIT 1";
            
            $res = mysqli_query($conexiune, $sql) or die(mysql_Error());
            
            if (mysqli_num_rows($res) == 1)
            {
                $rand = mysqli_fetch_array($res);
                
                $_SESSION['uid'] = $rand['id'];
                $_SESSION['username'] = $rand['nume'];
                
                //-----------------------------------------
                // Redirectionare pe pagina principală,
                // odată ce logarea s-a efectuat cu succes
                //-----------------------------------------
                
                echo '<meta http-equiv="refresh" content="0; url=index.php" />';
                exit();
            }
            
            //-----------------------------------------
            // Nu am gasit niciun membru in baza de
            // date cu datele introduse
            //-----------------------------------------
            
            else
            {
                $mesaj = '<br /><b style="color: darkred">Date incorecte!</b><br /><br />';
            }
        }
    }
    
    //-----------------------------------------
    // Formularul de logare
    //-----------------------------------------
    
$HTML = <<<PHP
    <center><span style="font-size: 40px;">Autentificare</span></center>
    $mesaj
    <form action="" method="post">
    <b>Utilizator</b><br /> <input type="text" name="user" value="" /><br /><br />
    <b>Parola</b><br /> <input type="password" name="pass" value="" ><br>
    <input type="submit" name="Login" value="Login" >
    </form>
PHP;
    
    return $HTML;
    
}

Funcţia de înregistrare:

function register()
{
        global $conexiune;
	$mesaj = "";
	
	if (isset($_POST['user']))
	{
	
		$user = $_POST['user'];
		$pass1 = $_POST['pass1'];
		$pass2 = $_POST['pass2'];
		$email = $_POST['email'];

                //----------------------------------------------
                // Cel puţin o căsuţă a rămas necompletată
                //----------------------------------------------
		
		if ($user == '' OR $pass1 == '' OR $pass2 == '' OR $email == '')
		{
			$mesaj .= '<b style="color: darkred">Cel puţin o căsuţă a rămas necompletată!<br /><br /></b>';
		}

                //----------------------------------------------
                // Parolele introduse nu coincid
                //----------------------------------------------
		
		if ($pass1 != $pass2)
		{
			$mesaj .= '<b style="color: darkred">Parolele nu se potrivesc<br /><br /></b>';
		}

                //----------------------------------------------
                // Adresa email este invalidă
                //----------------------------------------------
		
		if (!filter_var($email, FILTER_VALIDATE_EMAIL))
		{
			$mesaj .= '<b style="color: darkred">Adresa email este invalidă<br /><br /></b>';
		}
		
		if ($mesaj == "") // Nu a apărut niciun mesaj de eroare
		{
		
			//-----------------------------------------
			// Verificam daca nu exista user cu acelaşi
			// username / aceeaşi adresă email
			//-----------------------------------------
			
			$cerereSQL = 'SELECT * FROM membri';
			$rezultat = mysqli_query($conexiune, $cerereSQL) or die(mysql_ERROR());
			
			while($rand = mysqli_fetch_array($rezultat)) 
			{
				
				//-----------------------------------------
				// Afişăm mesaj de eroare în caz că 
				// username-ul sau adresa email introdusă
				// este / sunt deja folosite de către
				// altcineva
				//-----------------------------------------
				
				if ($rand['nume'] == $user  OR  $rand['email'] == $email)
				{
					$mesaj .='<b style="color: darkred;">Username / email folosite</b><br /><br />';
					break;
				}
				
			}
			
			if ($mesaj == "")
			{
				
				//-----------------------------------------
				// Totul este OK, deci putem insera datele
				// introduse în baza de date
				//-----------------------------------------
				
				$sql = "INSERT INTO `membri`(`nume`, `parola`, `email`) 
                                        VALUES ('".htmlentities($user)."','".criptare($pass1)."','".$email."')";
				
				mysqli_query($conexiune, $sql) or die(mysql_Error());
				
				echo "Înregistrarea a avut loc cu succes. Veţi fi redirecţionat pe pagina principală";
				echo  '<meta http-equiv="refresh" content="1; url=index.php" />';
				exit();
			}
		}
	}
	
	$HTML = <<<INFO
	<center><span style="font-size: 40px;">Înregistrare</span></center>
	$mesaj
	<form action="" method="post">
    <b>Utilizator</b><br /> <input type="text" name="user" value="" /><br />
    <b>Parola</b><br /> <input type="password" name="pass1" value="" ><br>
	<b>Reintrodu parola</b><br /> <input type="password" name="pass2" value="" ><br>
	<b>Adresa email</b><br /> <input type="text" name="email" value="" /><br />
	<input type="submit" name="Login" value="Creează cont" >
	</form>
INFO;

	return $HTML;

}

Funcţia delogare:

function logout()
{
	session_destroy();
	echo '<meta http-equiv="refresh" content="0; url=index.php" />';
	exit();
}

La finalul fişierului adăugăm

?>

Acesta este primul meu tutorial PHP. Dacă apar nereguli / aveţi vreo obiecţie (sunt începător), postaţi aici :D

 

P.S. Da, dacă ai pierdut parola, eşti ca mort.

Mă gândesc zilele astea la o funcţie de recuperare a parolei.

  • Upvote 3
Link to comment
Share on other sites

Daca ai pierdut parola, o suprascrii cu alta noua si gata.. ai o functie care creaza o parola aleatorie, tio trimite prin mail, si apoi intrii si o schimbi in alta parola.

 

Sau, daca vrei mai elegant, primesti un link(care are atasat la capat un text mic iarasi generat aleatoriu) si accesand acel link poti schimba parola userului asociat cu acel text mic.

 

Cel putin asa vad eu problema :D

 

 

Misto tutorialul insa mi se par cam putine commenturi pentru un "tutorial" :)) 

love is a verb
Love is a doing word

Link to comment
Share on other sites

  • Moderators

Daca ai pierdut parola, o suprascrii cu alta noua si gata.. ai o functie care creaza o parola aleatorie, tio trimite prin mail, si apoi intrii si o schimbi in alta parola.

 

Sau, daca vrei mai elegant, primesti un link(care are atasat la capat un text mic iarasi generat aleatoriu) si accesand acel link poti schimba parola userului asociat cu acel text mic.

 

Yup, link-ul cred că va fi gen

index.php?action=newpassword&secretid=cod_user

unde cod_user e un număr criptat, generat după ID-ul membrului

Misto tutorialul insa mi se par cam putine commenturi pentru un "tutorial" :))

O să mai bag comentarii pe ici pe colo :D

Link to comment
Share on other sites

secretid=cod_user

Numa sa nu fie doar dupa IDul utilizatorului...ca daca e asa, pot face pt contul meu, vad ca e un md5 acolo sau ce o fi, fac md5 la mai multe IDuri si de acolo ..nah. 

 

Eventual generezi un nr aleatoriu, il pui in baza de date (mai faci o coloana in tabela aia de mai sus) si folosesti nr ala..stergandul dupa accesare (sau dupa 30 de minute dupa creare).

  • Upvote 1

love is a verb
Love is a doing word

Link to comment
Share on other sites

Cine e 'y' din ce ai scris acolo, Courage?

Si dc vrei "criptat" atata? (app sha1 md5 si astea nu sunt de criptare. Criptare inseamna ca poti reconstrui informatia originala, lucru care nu poti face cu astea :)) )

 

Totusi, de ce nuti place numar aleator? Metoda zisa de tine va genera acelasi numar de fiecare data pentru reset, si o pot reproduce usor pe calculatoru meu.. Pentru ca stiu ca sunt sanse mari sa ai un user cu IDul 1 de exemplu care poate e si administrator... 

 

Spre exemplu, pe forumul asta, userul 'gaby' are IDul cu numarul 2 (daca intrii pe profilul lui, o sa vezi un "2-gaby" acolo care probabil e IDul utilizatorului... Daca tu pornesti pe baza IDului (sau a IDului + username sau orice date care deja exista) vei fi expus atacurilor.. Acuma, probabil siteul nu va fi asa de popular cat sa aibe probleme, dar incerc sa dau si eu sfaturi constructive :D Daca faci ceva, merita facut bine.

love is a verb
Love is a doing word

Link to comment
Share on other sites

  • Moderators

Cine e 'y' din ce ai scris acolo, Courage?

 

Numar generat aleator... desi ma gandesc sa pun doar numar generat aleator, fara sa inmultesc cu ID / bla bla bla.

 

Ma gandesc cum ai spus tu: tabela noua (sa zicem cheie_recuperare_parola), valoarea '' sau NULL. Cand dau clcik pe `Am uitat parola` ma duce pe alta pagina unde compeltez Numele SAU adresa email. Se trimite email cu link-ul secret, si odata accesat isi va putea seta o noua parola. Dupa ce isi seteaza noua parola, casuta cheie_recuperare_parola o resetez la ''.

 

Vad azi ce-mi iese :D

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.