Guida alla gestione degli utenti, utilizzando il Php e database MySql

« Older   Newer »
  Share  
view post Posted on 5/4/2008, 13:05
Avatar

Staff

Group:
ForumFree Staff
Posts:
7,114

Status:


Guida alla gestione degli utenti, utilizzando il Php e database MySql

Molte persone, si chiedono come può essere inserita la registrazione degli utenti nel proprio sito;
perchè sia possibile, dovete essere dotati di uno spazio web con un database MySql ed un pannello phpMyAdmin (il mio consiglio è di usare Netsons).

Suddivisione:


Preparazione del database


Per prima cosa, è necessario preparare il database per accogliere i dati che gli verranno inviati tramite i form: accediamo al database MySql (per Netsons mysql.netsons.org), apriamo la finestra delle query image, presente nel menu laterale sinistro ed inserite questo comando:
CODICE
CREATE TABLE sessioni (
  uid CHAR(32) NOT NULL,
  user_id INT UNSIGNED NOT NULL,
  creation_date INT UNSIGNED NOT NULL,
  INDEX(uid)
);

Questo comando creerà una tabella, contenente i seguenti campi: uid serve per identificare la sessione, user_id servirà per ricondurre tale sessione all'utente mentre creation_date esprimerà la data di creazione (in secondi) della sessione, per verificare se sia scaduta o meno.
Creiamo adesso la tabella più importante, quella che accoglierà i dati degli utenti; per crearla usate questo comando, riscrivendolo come prima, nella finestra delle query:
CODICE
CREATE TABLE utenti (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(30) NOT NULL,
  email VARCHAR(30) NOT NULL,
  username VARCHAR(30) NOT NULL,
  password CHAR(32) NOT NULL,
  PRIMARY KEY(id),
  INDEX(username, password)
);

Il campo id conterrà un numero per identificare l'utente e, con l'attributo AUTO_INCREMENT farà in modo che, qualora un utente si registri, il numero presente aumenterà di 1 rispetto al precedente; i campi name, username ed email conterranno gli omonimi dati. Per quanto riguarda la password, non sarà visibile normalmente, ma verrà criptata tramite l'algoritmo MD5.
Eseguiamo ora un terzo comando, che creerà dei campi essenziali per contenere i dati per la conferma della registrazione:
CODICE
ALTER TABLE utenti
ADD indirizzo VARCHAR( 100 ) NOT NULL,
ADD occupazione VARCHAR( 100 ) NOT NULL,
ADD temp SET( '0', '1' ) NOT NULL,
ADD regdate VARCHAR( 11 ) NOT NULL,
ADD uid VARCHAR( 32 ) NOT NULL;

Esaminiamo di nuovo, uno ad uno, i seguenti campi, tralasciando indirizzo ed occupazione dei quali si capisce lo scopo: temp, il quale avrà valore 0 o 1, servirà per lo stato di convalida: 0 indicherà che l'account è sato convalidato e perciò può effettuare il login, 1 indicherà che l'account in questione necessita ancora di una convalida, che dovrà essere effettuata tramite il link inviato tramite mail; regdate conterrà la data iin cui è stata effettuata la registrazione, mentre uid conterrà il codice necessario per la conferma.

Librerie e form


Siamo ora giunti alla parte principale della guida: la realizzazione dei file in Php e dei form a loro associati necessari per eseguire la registrazione, logout e login.
Iniziamo creando un file config.php:
SPOILER (click to view)
CODICE
<?php
$_CONFIG['host'] = "host_del_database";
$_CONFIG['user'] = "nome_utente";
$_CONFIG['pass'] = "password";
$_CONFIG['dbname'] = "nome_del_database";
$_CONFIG['site_url'] = "http://tuo_sito/";

$_CONFIG['table_sessioni'] = "sessioni";
$_CONFIG['table_utenti'] = "utenti";

$_CONFIG['expire'] = 60; // secondi
$_CONFIG['regexpire'] = 24; //ore

