Manuals
Sistema d'usuaris PHP
Registre i reconeixement d’usuaris - PHPEn què consisteix? Per a què serveix? Molt senzill, en algunes webs com, per exemple, aquesta, volem interactuar amb els usuaris, desitjant que aquests puguin participar al màxim per ajudar a créixer, però desitgem portar un control sobre els autors. Així doncs, t’has de registrar i fer el respectiu “ingrés” perquè el sistema et reconeixi i puguis fer diverses coses només visibles pels registrats.
Però com s’aconsegueix, això? Es fa tenint una base de dades amb una taula d’usuaris (es podria fer amb arxius, però seria més insegur) i mitjançant arxius PHP i manejant les sessions (<strong>session</strong>) o galetes (<strong>cookies</strong>).
En aquest article explicarem com crear un sistema de registre i reconeixement d’usuaris tenint una taula en una base de dades MySQL i mitjançant galetes (<strong>cookies</strong>) per a la nostra pàgina web d’una manera senzilla.
Si tens coneixement previ sobre les cookies, continua llegint, si no et recomanem que et llegeixis algun dels manuals que hi ha.
A l’hora de crear un sistema de registre d’usuaris sempre pensem el mateix:
registre + login + reconeixement
Volem que els usuaris es registrin deixant les seves dades i puguin accedir a algunes zones de la pàgina i que siguin reconeguts per aquesta (per exemple “benvingut (NICK)!” o “benvingut visitant!” en cas de no estar ingressat (o registrat) al sistema).
Molts pensen en crear un sistema d’usuaris ja que els sembla “bonic”, però hi ha poca gent que realment ho necessita, o que quan els hi fas dues preguntes:
1- Quins beneficis tenen els usuaris registrats respecte a la resta?
2- Quines zones de la web vols que siguin d’accés restringit i PERQUÈ?
La majoria no és capaç de respondre a la primera pregunta, i és que abans d’aventurar-nos a crear un sistema d’usuaris per a la nostra web hem de pensar si realment val la pena, ja que les temàtiques de la web i els seus continguts no sempre són adequats per tenir un sistema de registre d’usuaris.
Per això responem les dues preguntes:
1- Quins beneficis tenen els usuaris registrats respecte a la resta?
R:// Possibilitat d’enviar scripts, articles, manuals, arxius, al mateix temps que un quadre de control pels moderadors i administradors.
2- Quines zones de la web vols que siguin d’accés restringit i PERQUÈ?
R:// Vull que només els usuaris que estan registrats puguin enviar scripts, articles, manuals, arxius, ja que així es pot portar un millor control d’aquests i prevenir l’enviament indiscriminat. També així podem posar un sistema d’administració i moderació d’aquests.
Ja tenim unes raons, com n’hi podrien haver d’altres, per crear el nostre sistema de registre d’usuaris, com també podrien ser que el només els usuaris puguin descarregar-se programes, música, vídeos, etc. per restringir l’accés a certes zones “obligant” a l’usuari a registrar-se per a poder veure la zona en qüestió.
Sempre tenint en compte que les raons siguin vàlides i que no molestin a l’usuari, ja que haver-se de registrar pot fer-se pesat i inútil depenent dels casos, hem de tenir en compta quines zones restringim als usuaris ja que normalment l’usuari prefereix la comoditat.
Ara al que anem, crearem el nostre sistema de registre d’usuaris. El primer que hem de fer és pensar quines dades haurà d’introduir l’usuari per a registrar-se. Com sempre, hi haurà d’haver dos camps bàsics:
Nick (o sobrenom):
Password (o contrasenya):
El més comú per a identificar als usuaris és mitjançant el nick/password, encara que també podria ser e-mail/password.
Ja sabem que la nostra taula d’”usuaris” tindrà aquests camps (id, nick, password):
CREATE TABLE usuaris (
id bigint(7) NOT NULL auto_increment,
nick char(100) NOT NULL,
password char(100) NOT NULL,
KEY id (id))
Però, són suficients? També estaria bé tenir el correu dels usuaris en cas de voler enviar informació als usuaris registrats i tenir el nom d’aquests per personalitzar els correus o missatges que els enviem als usuaris a la pàgina (exemple: “Hola Nom!”), així, aquesta taula creixeria una mica:
CREATE TABLE usuaris (
id bigint(7) NOT NULL auto_increment,
nick char(100) NOT NULL,
password char(100) NOT NULL,
nom char(255) default NULL,
email char(100) default NULL,
KEY id (id))
Ja tenim l’estructura de la taula d’usuaris, és petita i senzilla però serveix a efectes pràctics i d’aprenentatge perfectament (això depèn de tu, depenent del que vulguis saber sobre els teus usuaris).
Ara ve allò senzill, crear el sistema de registre d’usuaris, un formulari i una aplicació que afegeixi al nou usuari a la base de dades. Així, hem de crear un formulari del tipus:
<FORM ACTION="registrar.php" METHOD="post">
Nick : <INPUT TYPE="text" NAME="nick" SIZE=20 MAXLENGTH=20>
<BR>
E-mail: <INPUT TYPE="text" NAME="email" SIZE=28 MAXLENGTH=100>
<BR>
Password: <INPUT TYPE="password" NAME="password" SIZE=28 MAXLENGTH=20>
<BR>
Nom: <INPUT TYPE="text" NAME="nom" SIZE=28 MAXLENGTH=255>
<BR>
<INPUT TYPE="submit" CLASS="boton" VALUE="Registrar">
</FORM>
I ara necessitem una aplicació que ho processi (registrar.php), que per motius pràctics farem senzill i sense gaires comprovacions (dependrà de tu millorar-lo si vols alguna cosa més personalitzada). Aquí ve el codi:
<?php
//Aquí la connexió o l’include() de la connexió a la base de dades.
function treure($missatge)
{
$missatge = str_replace("<","<",$missatge);
$missatge = str_replace(">",">",$missatge);
$missatge = str_replace("\'","'",$missatge);
$missatge = str_replace('\"',""",$missatge);
$missatge = str_replace("\\\\","\",$missatge);
return $missatge;
}
if(trim($HTTP_POST_VARS["nick"]) != "" && trim($HTTP_POST_VARS["email"]) != "")
{
$sql = "SELECT id FROM usuaris WHERE nick='".treure($HTTP_POST_VARS["nick"])."'";
$result = mysql_query($sql);
if($row = mysql_fetch_array($result))
{
echo "Error! Nick ja triat per un altre usuari...";
}
else
{
$sql = "INSERT INTO usuaris (nick,password,nom,email) VALUES (";
$sql .= "'".treure($HTTP_POST_VARS["nick"])."'";
$sql .= ",'".treure($HTTP_POST_VARS["password"])."'";
$sql .= ",'".treure($HTTP_POST_VARS["nom"])."'";
$sql .= ",'".treure($HTTP_POST_VARS["email"])."'";
$sql .= ")";
mysql_query($sql);
echo "Registre satisfactori!";
}
mysql_free_result($result);
}
else
{
echo "Ha d’omplir com a mínim els camps de e-mail i password!";
}
mysql_close();
?>
Al principi no hem fet la connexió amb la base de dades però ho hem posat com a comentari “//Aquí la connexió o l’include() de la connexió a la base de dades.”, ja que la connexió depèn de tu, si no saps com fer una connexió t’aconsellem que et llegeixis algun manual relacionat abans de voler crear un sistema com aquest.
Veiem que hem declarat una funció, anomenada treure($missatge), la qual rep el paràmetre “missatge”, aquesta funció s’encarregarà de deshabilitar el codi HTML (“<” y “>”) al reemplaçar-lo pel seu respectiu codi. A més també canvia l’apòstrof (‘) i les cometes dobles (“) pels seus respectius codis HTML. Això serveix per no tenir conflictes amb la instrucció sql i evitar atacs per part de hackers (lammers). Al final retorna la cadena amb les noves modificacions, en cas de que n’hi hagin:
function treure($missatge)
{
$missatge = str_replace("<","<",$missatge);
$missatge = str_replace(">",">",$missatge);
$missatge = str_replace("\'","'",$missatge);
$missatge = str_replace('\"',""",$missatge);
$missatge = str_replace("\\\\","\",$missatge);
return $missatge;
}
Ara comprovarem que els camps de nick i password (que seran els “requerits” com a mínim per a completar el registre) no estiguin buits. Per a això utilitzarem la funció “trim()”, la qual treu els espais al començament i al final de la cadena, pel que fa que si és una cadena en blanc o només amb espais en blanc retornarà “”, en cas de ser vàlid continuarem amb el registre, pel contrari, retornarem un missatge d’error:
if(trim($HTTP_POST_VARS["nick"]) != "" && trim($HTTP_POST_VARS["password"]) != "")
Ara, suposant qu eles cadenes estaven correctament, comprovarem que el nick seleccionat per l’usuari no existeixi a la base de dades. Per això farem una instrucció sql per a demanar a la base de dades que ens retorni la fila on el nick que en qüestió sigui igual al nick introduït per l’usuari (traient-li l’apòstrof, html i altres amb la funció treure())
$sql = "SELECT id FROM usuaris WHERE nick='".treure($HTTP_POST_VARS["nick"]."'";
$result = mysql_query($sql);
En cas d’existir aquest nick, o sigui que ens retorni una fila:
if($row = mysql_fetch_array($result))
Mostrarem un missatge d’error a l’usuari informant-lo de l’”incident”. Si no n’hi ha cap, continuarem el procés de registre.
Ara el que fem és simplement una instrucció sql on inserirem a la taula usuaris el nick, password, nom i e-mail introduïts per l’usuari en el formulari, a tots traient-los-hi l’html, l’apòstrof, etc. amb la funció “treure()”, i mostrarem un missatge dient que s’ha dut a terme el registre satisfactòriament.
$sql = "INSERT INTO usuaris (nick,password,nom,email) VALUES (";
$sql .= "'".treure($HTTP_POST_VARS["nick"])."'";
$sql .= ",'".treure($HTTP_POST_VARS["password"])."'";
$sql .= ",'".treure($HTTP_POST_VARS["nom"])."'";
$sql .= ",'".treure($HTTP_POST_VARS["email"])."'";
$sql .= ")";
mysql_query($sql);
echo "Registre satisfactori!";
Nota: Per efectes pràctics hem fet això molt senzill, podríeu afegir més comprovacions com la del correu, etc.
També podria fer-se més segur mitjançant l’ús de la funció d’encriptació md5() pel password, encara que s’ha fet de la manera més senzilla ja que la finalitat d’aquest article és la d’ensenyar com reconèixer als usuaris. Dependrà de vosaltres els detalls a l’hora de depurar el codi.
Bé, ja tenim llesta l’aplicació de registre, però... i ara què? Què faig amb tots aquests usuaris? Ara necessitem que els usuaris ingressin i siguin ”reconeguts”, i com ja hem dit ho farem mitjançant cookies.
Crearem un formulari HTML perquè els usuaris introdueixin el seu nick i password i també haurem de crear un aplicació (ingressar.php) que serà l’encarregada de processar si l’usuari és vàlid i donar-li “ingrés” al sistema mitjançant una cookie.
És recomanable tenir aquest arxiu a la carpeta arrel de la nostra web, el formulari html seria alguna cosa així:
<FORM ACTION="ingressar.php" METHOD="post">
Nick : <INPUT TYPE="text" NAME="nick" SIZE=20 MAXLENGTH=20>
<BR>
Password: <INPUT TYPE="password" NAME="password" SIZE=28 MAXLENGTH=20>
<BR>
<INPUT TYPE="submit" CLASS="boton" VALUE="Ingresar">
</FORM>
I ara el codi de la nostra aplicació (ingressar.php):
<?php
//Aquí la connexió o l’include() de la connexió a la base de dades.
function treure($missatge)
{
$missatge = str_replace("<","<",$missatge);
$missatge = str_replace(">",">",$missatge);
$missatge = str_replace("\'","'",$missatge);
$missatge = str_replace('\"',""",$missatge);
$missatge = str_replace("\\\\","\",$missatge);
return $missatge;
}
if(trim($HTTP_POST_VARS["nick"]) != "" && trim($HTTP_POST_VARS["password"]) != "")
{
$nickN = treure($HTTP_POST_VARS["nick"]);
$passN = treure($HTTP_POST_VARS["password"]);
$result = mysql_query("SELECT password FROM usuaris WHERE nick='$nickN'");
if($row = mysql_fetch_array($result))
{
if($row["password"] == $passN)
{
//90 dies dura la cookie
setcookie("usNick",$nickN,time()+7776000);
setcookie("usPass",$passN,time()+7776000);
?>
Ingrés amb èxit, ara seràs redirigit a la pàgina principal.
<SCRIPT LANGUAGE="javascript">
location.href = "index.php";
</SCRIPT>
<?
}
else
{
echo "Password incorrecte";
}
}
else
{
echo "Usuari no existent";
}
mysql_free_result($result);
}
else
{
echo "Has d’especificar un nick i un password!";
}
mysql_close();
?>
Bé, a dalt ja hem explicat tot allò relacionat amb la connexió i la funció treure($missatge), així que anirem directe al primer “if”.
El primer que fem és comprovar que els camps de “nick” i “password” no estiguin buits (ja hem explicat la funció trim()):
if(trim($HTTP_POST_VARS["nick"]) != "" && trim($HTTP_POST_VARS["password"]) != "")
Així que continuem suposant que tot està bé. Ara el que fem és treure-li l’HTML, l’apòstrof, cometes, etc. al nick i al password enviats per l’usuari per a la seva comprovació amb la base de dades. Per això utilitzem la funció treure($missatge) explicada anteriorment, i guardem les noves cadenes en dues noves variables:
$nickN = treure($HTTP_POST_VARS["nick"]);
$passN = treure($HTTP_POST_VARS["password"]);
Ara executem una instrucció sql, en la qual li demanem a la base de dades que de la taula usuaris ens retorni la fila de la qual el seu nick correspongui amb l’enviat per l’usuari.
$result = mysql_query("SELECT password FROM usuaris WHERE nick='$nickN'");
Si retorna una columna voldrà dir que el nick existeix a la base de dades. Pel contrari, retornem un missatge d’error:
if($row = mysql_fetch_array($result))
{
...
}
else
{
echo "Usuari no existent";
}
Ara continuem amb el procés suponent que l’usuari existeixi a la base de dades. Ara hem de comprovar que el password sigui correcte, per tant, farem una simple comparació. Si és correcte, continuarem, pel contrari, mostrarem l’error de password incorrecte.
if($row["password"] == $passN)
{
...
}
else
{
echo "Password incorrecte";
}
Ara suposant que el password és correcte continuarem i el pròxim a fer serà establir les cookies de nick i password (les quals nombrarem “usNick”/”usPass” i contenen el nick i el password, respectivament) a la màquina de l’usuari, informem que s’ha realitzat correctament el login i l’enviem a la pàgina principal. Una vegada més, recalquem que estem fent-ho el més senzill possible, de vosaltres dependrà personalitzar o millorar els missatges.
setcookie("usNick",$nickN,time()+7776000);
setcookie("usPass",$passN,time()+7776000);
?>
<SCRIPT LANGUAGE="javascript">
location.href = "index.php";
</SCRIPT>
<?
L’usuari ja té les cookies al seu sistema, però, i ara què? Com fem per comprovar a les pàgines que volem si el login és correcte? O sigui, que l’usuari posseeix les cookies i que són vàlides?
Per això crearem un últim arxiu, el qual anomenarem login.php, que s’encarregarà de llegir les cookies i dir-nos si l’usuari és un usuari registrat i que he fet el respectiu ingrés al sistema:
<?php
$loginCorrecte = false;
$idUsuariL;
$nickUsuariL;
$emailUsuariL;
$nombreUsuariL;
if(isset($HTTP_COOKIE_VARS["usNick"]) && isset($HTTP_COOKIE_VARS["usPass"]))
{
$result = mysql_query("SELECT * FROM usuaris WHERE nick='".$HTTP_COOKIE_VARS["usNick"]."' AND password='".$HTTP_COOKIE_VARS["usPass"]."'");
if($row = mysql_fetch_array($result))
{
setcookie("usNick",$HTTP_COOKIE_VARS["usNick"],time()+7776000);
setcookie("usPass",$HTTP_COOKIE_VARS["usPass"],time()+7776000);
$loginCorrecte = true;
$idUsuariL = $row["id"];
$nickUsuariL = $row["nick"];
$emailUsuariL = $row["email"];
$nombreUsuariL = $row["nom"];
}
else
{
//Destruïm les cookies
setcookie("usNick","x",time()-3600);
setcookie("usPass","x",time()-3600);
}
mysql_free_result($result);
}
?>
El primer que fem és declarar unes variables que utilitzarem per guardar les dades de l’usuari en cas de tenir les cookies en el seu sistema i de que siguin correctes:
$loginCorrecte = false;
$idUsuariL;
$nickUsuariL;
$emailUsuariL;
$nombreUsuariL;
Hi ha una variable booleana que hem de mirar de prop i és la de $loginCorrecte ja que aquesta serà la que utilitzarem per comprovar el login en els nostres arxius, més endavant veure com.
Seguidament, el que fem és comprovar que les cookies existeixin, si no existeixen, doncs no hi ha probleme, simplement, no hi ha “ingrés”:
if(isset($HTTP_COOKIE_VARS["usNick"]) && isset($HTTP_COOKIE_VARS["usPass"]))
Ara el que fem és una sentència sql, en la qual li demanem a la base de dades que ens retorni la fila on hi ha el nick i el password que corresponguin al nick i password guardats a les cookies:
$result = mysql_query("SELECT * FROM usuaris WHERE nick='".$HTTP_COOKIE_VARS["usNick"]."' AND password='".$HTTP_COOKIE_VARS["usPass"]."'");
Si aquest nick i password corresponen a una fila a la base de dades, això voldrà dir que són correctes. Pel contrari, la informació de les cookies està malament i l’hem de destruir:
if($row = mysql_fetch_array($result))
{
...
}
else
{
//Destruïm les cookies
setcookie("usNick","x",time()-3600);
setcookie("usPass","x",time()-3600);
}
Si la informació és correcte, procedim amb l’infrés, establim de nou les cookies per tal que s’actualitzi el temps de destrucció a uns altres noranta dies a partir d’ara:
setcookie("usNick",$HTTP_COOKIE_VARS["usNick"],time()+7776000);
setcookie("usPass",$HTTP_COOKIE_VARS["usPass"],time()+7776000);
Seguidament establim la variable $loginCorrecte a “true”, i les altres variables les omplirem amb la informació de l’usuari:
$loginCorrecte = true;
$idUsuariL = $row["id"];
$nickUsuariL = $row["nick"];
$emailUsuariL = $row["email"];
$nombreUsuariL = $row["nom"];
Ja tenim el nostre arxiu anomenat “login.php” llest. Ara, com l’utilitzem? Bé, suposem que volem que en el nostre “index.php” donar-li la benvinguda a l’usuari en cas d’estar ingressat al sistema d’usuaris. Desitgem saludar-lo pel seu nick o nom i, en cas contrari, saludar-lo com a visitant. Per fer-ho hauríem d’incluir l’arxiu “login.php” al començament del nostre “index.php” així:
Nota: Abans d’incluir el “login.php” has de recordar de realitzar la connexió a la base de dades!
<?php
//Aquí la connexió o l’include() de la connexió a la base de dades.
include("login.php");
...
Amb això el “login.php” s’encarregarà de realitzar les accions que hem vist més amunt. Ara en el nostre “index.php” on volguem saludar al visitant posem el següent:
...
if($loginCorrecte)
{
echo "Estàs identificat al sistema com a ".$nickUsuariL;
}
else
{
echo "Benvingut visitant, el sistema no t’ha reconegut";
}
...
Com pots veure, fem ús de la variable $loginCorrecte, la qual serà “true” en cas que l’usuari sigui reconegut pel sistema. Del contrari, serà “false”.
I així podem usar-ho en moltes àrees, suposant que tenim una secció on poden accedir els usuaris registrats. L’anomenarem “restringit.php”. Així doncs, el que faríem seria prevenir que usuaris no registrats vegin el contingut:
<?php
//Aquí la connexió o l’include() de la connexió a la base de dades.
include("login.php");
if($loginCorrecte)
{
echo "Aquí el contingut només per a usuaris registrats";
}
else
{
echo "El sistema no l’ha identificat, només els usuaris registrats tenen accés a aquesta àrea.";
}
?
Article original:
Jorge Luis MartinezTraducció i adaptació: JoTGi.
Correcció: JoTGi.