Acum ca am vazut cum realizam un formular, este cazul sa intram mai mult in detalii, sa facem ceva util cu el. Intrucat utilizatorul este cel care introduce datele, el poate introduce orice, de aceea orice programator este nevoit sa-l ingradeasca pe utilizator, sa-i controleze actiunile acestuia pe cat posibil.
Intrucat actualul formular are doar cateva campuri, deci nu ne permite mai multe verificari, il voi schimba cu un formular pentru inregistrarea unui utilizator, editam inregistrare.php in care punem formularul si inregistrare-act.php in care il procesam.
<div> <form action="inregistrare-act.php" method="post"> Utilizator <input type="text" name="name" /><br /> Parola <input type="password" name="password" /><br /> Email <input type="text" name="email" /><br /> Telefon <input type="text" name="phone" /><br /> Tara <select name ="country"> <option value="ro">Romania</option> <option value="en">Marea Britanie</option> <option value="fr">Franta</option> <option value="it">Italia</option> </select> <br /> Sex Mascultin <input type="radio" name="sex" value="m" /> Feminin <input type="radio" name="sex" value="f" /><br /> Sunteti de acrod cu conditiile siteului? <input type="checkbox" name="aprove" /><br /> <input type="submit" name="submit" value="Inregistrare" /> </form> </div>
Acum avem un formular cu mai multe tipuri de input in HTML si cu mai multe tipuri de date in PHP, pentru a vedea cum putem sa le procesam. Pentru inceput procesarea va verifica doar lucruri de baza, tineti minte ca si aceasta verificare va fi extinsa intr-un tutorial viitor.
<?php
//verificam daca a fost apasat butonul
if (isset($_POST['submit'])&&($_POST['submit']==="Inregistrare")){
//preluam valorile din $_POST
$nume = $_POST['name'];
$parola = $_POST['password'];
$email = $_POST['email'];
$telefon = $_POST['phone'];
$tara = $_POST['country'];
$sex = $_POST['sex'];
$acord = $_POST['aprove'];
//le prelucram, pentru eficienta cautam cele mai specifice atribute, exemplu
//numele sa fie format doar din litere si sa fie de maxim 20 de caractere si de minim 2
$eroare ='';
if(!preg_match("/^([a-z])+$/i", $nume)){
$eroare .= "Numele nu este format doar din caractere<br />";
}
if(strlen($nume)<2||20<strlen(nume)){
//daca este mai mic decat 2, sau mai mare decat 20
$eroare .= "Numele nu are intre 2 si 20 caractere<br />";
}
//parola poate fi orice, oricat de lunga deoarece va fi trecuta printr-un algoritm hash - md5
$parola = md5($parola);
if(preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $email)){
$eroare .= "Emailul este invalid<br />";
}
//asemeni cum am verificat numele pentru lungime, putem verifica si emailul
//telefonul trebuie sa fie numeric
if(!is_numeric($telefon)){
$eroare .= "Telefonul trebuie sa fie format numai din cifre<br />";
}
//verificam tara, prin a declara un vector cu posibilitatile, asa cum sunt in select:
$tari = array("ro","en","fr","it");
//vericam daca tara selectata se afla printre posibilitati
if(!in_array($tara,$tari)){
$eroare .= "Tara selectata nu exista printre posibilitati<br />";
}
//verificam sexul
if($sex==="m"){
$sex="Masculin";
}else if($sex==="f"){
$sex="Feminin";
}else{
$eroare .= "Sexul nu a fost selectat<br />";
}
//verificam daca este de acord cu conditiile
if(!$acord==="on"){
$eroare .= "Se pare ca nu sunteti de acord cu termenii<br />";
}
/*verificam acum daca vectorul eroare contine ceva, daca nu contine inseamna ca putem merge mai departe,
pentru a introduce datele in baza de date, mai este nevoie de cateva verificari pentru sql injection */
if(!empty($eroare)){
header('location: inregistrare.php?eroare='.urlencode($eroare));
}else{
header('location: inregistrare.php?status=ok'); // inregistrarea are loc cu succes
}
}
Modificam inregistrare.php pentru a putea spune daca formularul a fost procesat ok sau cu erori. Punem acest script la inceputul divului, inainte de formular.
<?php
if(isset($_GET['status'])&&($_GET['status']==='ok')){
echo 'Inregistrarea a fost ok';
}
if(isset($_GET['eroare'])){
echo 'Aveti urmatoarele erori: <br />'.$_GET['eroare'];
}
?>
Functia preg_match(“regex”,$text); primeste ca argumente o expresie regex si un text, pe baza expresiei incearca sa verifice textul. In cazul nostru verificam daca numele contine numai litere, numele in realitate poate contine si spatii sau cratime, daca individul are mai multe nume, dar aici pastram totul simplu, urmand ca in tutorialele viitoare sa maresc dificultatea.
Functia strlen($text); returneaza lungimea textului – numarul de caractere, este bine sa o folosim atunci cand dorim sa avem un anumit numar de caractere, exemplu twitter permite doar 140 intr-un mesaj. De asemenea in baza de date, varchar poate avea maxim 255 de caractere.
Functia md5() alaturi de sha1() sunt cele mai folosite functii de hash. O functie de hash primeste ca parametru orice (text, fisier…) si returneaza un cod format din litere si cifre. Functia md5 returneaza un cod de 32 de caractere, iar sha1 unul de 40. Deoarece multimea parametrilor de intrare este infinita, iar cea a parametrilor de iesire este finita, exista posibilitatea ca pentru 2 parametrii diferiti sa rezulte acelasi cod, dar mai multe detalii intr-un tutorial special despre criptare.
Emailul este verificat si el cu o expresie regex, aceasta este mai complicata datorita formei unui email – adresa@server.tld.
Verificarea cu “===” inseamna ca cei 2 parametrii sa fie practic identici – aceasi valoare, acelasi tip de date, este mai stricta decat “==” (egalitate).
Is_numeric($numar) verifica daca parametrul de intrare este un numar si $in_array($text,$vector) verifica daca $text se afla printre elementele din $vector.
Functia header(‘location: adresa’); unde adresa poate fi orice pagina, este functia prin care utilizatorul este redirectionat de pe pagina de procesare, pe pagina initiala. Deoarece procesarea dureaza cateva miimi de secunda, utilizatorul nu percepe faptul ca a fost mutat de pe o pagina pe alta. Functia urlencode($text) are grija sa formateze textul astfel incat sa fie o adresa valida.
Daca vreuna dintre conditii nu este indeplinita, atunci $eroare va contine mesajul atasat acesteia, functia empty($variabila) verifica daca variabila contine date.






One Response to “Tutoriale PHP 2.2 – Formulare – procesare”