$_CONFIG['check_table'] = array(
       "username" => "check_username",
       "password" => "check_global",
       "name" => "check_global",
       "email" => "check_global",
       "mail" => "check_global"
);

function check_username($value){
       global $_CONFIG;
       
       $value = trim($value);
       if($value == "")
               return "Il campo non può essere lasciato vuoto";
       $query = mysql_query("
       SELECT id
       FROM ".$_CONFIG['table_utenti']."
       WHERE username='".$value."'");
       if(mysql_num_rows($query) != 0)
               return "Nome utente già utilizzato";
       
       return true;
}

function check_global($value){
       global $_CONFIG;
       
       $value = trim($value);
       if($value == "")
               return "Il campo non può essere lasciato vuoto";
       
       return true;
}


//--------------
define('AUTH_LOGGED', 99);
define('AUTH_NOT_LOGGED', 100);

define('AUTH_USE_COOKIE', 101);
define('AUTH_USE_LINK', 103);
define('AUTH_INVALID_PARAMS', 104);
define('AUTH_LOGEDD_IN', 105);
define('AUTH_FAILED', 106);

define('REG_ERRORS', 107);
define('REG_SUCCESS', 108);
define('REG_FAILED', 109);

$conn = mysql_connect($_CONFIG['host'], $_CONFIG['user'], $_CONFIG['pass']) or die('Impossibile stabilire una connessione');
mysql_select_db($_CONFIG['dbname']);
?>

Le modifiche da apportare sono molto intuitive, infatti le parti da modificare sono solo le seguenti:
CODICE
$_CONFIG['host'] = "host_del_database";
$_CONFIG['user'] = "nome_utente";
$_CONFIG['pass'] = "password";
$_CONFIG['dbname'] = "nome_del_database";
$_CONFIG['site_url'] = "http://tuo_sito/";

Ricordatevi di modificare anche $_CONFIG['expire'] = 60; che indica la durata della sessione (è preimpostata a 1 minuto); inoltre, al posto di "http://tuo_sito/", dovete inserire l'url della directory nella quale sono contenuti i vari file che creeremo successivamente (esempio: http://mio_sito.ext/miadirectory/).
Nota:L'url della directory o del sito, deve terminare con una / o si creerà un errore nel codice contenuto nella mail di conferma!

Dopo aver inserito le impostazioni del database, passiamo a compilare le librerie per l'autenticazione e la registrazione:
File reg.lib.php:
SPOILER (click to view)
CODICE
<?php
function reg_register($data){
       //registro l'utente
       global $_CONFIG;
       
       $id = reg_get_unique_id();
       mysql_query("
       INSERT INTO ".$_CONFIG['table_utenti']."
       (name, email, indirizzo, occupazione, username, password, temp, regdate, uid)
       VALUES
       ('".$data['name']."','".$data['email']."','".$data['indirizzo']."',
       '".$data['occupazione']."','".$data['username']."',MD5('".$data['password']."'),
       '1', '".time()."','".$id."')");
       
       if(mysql_insert_id()){
               return reg_send_confirmation_mail($data['mail'], "nome@mio_dominio.ext", $id);
       }else return REG_FAILED;
}

function reg_send_confirmation_mail($to, $from, $id){
global $_CONFIG;
     //mail di conferma
     $msg = "Per confermare l'avvenuta registrazione, clicckate il link seguente:
     ".$_CONFIG["site_url"]."confirm.php?id=".$id."
     ";
     return (mail($to, "Conferma la registrazione", $msg, "From: ".$from)) ? REG_SUCCESS : REG_FAILED;
}

function reg_clean_expired(){
       global $_CONFIG;
       
       $query = mysql_query("
       DELETE FROM ".$_CONFIG['table_utenti']."
       WHERE (regdate + ".($_CONFIG['regexpire'] * 60 * 60).") <= ".time()." and temp='1'");
}

function reg_get_unique_id(){
       //restituisce un ID univoco per gestire la registrazione
       list($usec, $sec) = explode(' ', microtime());
       mt_srand((float) $sec + ((float) $usec * 100000));
       return md5(uniqid(mt_rand(), true));
}

function reg_check_data(&$data){
       global $_CONFIG;
       
       $errors = array();
       
       foreach($data as $field_name => $value){
               $func = $_CONFIG['check_table'][$field_name];
               if(!is_null($func)){
                       $ret = $func($value);
                       if($ret !== true)
                               $errors[] = array($field_name, $ret);
               }
       }
       
       return count($errors) > 0 ? $errors : true;
}

function reg_confirm($id){
       global $_CONFIG;
       
       $query = mysql_query("
       UPDATE ".$_CONFIG['table_utenti']."
       SET temp='0'
       WHERE uid='".$id."'");
       
       return (mysql_affected_rows () != 0) ? REG_SUCCESS : REG_FAILED;
}
?>

Dovete modificare, in questo file, solamente il seguente campo: nome@mio_dominio.ext, inserendo la vostra mail, o quella che volete venga visualizzata dal ricevente.
Nota:Se non avete solide basi di php non modificate altro, una scorretta modifica porterebbe al malfunzionamento della libreria!

File auth.lib.php:
SPOILER (click to view)
CODICE
<?php

$_AUTH = array(
       "TRANSICTION METHOD" => AUTH_USE_COOKIE
);

function auth_set_option($opt_name, $opt_value){
       global $_AUTH;
       
       $_AUTH[$opt_name] = $opt_value;
}

function auth_get_option($opt_name){
       global $_AUTH;
       
       return is_null($_AUTH[$opt_name])
               ? NULL
               : $_AUTH[$opt_name];
}

function auth_clean_expired(){
       global $_CONFIG;
       
       $result = mysql_query("SELECT creation_date FROM ".$_CONFIG['table_sessioni']." WHERE uid='".auth_get_uid()."'");
       if($result){
               $data = mysql_fetch_array($result);
               if($data['creation_date']){
                       if($data['creation_date'] + $_CONFIG['expire'] <= time()){
                               switch(auth_get_option("TRANSICTION METHOD")){
                                       case AUTH_USE_COOKIE:
                                               setcookie('uid');
                                       break;
                                       case AUTH_USE_LINK:
                                               global $_GET;
                                               $_GET['uid'] = NULL;
                                       break;
                               }
                       }
               }
       }
       
       mysql_query("
       DELETE FROM ".$_CONFIG['table_sessioni']."
       WHERE creation_date + ".$_CONFIG['expire']." <= ".time()
       );
}

function auth_get_uid(){
       
       $uid = NULL;

       switch(auth_get_option("TRANSICTION METHOD")){
               case AUTH_USE_COOKIE:
                       global $_COOKIE;
                       $uid = $_COOKIE['uid'];
               break;
               case AUTH_USE_LINK:
                       global $_GET;
                       $uid = $_GET['uid'];
               break;
       }

       return $uid ? $uid : NULL;
}

function auth_get_status(){
       global $_CONFIG;

       auth_clean_expired();
       $uid = auth_get_uid();
       if(is_null($uid))
               return array(100, NULL);
       
              $result = mysql_query("SELECT U.name as name, U.username as username
      FROM ".$_CONFIG['table_sessioni']." S,".$_CONFIG['table_utenti']." U
      WHERE S.user_id = U.id and S.uid = '".$uid."'");
       
       if(mysql_num_rows($result) != 1)
               return array(100, NULL);
       else{
               $user_data = mysql_fetch_assoc($result);
               return array(99, array_merge($user_data, array('uid' => $uid)));
       }
}

function auth_login($uname, $passw){
       global $_CONFIG;

       $result = mysql_query("
       SELECT *
       FROM ".$_CONFIG['table_utenti']."
       WHERE username='".$uname."' and password=MD5('".$passw."')"
       );
       
       if(mysql_num_rows($result) != 1){
               return array(AUTH_INVALID_PARAMS, NULL);
       }else{
               $data = mysql_fetch_array($result);
               return array(AUTH_LOGEDD_IN, $data);
       }
}

function auth_generate_uid(){

       list($usec, $sec) = explode(' ', microtime());
       mt_srand((float) $sec + ((float) $usec * 100000));
       return md5(uniqid(mt_rand(), true));
}

function auth_register_session($udata){
       global $_CONFIG;
       
       $uid = auth_generate_uid();
       
       mysql_query("
       INSERT INTO ".$_CONFIG['table_sessioni']."
       (uid, user_id, creation_date)
       VALUES
       ('".$uid."', '".$udata['id']."', ".time().")
       "
       );
       if(!mysql_insert_id()){
               return array(AUTH_LOGEDD_IN, $uid);
       }else{
               return array(AUTH_FAILED, NULL);
       }
}

function auth_logout(){
       global $_CONFIG;

       $uid = auth_get_uid();
       
       if(is_null($uid)){
               return false;
       }else{
               mysql_query("
               DELETE FROM ".$_CONFIG['table_sessioni']."
               WHERE uid = '".$uid."'"
               );
               return true;
       }
}
?>

In questa libreria, non dovete modificare niente, lasciatela invariata. Adesso, mettiamo tutti i file creati in una cartella che chiameremo include.
Finite le librerie, pensiamo ora a creare i moduli per il login, logut, registrazione e conferma:
login.php:

SPOILER (click to view)
CODICE
<?php
include_once("include/config.php");
include_once("include/auth.lib.php");

list($status, $user) = auth_get_status();

if($status == AUTH_NOT_LOGGED){
       $uname = strtolower(trim($_POST['uname']));
       $passw = strtolower(trim($_POST['passw']));

       if($uname == "" or $passw == ""){
               $status = AUTH_INVALID_PARAMS;
       }else{
               list($status, $user) = auth_login($uname, $passw);
               if(!is_null($user)){
                       list($status, $uid) = auth_register_session($user);
               }
       }
}

switch($status){
       case AUTH_LOGGED:
               header("Refresh: 5;URL=index.php");
               echo '<div align="center">Sei gia connesso ... attendi il reindirizzamento</div>';
       break;
       case AUTH_INVALID_PARAMS:
               header("Refresh: 5;URL=index.php");
               echo '<div align="center">Hai inserito dati non corretti ... attendi il reindirizzamento</div>';
       break;
       case AUTH_LOGEDD_IN:
               switch(auth_get_option("TRANSICTION METHOD")){
                       case AUTH_USE_LINK:
                               header("Refresh: 5;URL=index.php?uid=".$uid);
                       break;
                       case AUTH_USE_COOKIE:
                               header("Refresh: 5;URL=index.php");
                               setcookie('uid', $uid, time()+3600*365);
                       break;
                       case AUTH_USE_SESSION:
                               header("Refresh: 5;URL=index.php");
                               $_SESSION['uid'] = $uid;
                       break;
               }
               echo '<div align="center">Ciao '.$user['name'].' ... attendi il reindirizzamento</div>';
       break;
       case AUTH_FAILED:
               header("Refresh: 5;URL=index.php");
               echo '<div align="center">Fallimento durante il tentativo di connessione ... attendi il reindirizzamento</div>';
       break;
}
?>

Questo file php, è legato al seguente form:
HTML
<form action="login.php<?=$link?>" method="post">
<table cellspacing="2"><tr>
<td>Nome Utente:</td>
<td><input type="text" name="uname"></td></tr>
<tr><td>Password:</td>
<td><input type="password" name="passw"></td></tr>
<tr><td colspan="2"><input type="submit" name="action" value="login"></td></tr>
</table>
</form>

Potrete far comparire questo form quando un utente non è loggato con il seguente script in php:
CODICE
<?php
switch($status){
case AUTH_LOGGED:
?>
Benvenuto <?=$user["username"];?>!
<?php
break;
case AUTH_NOT_LOGGED:
?>
Non sei loggato, esegui il login
...form per il login...
<?php
break;}
?>

Ricordatevi di inserire in cima alla pagina, quest'altro script, necessario al funzionamento di tutti gli script; va inserito in tutte le pagine nel quale volete far comparire il nome dell'utente o dati legati a lui:
CODICE
<?php
include_once("include/config.php");
include_once("include/auth.lib.php");

list($status, $user) = auth_get_status();

if($status == AUTH_LOGGED & auth_get_option("TRANSICTION METHOD") == AUTH_USE_LINK){
       $link = "?uid=".$_GET['uid'];
}else        $link = '';
?>

Passiamo ora al file per il logout:
logout.php
SPOILER (click to view)
CODICE
<?php
include_once("include/config.php");
include_once("include/auth.lib.php");

list($status, $user) = auth_get_status();
header("Refresh: 5;URL=index.php");

if($status == AUTH_LOGGED){
       if(auth_logout()){
               echo '<div align="center">Disconnessione effettuata ... attendi il reindirizzamento</div>';
       }else{
               echo '<div align="center">Errore durante la disconnessione ... attendi il reindirizzamento</div>';
       }
}else{
       echo '<div align="center">Non sei connesso ... attendi il reindirizzamento</div>';
}
?>

Per eseguire il logout, basta creare un link che porti al file php.
Esempio:
CODICE
<a href="logout.php">esegui il logout</a>

Pasiamo ora ai file per la registrazione e la conferma;
File confirm.php
SPOILER (click to view)
CODICE
<?php
include_once("include/config.php");
include_once("include/reg.lib.php");

if(isset($_GET['id']) and strlen($_GET['id']) == 32){
       reg_clean_expired();
       $status = reg_confirm($_GET['id']);
       
       switch($status){
               case REG_SUCCESS:
                       echo "La tua registrazione è stata confermata; ora puoi effettuare il login.";
               break;
               case REG_FAILED:
                       echo "La registrazione non può essere confermata, probabilemente poichè è scaduta.";
               break;
       }
}
?>

File registrati.php, che conterrà i tag di input nel quale immettere i propri dati, che verranno inviati al database:
SPOILER (click to view)
HTML
<html>
<head>
<title>Modulo di registrazione</title>
</head>
<body>
<form action="register.php" method="post">
<div align="center">
<table border="0" width="300">
<tr>
<td>Nome:</td>
<td><input type="text" name="name"></td>
</tr>
<tr>
<td>Indirizzo:</td>
<td><input type="text" name="indirizzo"></td>
</tr>
<tr>
<td>Occupazione</td>
<td><input type="text" name="occupazione"></td>
</tr>
<tr>
<td>Username:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>Password:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td>E-Mail:</td>
<td><input type="text" name="email"></td>
</tr>

<tr>
<td>Conferma E-Mail:</td>
<td><input type="text" name="mail"></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" name="action" value="Invia"></td>
</tr>
</table>
</div>
</form>
</body>
</html>

Ed ora il file register.php:
SPOILER (click to view)
CODICE
<html>
<body>
<?php
include_once("include/config.php");
include_once("include/reg.lib.php");

if(isset($_POST['action']) and $_POST['action'] == 'Invia'){
       $ret = reg_check_data($_POST);
       $status = ($ret === true) ? reg_register($_POST) : REG_ERRORS;
       
       switch($status){
               case REG_ERRORS:
                       ?>
                       <span class="style1">Sono stati rilevati i seguenti errori:</span><br>
                       <?php
                       foreach($ret as $error)
                               printf("<b>%­s</b>: %­s<br>", $error[0], $error[1]);
                       ?>
                       <br>Premere "indietro" per modificare i dati
                       <?php
               break;
               case REG_FAILED:
                       echo "Registrazione Fallita a causa di un errore interno.";
               break;
               case REG_SUCCESS:
                       echo "Registrazione avvenuta con successo.<br>
                       Vi è stata inviata una email contente le istruzioni per confermare la registrazione.";
               break;
       }
}
?>
</body>
</html>

Finalmente, la parte riguardante i form e le librerie è terminata.
Dovremmo avere, a questo punto, una struttura simile a questa nella root del sito:

| ROOT
|------------- INCLUDE
|------------- reg.lib.php
|------------- auth.lib.php
|------------- config.php
| index.php
| login.php
| logout.php
| registrati.php
| register.php
| confirm.php

A questo punto, non vi resta altro da fare che personalizzare le vostre pagine, seguendo questa utile guida.

FAQ


Non riesco a creare questi file php: cosa devo fare?
Scarica da qui il file zip completo di tutti i file Php. Per modificarli, usa un normale editor di testi, come Blocco Note o WordPad (racomando WordPad per l'allineamento dei codici).

Non riesco ad alterare la tabella utenti, cosa faccio?
Cancella la tabella utenti esistente e inserisci questo comando nella finestra delle query:
CODICE
CREATE TABLE utenti (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(30) NOT NULL,
email VARCHAR(30) NOT NULL,
username VARCHAR(30) NOT NULL,
password CHAR(32) NOT NULL,
indirizzo VARCHAR( 100 ) NOT NULL,
occupazione VARCHAR( 100 ) NOT NULL,
temp SET( '0', '1' ) NOT NULL,
regdate VARCHAR( 11 ) NOT NULL,
uid VARCHAR( 32 ) NOT NULL,
 PRIMARY KEY(id),
 INDEX(username, password)
);

Nota:La tabella non necessiterà di nessuna alterazione successiva, perchè gia completa.


Un utente non riesce a registrarsi, come faccio ad inserirlo tra gli utenti registrati?
Puoi farlo tramite una query:
CODICE
INSERT INTO utenti (name, email, username, password) VALUES ('Andrea', 'mia_mail','Jolteon',MD5('mia_password'));

Ad un utente non è stata recapitata la mail di conferma, come faccio a confermarlo?
Modifica il valore temp, riferito all'utente, da 1 a 0.

Voglio creare un messaggio di benvenuto personalizzato: come faccio a far comparire il nome dell'utente?
Per prima cosa, assicurati di aver inserito questo script in cima alla pagina; il codice per farlo apparire è <?=$user["username"];?>

usando il codice precedente, compare l'username: come faccio a far comparire il nome?
Sostituisci <?=$user["username"];?> con <?=$user["name"];?>.

Voglio fare un riepilogo dei dati: come faccio?
Utilizzando lo stesso script di prima, ma adattandolo alle esigenze:
CODICE
Benvenuto <?=$user["username"];?>!
Nome: <?=$user["name"];?>
E-mail: <?=$user["email"];?>


Voglio abilitare un solo utente a visualizzare una pagina: che codice devo usare?
Ricordati di aver inserito questo script in cima alla pagina;
il codice è questo:
CODICE
<?php
if ($user["username"] == 'Jolteon')  {echo "pagina da visualizzare";}
else {echo "mi dispiace, ma non sei abilitato a visualizzare questa pagina";}
?>

Voglio recuperare una password, come faccio?
Le password, essendo criptate in MD5, non possono ricondurre alla parola di partenza; è solamente possibile sostituirla.

Un utente ha perso la password: come faccio a generarne un'altra?
Nel campo password, della tabella utenti nel database, sostituisci il valore esistente di 32 cifre, in formato MD5, con un medesimo dello stesso valore;
Qui poterte trovare un generatore che trasfromerà una parola o una combinazione di numeri in formato MD5: sostituite il vecchio valore con quello appena generato e la password corrente sarà quella che avete precedentemente convertito in MD5.

Per qualsiasi problema contattatemi a [email protected]

Ringraziamento a PHP.Html.it
Script in Php di base realizzati da Gabriele Farina


Guida realizzata da ~ Jolteon in esclusiva per il NewsBoard Forum.


Edited by ~ Jolteon - 5/1/2010, 10:41
 
Web  Top
0 replies since 5/4/2008, 13:05   6565 views
  Share