ELEMENTE CONSTRUCTIVE PHP
Limbajul PHP (Personal Home Page) este un limbaj de scriptare pe partea de server care īmbina caracteristici dintre cele mai complexe cu simplitate in utilizare
Ca si alte limbaje de scripting, PHP permite furnizarea unui continut web dinamic si spre deosebire de JavaScript, ruleaza pe serverul web si nu īn browserul web. In consecinta, PHP poate obtine accesul la fisiere, baze de date si alte resurse.
Caracteristicile esentiale ale limbajului sunt urmatoarele :
familiaritate
simplitate - codul unui script PHP apare īntre marcatorii < ? respectiv ?>
eficienta - dispune de mecanisme eficiente de alocare a memoriei, suport pentru programarea obiectuala, managementul sesiunilor utilizator
securitate - PHP furnizeaza elemente de securitate la nivel de sistem si la nivel de aplicatie
flexibilitate - PHP este un limbaj « īncorporat » poate fi integrat cu succes cu HTML sau JavaScript, XML, WML, nu contine cod specific unui anumit server, deci nnu este limitat la un anumit web server :Apache, IIS, Netscape Enterprise Server, Zeus, fiind īn mare parte independent de platforma.
Limbajul furnizeaza un numar impresionant de functii predefinite:
creare si manipulare continut dinamic pagini
manipulare si creare elemente grafice
calcule matematice
conectivitate catre baze de date (MySQL, ODBC)
pastrarea starii
Integrarea limbajului PHP cu HTML se realizeaza prin includere instructiuni PHP īntre m 353e46d arcatorii <?php si ?> , ceea ce indica serverului PHP ca textul cuprins īntre cele doua linii este alcatuit din instructiuni PHP.
Fisierele PHP trebuie sa aiba extensia .php.
Sintaxa limbaj PHP e asemanatoare limbajului C existand cīteva elemente distincte:
numele variabile - īncep obligatoriu cu semnul $ ; regulile cunoscute pentru constructia identificatorilor raman valabile : caractere alfanumericesi _ sunt permise: $text= " Hello World "
variabilele globale - create īn afara oricarei functii, utilizīnd cuvīntul cheie global Variabilele unui formular sunt un tip important de variabile globale si nu sunt in mod prestabilit recunoscute īn interiorul functiilor, daca doresc acest lucru, trebuie redeclarate ca globale si īn interiorul acestora :
global $var1, $var2 ;
function cu_var_globala()
variabilele statice - declarate īn interiorul unei functii īsi pastreaza valoarea la iesirea din functie; se comporta ca niste variabile globale, si nu locale
constantele - se definesc utilizīnd functia predefinita define() ex. - define("PI", 3.14159). In expresii, numele constantelor nu este prefixat de caracterul $ ex. -$arie_cerc=PI * $raza * $raza
PHP - tipul variabilelor nu trebuie precizat fiind determinat pe baza ultimei valori atribuite variabilei, flexibilitate care nu permite mixarea tipurilor ininstructiuni de atribuire sau aritmetice. In anumite situatii sunt realizate conversii implicite de tipīn alte cazuri trebuie realizate conversii explicite de tip (typecast)
tipurile de date utilizate de PHP - preponderent numerice sau siruri de caractere ; limbajul dispune de o paleta extrem de variata de functii pentru prelucrarea sirurilor de caractere precum si funtii pentru prelucrari matematice
similar ca in C, instructiunile conditionale - if, switch; instructiunile ciclice sunt for, while si do-while
functiile PHP similare celor din C si pot fi pot fi recursive, in mod implicit, argumentele sunt transmise prin valoare; daca se doreste tranmiterea lor prin referinta, acest lucru se poate realiza prin prefixarea parametrului cu & (se transmite de fapt, adresa parametrului ):
function trans_ref(&$i)
PHP permite lucrul cu fisiere existand functii specifice - deschidere/īnchidere, citire/scriere, modificare proprietati si privilegii fisier sau grupuri de fisiere, modificare drepturi de proprietate asupra fisierelor
Serverul Web (Apache) si serverul de aplicatie PHP folosesc variabile de mediu pentru prezentare informatii de stare, variabile ce reflecta caracteristicile cererii HTTP care a solicitat executia PHP. Variabilele de mediu disponibile pot fi vizualizate folosind functia phpinfo().
Variabila de mediu |
Semnificatie |
Exemplu |
DOCUMENT_ROOT |
Calea care constituie radacina arborelui directorului cu documente al serverului Web |
c:\inetpub\wwwroot |
GATEWAY_INTERFACE |
Versiunea protocolului
| |
HTTP_ACCEPT |
Continutul antetului HTTP Accept: |
image/gif, |
HTTP_CONNECTION |
Continutul antetului HTTP Connection:, care indica optiunile solicitate de client |
Keep-Alive |
HTTP_ |
Continutul antetului HTTP Host:, care indica numele de gazda folosit de client la prezentarea paginii |
classic. |
HTTP_USER_AGENT |
Continutul antetului HTTP User-Agent:, care indica browserul clientului si versiunea acestuia |
Mozilla/4.0
(compatible; |
REMOTE_ADDR |
Adresa IP a clientului | |
REMOTE_ |
Numele gazda a clientului | |
REQUEST_METHOD |
Motoda de cerere HTTP folosita: |
|
|
Numele de care absolut a scriptului curent |
W:\WebTest\Pop\ |
SCRIPT_NAME |
Adresa URL a scriptului curent |
/pop/exemple |
SERVER_NAME |
Numele de gazda asociat serverului Web care prelucreaza cererea |
classic. domain.local |
SERVER_ |
Port folosit de serverul Web pentru comunicatii | |
SERVER_PROTOCOL |
Numele si versiunea protocolului prin care s-a executat cererea |
HTTP/1.1 |
SERVER_SOFTWARE |
Sirul care identifica programul server Web si versiunea acestuia |
Microsoft-IIS/5.0 |
PHP - limbaj de scripting pentru Web, faciliteaza accesul la variabilele transmise de catre formularele HTM, īn momentul expedierii unui formular, numele si valorile variabilelor din cadrul acestuia sunt inserate īn tabloul HTTP_POST_VARS.
De exemplu, accesul catre o variabila var_form transmisa prin intermediul unui formular, poate fi realizat prin intermediul tabloului HTTP_POST_VARS sub forma : HTTP_POST_VARS['var_form']
1. A. Tablouri
Tablourile reprezinta o structura de date extrem de utilizata īn PHP. Un tablou poate fi creat īn principiu īn urmatoarele moduri:
prin atribuirea de valori unei variabile
$var_tablou[]="Primul element"
$var_tablou[]="Al doilea element"
$var_tablou[]="Al treilea element"
Parantezele dupa numele variabilei indica faptul ca $var_tablou este o variabila de tip tablou, implicit, valorile tabloului sunt stocate īncepīnd de la 0.
PHP nu impune utilizarea unor numere īntregi pe post de chei īn tablou. Astfel, se pot crea asa numitele tablouri asociative, sau tablou indexat cu siruri, īn cadrul carora cheile sunt siruri de caractere:
$limbaje['client']="JavaScript"
$limbaje['general]="Java"
$limbaje['server']="PHP"
prin utilizarea functiei array:
$cursuri=array("Programare", "Microprocesoare", "Grafica");
Daca se doreste asocierea unei anumite chei, se poate scrie:
$cursuri=array(5=>"Programare", "Microprocesoare", "Grafica");
Īn acest caz, tabloul creat īncepe de la indicele 5. Parcurgerea iterativa a unui tablou īn PHP se realizeaza functie de tipul acestuia. Astfel, daca acesta este secvential, se pot utiliza bucle for pentru parcurgere, ca de exemplu:
$var_tablou[]="Primul
element";
$var_tablou[]="Al doilea element";
$var_tablou[]="Al treilea element";
$lim=count($var_tablou); //determina
numarul de elemente
//traversare
tablou
for ($i=0; $i<$lim; $i++)
Daca īnsa tabloul nu este secvential, parcurgerea acestuia devine mai complicata. PHP include o instructiune īn acest sens, foreach, care simplifica operatiile de acest gen:
foreach ($limbaje as $cheie => $valoare)
Alte functii specifice pentru parcurgerea tablourilor sunt:
current() - returneaza valoarea asociata elementului curent
next(), prev() - returneaza valorile elementelor urmator respectiv anterior
key() - returneaza cheia elementului curent
each() - returneaza perechea cheie-valoare din tabloul specificat
$limbaje['client']="JavaScript";
$limbaje['general']="Java";
$limbaje['server']="PHP";
$limbaje = array("simplu" => "PHP", "complex"
=> "Perl",
"nepopular" =>
"Python");
$curent=current($limbaje);
echo "curent=".$curent;
$cheie=key($limbaje);
echo "<br>cheie=".$cheie;
$urmator=next($limbaje);
echo "<br>urmator=".$urmator;
$anterior=prev($limbaje);
echo "<br>anterior=".$anterior;
$fiecare=each($limbaje); //un array
echo "<br>fiecare=".$fiecare[0];
echo "<br>fiecare=".$fiecare[1];
O functie utila īn prelucrarea tablourilor este functia list() care este de fapt "inversa" functiei array(), deoarece functia list īmparte un tablou īn secvente de valori scalare:
list($cheie, $valoare) = each($limbaje);
//prima pereche de elemente cheie-valoare se depune
//in variabilele $cheie respectiv $valoare
echo "cheia este = $cheie corespunzaroare valorii $valoare";
$urmator=next($limbaje); //trecere la urmatorul element
Exista de asemenea alte functii specifice tablourilor īn PHP: pentru sortare (sort()), determinarea numarului de elemente (count()), determinarea facilitarea cautarii (array_search()), etc. Pentru o lista completa, trebuie examinata documentatia PHP de exemplu de la adresa www.php.net
PHP permite definirea claselor de obiecte, sub urmatoarea forma:
class Cont
function depune($suma) //metode
function afis_sold()
Instantierea unor obiecte de o anumita clasa se realizeaza folosind operatorul new:
$obiect_cont = new Cont("Popescu Ion", "876543298", 0);
$obiect-cont->depune(100000);
PHP nu suporta destructor īn mod explicit ; acest lucru poate fi īnsa simulat prin apelul functiei unset() avīnd ca parametru obiectul/variabila ce se doreste a fi distrus. In mod curent, toate variabilele si obiectele sunt automat distruse de īndata ce se termina executia scriptului.
PHP permite mostenirea si redefinirea metodelor, īn maniera cunoscuta de la limbajele obiectuale clasice. De exemplu, o clasa derivata din Cont poate fi definita sub forma:
class Cont_economii extends Cont
Mostenirea reprezinta un mecanism extrem de puternic pentru promovarea reutilizarii codului. In PHP, utilizarea obiectelor este de asemenea extrem de utila īn crearea paginilor dinamice. Obiectele de cele mai multe ori sunt grupate īn tablouri.
1.C. Fisiere & sistem de fisiere
Posibilitatile de lucru cu fisiere ale limbajului PHP nu se limiteaza numai la citirea/scrierea de fisiere, furnizīnd de asemenea si functii pentru :
verificarea existentei unui fisier
redirectarea iesirii unui fisier
executia unor programe externe
lucrul cu sistemul de fisiere
Modelul sistemului de fisiere folosit de PHP4 este cel folosit īn UNIX, īn consecinta unele functii nu se comporta corect īn cazul utilizarii sistemului Windows.
Un exemplu de utilizare al unui fisier pentru pastrarea unui contor de accese la o pagina web este urmatorul :
<?
// un numarator pentru accesurile la o pagina
// utilizeaza fisierul acces.txt pentru a retine numarul de accese
$access = "acces.txt"; //fisierul care va pastra numarul de accese
$visits = @file($access);
$current_visitors = $visits[0];
++$current_visitors;
echo "Pina in prezent au existat un numar de ".$current_visitors." accese la pagina";
$fh = fopen($access, "w"); //deschide fisierul pentru scriere
@fwrite($fh, $current_visitors);
//scrie in fisier variabila $current_visitors
fclose($fh); //inchide fisierul
?>
Utilizarea caracterului @ īnaintea numelui unei functii (īn acest caz @file si @fwrite) suprima mesajele de eroare rezultate īn urma unor īncercari fara succes de a realiza operatia dorita.
2. PHP &
Abilitatea de a obtine si prelucra informatii provenite de la utilizatori se poate realiza cu ajutorul form-urilor HTML dar lJavaScript si PHP adauga mai multa interactivitate īn scrierea formurilor HTML, motiv pentru care form-urile prezinta, pe langa partea de HTML, si portiuni de script JavaScript si/sau PHP.
Maniera īn care
PHP-ul manipuleaza informatia din cadrul form-urilor nu este
diferita de cea īn care sunt tratate variabilele transmise de exemplu prin
intermediul
URL-ului. Formularele care utilizeaza transmiterea utilizand metoda POST nu afiseaza parametrii transmisi. Toate variabilele
trimise prin intermediul unui formular pot fi utilizate īn scripturile PHP sub
forma de variabile identificate pe baza numelui lor din cadrul
formularului.
Mai jos este prezentat ca exemplu formularul cu date de contact, variabilele formularului sunt transmise catre o pagina denumita rez_contact_info.php.
<html>
<head>
<title>Informatii de contact</title>
</head>
<body>
<h3>Informatii de contact<h3>
<form name="contact" action="rez_contact_info.php"
method="post"
onSubmit="return
validare_cimpuri(document.contact)">
<pre>
Numele: <input
type="text" name="nume">
Prenumele: <input type="text" name="prenume">
Adresa: <input
type="text" name="adresa">
</pre>
Localitatea: <input type="text" name="localitate"
size=12>
Tara: <input
type="text" name="tara" size=12>
Cod postal: <input
type="text" name="cod" size=5>
<pre>
Telefon acasa: <input
type="text" name="tel_a" size=12>
Telefon serviciu <input type="text"
name="tel_se"size=12>
Email: <input
type="text" name="email">
</pre>
<hr>
<input type="submit" name="submit"
value="Trimite">
<input type="reset" value="Anuleaza">
</form>
</body>
</html>
Pagina rez_contact_info.php preia variabilele transmise prin intermediul formularului, si le afiseaza. Se observa ca aceasta foloseste ca nume ale variabilelor īn cadrul scriptului PHP, numele elementelor formularului. Practic, scriptul care citeste URL-ul creeaza automat variabilele si le atribuie valori pe baza perechilor nume/valoare transmise prin intermediul URL-ului:
<html>
<head>
<title>Informatii contact</title>
</head>
<body>
<h3>Va multumim pentru datele furnizate!</h3>
<h4>Acestea sunt informatiile de contact primite de la
dumneavoastra:</h4>
<?php
print("<pre><br>Nume: <b>$nume</b>\n");
print("<br>Prenume: <b>$prenume</b>\n");
print("<br>Adresa: <b>$adresa</b>\n");
print("<br>Localitatea: <b>$localitate</b>\n");
print("<br>Tara: <b>$tara</b>\n");
if ($cod!="")
print("<br>Cod: <b>$cod</b>\n");
if ($tel_a!="")
print("<br>Telefon acasa: <b>$tel_a</b>\n");
if ($tel_se!="")
print("<br>Telefon
serviciu:<b>$tel_se</b>\n");
print("<br>E-mail: <b>$email</b>\n</pre>");
?>
</body>
</html>
Se realizeaza o afisare conditionata a campurilor de cod si telefon deoarece acestea nu sunt obligatorii, afisarea lor este realizata numai īn cazul īn care a fost completat ceva īn cīmpul respectiv.
O alta varianta de transmitere a variabilelor catre un scrip PHP o reprezinta utilizarea link-urilor. Astfel, se poate crea de exemplu un formular care contine o serie de informatii grupate pe categorii :
<html>
<head>
<title>Informatii de contact pe categorii</title>
</head>
<body>
<h3>Informatii de contact<h3>
<form name="contact" action="link_contact_info.php"
method="post">
<table
border="0" cellpadding="0" cellspacing="10"
summary="">
<tr>
<td>
<h4>Informatii
generale</h4>
<pre>
Numele: <input
type="text" name="nume">
Prenumele: <input type="text" name="prenume">
Adresa: <input
type="text" name="adresa">
Tara: <input
type="text" name="tara" size=12>
Telefon <input
type="text" name="telef" size=12>
Email: <input
type="text" name="email">
</pre>
</td>
<td>
<h4>Informatii
profesionale</h4>
<pre>
Societatea: <input
type="text" name="soc">
Telefon: <input
type="text" name="tel">
Functia: <input
type="text" name="adrsoc">
</pre>
<h4>Hobby-uri</h4>
<pre>
Sportul: <input
type="radio" name="hobby" >
Muzica: <input
type="radio" name="hobby" >
Lectura: <input
type="radio" name="hobby" >
</pre>
</td>
</tr>
</table>
<hr>
<input type="submit" name="submit"
value="Trimite">
<input type="reset" value="Anuleaza">
</form>
</body>
</html>
Formularul transmite informatiile catre pagina link_contact_info.php care contine link-uri catre categoria de informatii solicitate :
<html>
<head>
<title>Informatii contact</title>
</head>
<body>
<h3>Va multumim pentru datele furnizate!</h3>
<h4>Acestea sunt informatiile de contact primite de la
dumneavoastra:</h4>
<?php
print("<pre><br><a
href=\"rez_link_contact.php?id=1&nume=$nume&prenume=$prenume&
adresa=$adresa&tara=$
print("Informatii generale</a>");
print("<br><a
href=\"rez_link_contact.php?id=2&soc=$soc&tel=$tel&
adrsoc=$adrsoc\">");
print("Informatii profesionale</a>");
print("<br><a
href=\"rez_link_contact.php?id=3&hobby=$hobby\">");
print("Hobby-uri</a>");
print("</pre>");
?>
</body>
</html>
Fiecare link, la
rīndul sau transmite variabilele mai departe catre pagina rez_link_contact.php, dar utilizīnd
sirul de interogare, transmiterea
perechilor nume/valoare se realizeaza utilizīnd metoda
Pagina rez_link_contact.php afiseaza informatiile primite, functie de categoria lor, categorie identificata cu ajutorul parametrului id, transmis de asemenea īn cadrul sirului de interogare:
<html>
<head>
<title>Informatii contact</title>
</head>
<body>
<h3>Va multumim pentru datele furnizate!</h3>
<h4>Acestea sunt informatiile de contact
primite de la dumneavoastra:</h4>
<?php
if($id==1) //informatia de la primul link
if($id==2) //informatia de la al doilea link
if($id==3) //al treilea link
?>
</body>
</html>
Form-urile pot fi create si īn mod dinamic, furnizand o mai mare flexibilitate īn modificarea ulterioara a acestora. Astfel, un form simplu, care contine o lista de selectie generata dinamic:
<?
//defineste un URL in mod dinamic, pe baza variabilei $site
if ($site != "") :
header("Location:
https://$site");
exit;
else :
?>
<html>
<head>
<title>Lista selectie dinamica</title>
</head>
<body bgcolor="#ffffff" text="#000000"
link="#cbda74"
vlink="#808040"
alink="#808040">
<?
//se definesc optiunile listei intr-un array
$favsites = array ("www.connex.ro",
"www.yahoo.com",
"www.google.com",
"www.bnr.ro",
"www.msn.com");
// se construieste form-ul care contine lista
?>
<form action = "din_menu.php" method="post">
<select name="site">
<option value = "">Alegeti un site:
<?
$x = 0;
//se traverseaza array-ul afisindu-se pe rind optiunile
while ( $x < sizeof ($favsites) ) :
print "<option
value='$favsites[$x]'>$favsites[$x]";
$x++;
endwhile;
?>
</select>
<input type="submit" value="OK!">
</form>
<?
endif;
?>
Orice modificare īn lista de selectie se poate face īn acest caz foarte simplu, prin adaugarea corespunzatoare īn cadrul tabloului $favsites.
Se observa
din cadrul exemplelor de mai sus ca maniera de lucru obisnuita
cu
form-urile presupune īn general 3 pasi:
completarea cīmpurilor form-ului
transmiterea datelor catre un script de pe server (de obicei utilizīnd un buton de tip submit)
prelucrarea acestora de catre scriptul respectiv si afisarea rezultatelor prelucrarii.
Aceasta secventa de pasi presupune existenta a cel putin doua fisiere unul care contine formularul si al doilea, care rezida pe server, care prelucreaza datele din formular si īntoarce rezultatele.
O varianta mai eleganta decīt cea clasica descrisa mai sus pentru prelucrarea formularelor utilizīnd PHP se poate obtine daca se utilizeaza un singur fisier care contine atīt formularul cīt si partea de script necesara prelucrarii acestuia. Se foloseste o variabila ($ascuns care este setata īn momentul īn care formularul este transmis. In cadrul scriptului se testeaza daca variabila a fost sau nu setata; daca da, se initiaza prelucrarea datelor din cadrul formularului; daca nu, se afiseaza formularul pentru a se introduce date. Un exemplu īn acest sens este urmatorul (fisierul form_proc1.php) :
<html>
<head>
<title>Informatii inscriere</title>
</head>
<body bgcolor="#ffffff" text="#000000"
link="#cbda74"
vlink="#808040"
alink="#808040">
<?
// cream form-ul ca un sir de caractere pastrat in variabila $form
// in consecinta toate ghilimelele duble din form trebuie
//prefixate cu caracterul \
$form = "
<form action=\"form_proc1.php\" method=\"post\">
<input type=\"hidden\" name=\"ascuns\"
value=\"y\">
<b>Va rog sa ne furnizati urmatoarele informatii
pentru inregistrare!</b><br>
Nume:<br>
<input type=\"text\" name=\"nume\" size=\"20\"
maxlength=\"20\"
value=\"\"><br>
Email:<br>
<input type=\"text\" name=\"email\"
size=\"20\"
maxlength=\"40\"
value=\"\"><br>
<input type=\"submit\" value=\"Inregistreaza!\">
</form>"; //s-a terminat
form-ul
//incepe partea de prelucrare
// daca nu am vazut inca form-ul
//($ascuns="y" nu a fost inca transmisa)
if ($ascuns != "y"):
print "$form"; //atunci form-ul este afisat
else :
$error_flag = "n";
// verificam daca numele este
completat
if ($nume == "") :
print "<font
color=\"red\">
Ati uitat sa introduceti
numele!</font> <br>";
$error_flag = "y";
endif;
// verificam daca email-ul este
completat
if ($email == "") :
print "<font
color=\"red\">
Ati uitat sa introduceti
email-ul!</font> <br>";
$error_flag = "y";
else :
// converteste toate
caracterele din email in litere mici
//dupa ce a eliminat eventualele spatii cu
trim
$email = strtolower(trim($email));
// asigura faptul ca adresa de email
are sintaxa corecta
//eregi cauta pattern-ul construit īn sirul
$email
if (! @eregi('^[0-9a-z]+'.
'@'.
'([0-9a-z-]+\.)+'.
'([0-9a-z])$',
$email)) :
print "<font
color=\"red\">
Ati introdus o adresa de email
incorecta!!</font> <br>";
$error_flag = "y";
endif;
endif;
// Daca $error_flag este "y", reafiseaza form-ul
if ($error_flag == "y") :
print "$form";
else : // prelucreaza informatia
print "Bine ai venit, $nume!. Adresa ta de email este
$email";
//altfel
trimite raspunsul la form-ul transmis
endif;
endif;
?>
</body></html>
Īn cadrul acestuia, variabila $form pastreaza form-ul pe care dorim sa-l afisam. Afisarea form-ului se realizeaza īn doua situatii: daca acesta īnca nu a fost transmis (($ascuns != "y") sau daca s-a detectat o eroare de completare a unui cīmp (cīmp necompletat sau completat gresit) caz īn care $error_flag == "y". Īn restul cazurilor, se prelucreaza informatia transmisa si se afiseaza rezultatul (īn acest caz, un mesaj de salut).
Se observa ca verificarile datelor introduse de utilizator se pot realiza si īn PHP; īn acest exemplu se verifica completarea cīmpurilor nume si email, precum si corectitudinea introducerii email-ului. Se poate observa ca aceste verificari se realizeaza pe server, ceea ce presupune transiterea de fiecare data a informatiei prin retea.
C13
O prelucrare frecventa o reprezinta stocarea datelor primite de la utilizator prin intermediul form-ului īntr-un fisier. Chiar si cīnd se lucreaza cu cantitati relativ mari de informatie, utilizarea fisierelor text poate reprezenta o solutie. Este important īnsa īn acest caz sa se stabileasca maniera de introducere a informatiilor īn fisier (de obicei, un set de informatii pe o linie) precum si caracterul separator din cadrul unei linii. Caracterul separator nu este voie sa apara īn datele introduse, acest lucru trebuie verificat īnaintea scrierii datelor īn fisier. Un exemplu īn acest caz īl reprezinta fisierul form_proces2.php:
<html>
<head>
<title>Fisier Informatii</title>
</head>
<body bgcolor="#ffffff" text="#000000" link="#cbda74"
vlink="#808040"
alink="#808040">
<?
// creaza form-ul in variabila $form
$form = "
<form action=\"form_proc2.php\" method=\"post\">
<input type=\"hidden\" name=\"ascuns\"
value=\"y\">
<b>Va rugam sa completati chestionarul
urmator!</b><br><br>
<table border=\"0\" cellpadding=\"20\"
cellspacing=\"2\" >
<tr>
<td>
Numele si prenumele:<br>
<input type=\"text\" name=\"nume\" size=\"20\"
maxlength=\"20\" value=\"\"><br>
Email-ul:<br><br>
<input type=\"text\" name=\"email\"
size=\"20\" maxlength=\"20\"
value=\"\"><br>
</td>
<td>
Limba preferata:<br>
<select name=\"limba\">
<option value=\"\">Alegeti limba:
<option value=\"Engleza\">Engleza
<option value=\"Spaniola\">Spaniola
<option value=\"Italiana\">Italiana
<option value=\"Franceza\">Franceza
<option value=\"Germana\">Germana
</select><br><br>
Ocupatia:<br>
<select name=\"ocup\">
<option value=\"\">Ocupatia:
<option value=\"Student\">Student
<option value=\"Economist\">Economist
<option value=\"Programator\">Programator
<option value=\"Profesor\">Profesor
<option value=\"Manager\">Manager
</select><br>
</td>
</tr>
</table>
<input type=\"submit\" value=\"Trimite!\">
</form>"; //gata form-ul
// daca form-ul a fost trimis
if ($ascuns != "y") :
print "$form";
else : //scrie datele in fisier
$fd =
fopen("user_information.txt", "a");
//deschide fisierul pentru adaugare
$name = str_replace("|",
"", $nume);
$email = str_replace("|",
"", $email);
// se elimina caracterul | din intrare intrucit acesta
//va fi separator in fisier
$user_row =
$nume."|".$email."|".$limba."|".$ocup."\n";
// scrie informatiile in fisier, pe un rind,
separate prin |
fwrite($fd, $user_row) or
die("Nu se poate scrie in fisierul de informatii!");
fclose($fd);
print "Multumim ca ati
completat chestionarul nostru!";
endif;
?>
</body>
</html>
Fisierul text utilizat este user_information.txt iar caracterul separator este | a carui existenta este verificata īn intrare si daca se gaseste este eliminat.
De multe ori, prin selectarea realizata la nivelul unui formular, utilizatorul solicita sa i se transmita mai multe informatii referitoare la o anumita problema prin email. Informatiile necesare si care vor fi transmise prin email sunt pastrate īn cadrul unor fisiere care rezida pe server īn cazul nostru, aceste fisiere se numesc generale.txt (informatii generale), personal.txt (informatii referitoare la structura de personal) respectiv evenimente.txt (informatii referitoare la evenimentele curente). Fisierul prin care se realizeaza transmiterea informatiilor solicitate catre un utilizator este form_proc3.php:
<html>
<head>
<title>Informatii via email</title>
</head>
<body bgcolor="#ffffff" text="#000000"
link="#cbda74" vlink="#808040"
alink="#808040">
<?
//creaza variabila $form
$form = "
<form action=\"form_proc3.php\" method=\"post\">
<input type=\"hidden\" name=\"ascuns\"
value=\"y\">
<b>Inregistrati-va ca sa primit informatii despre
noi!</b><br>
Your Email:<br>
<input type=\"text\" name=\"email\"
size=\"20\" maxlength=\"40\"
value=\"\"><br>
<input type=\"checkbox\" name=\"informatii[generale]\"
value=\"y\">Informatii generale<br>
<input type=\"checkbox\" name=\"informatii[personal]\"
value=\"y\">Informatii personal<br>
<input type=\"checkbox\" name=\"informatii[evenimente]\"
value=\"y\">Evenimente curente<br>
<input type=\"submit\" value=\"Trimite!\">
</form>"; //gata form-ul
if ($ascuns != "y") :
print "$form";
else :
//realizeaza transmiterea prin email a
informatiilor solicitate
$headers = "From:
[email protected]"; //de unde
// cicleaza prin perechile
cheie/valoare
while ( list($key, $val) = each
($informatii) ) :
verifica daca valoarea este "y"
if ($val == "y") :
// creaza variabila
fisier corespunzatoare cheii curente
$filename =
"$key.txt";
$subject =
"Informatii $key"; //subiect mesaj
// deschide fisierul
$fd = fopen ($filename,
"r");
// citeste continutul
fisierul in variabila $content
$content = fread ($fd,
filesize ($filename));
// transmite email-ul
mail($email, $subject,
$content, $headers)
or die("Nu se poate transmite email!");;
fclose($fd);
endif;
endwhile;
// transmitere cu succes
print sizeof($informatii)."
informatii au fost transmise catre $email!";
endif;
?>
</body>
</html>
Se observa īn acest exemplu utilizarea unui tablou asociativ, $informatii, indexat pe baza unei chei de tip sir de caractere care corespunde numelui fisierului solicitat. Parcurgerea tabloului se realizeaza utilizīnd instructiunea while si functia each, rezultatul returnat de each se asociaza variabilelor $key respectiv $value utilizīnd functia list. Variabila $filename corespunzatoare numelui fisierului solicitat este creata īn mod dinamic, pe baza cheii checkbox-ului selectat, $key. Astfel, fisierul cu numele astfel stabilit (si care trebuie sa existe ! ! - īn varianta de mai sus nu se trateaza cazul īn care acesta lipseste sau nu se poate deschide) este deschis si citit, iar continutul acestuia este atribuit variabilei $content. Pentru transmiterea email-ului, se foloseste functia predefinita īn php, mail, care are nevoie de urmatorii parametri :
email - adresa catre care se transmite email-ul - primita din cadrul formularului
subiectul si continutul mail-ului - setate dinamic in functie de selectia dorita
header email - adresa de unde provine email-ul
3. Preluare informatii din baze de date
Suportul pe care PHP īl ofera referitor la bazele de date este o caracteristica importanta a limbajului; practic, exista suport pentru cele mai cunoscute servere de baze de date cunoscute īn prezent, printre care enumeram: MySQL, ODBC, Oracle, PostgresSQL, Informix, InterBase, Dbase, si altele. In exemplele prezentate īn continuare vom utiliza un server de baze de date MySQL; prin intermediul acestuia va fi ilustrata maniera generala de lucru a limbajului PHP cu baze de date.
Astfel, principalele functii puse la dispozitie de PHP pentru manipularea bazelor de date sunt:
int mysql_connect(string hostname [:port][:/cale_socket] [,string username][,string parola]) - functia realizeaza conexiunea catre un server de baze de date MySQL, pe baza (eventual) a unui nume de utilizator si parola.
int mysql_select_db(string nume_baza [, int link_id]) - dupa ce se realizeaza conectarea cu succes, functia realizeaza selectia unei anumite baze de date dorite, specificata prin nume. Cel de-al doilea parametru este folosit numai īn cazul existentei de conexiuni multiple.
int mysql_close([link_id]) - īnchide conexiunea catre serverul de baze de date MySQL.
int mysql_query(string query [, int link_id]) - transmite interogarea specificata prin parametru catre serverul de baze de date; functia NU returneaza rezultatul interogarii, ci un identificator al rezultatului interogarii. Alte functii trebuie utilizate īn continuare pentru a obtine informatii despre rezultatul interogarii.
int mysql_result(int result_id, int row [, cimpuri]) - este folosita īmpreuna cu mysql_query, artunci cīnd o instructiune SELECT este implicata, pentru a produce un set de date. Parametrul result_id se refera la valoarea returnata de mysql_query.
int mysql_affected_rows([int link_id]) - este folosita pentru a returna numarul de rīnduri afectate de o interogare care implica INSERT, UPDATE, REPLACE sau DELETE. Daca parametrul link_id nu este specificat, rezultatul de refera la ultimul link deschis.
int mysqli_num_rows(int result) - determina numarul de rīnduri returnat de o interogare SELECT. Parametrul result reprezinta identificatorul rezultatului interogarii.
array mysqli_fetch_row(int result) asigneaza un īntreg rīnd unui tablou indexat (īncepīnd de la 0). De obicei se utilizeaza īn combinatie cu functia list a tablourilor, cu ajutorul careia se pot asocia unor variabile elementele array-ului rezultat:
while (list($var1, $var2, ..)=mysqli_fetch_row($result)):
//realizeaza prelucrari asupra variabilelor $var1, $var2, .etc
endwhile;
array mysql_fetch_array(int result [, tip_rezultat]) - produce acelasi rezultat ca si mysqli_fetch_row, doar ca rezultatele sunt depuse īntr-un tablou asociativ. De fapt, tip_rezultat indica tipul tabloului, daca este specificat: MYSQL_ASSOC, MYSQL_NUM, MYSQL_BOTH. Tabloul este indexat utilizīnd numele coloanelor din rīndul returnat ca rezultat.
Un exemplu īn cadrul caruia se afiseaza continutul unui tablou de persoane dintr-o baza de date folosind functiile de mai sus, este prezentat īn fisierul quest_var8.php.
<html>
<?
include ("init_var8.inc")
?>
<head>
<title><? print "$titlu"; ?></title>
</head>
<body>
<?
$host="classic";
$baza_date="gianina";
$utilizator="gianina";
$parola_acces="gg";
//conexiunea catre baza de date
$leg=@mysql_connect($host,$utilizator,$parola_acces)
or die("Nu se poate stabili o conexiune la
serverul MySQL");
//selectia bazei de date
@mysql_select_db($baza_date)
or
die("Nu se poate selecta baza de date !");
print "<h3>Informatiile din
baza de date solicitata
sunt
urmatoarele:<h3>";
afis_info(); //functie care afiseaza informatii
mysql_close(); //inchidere conexiune
?>
</body>
</html>
Se observa utilizarea fisierului init_var8.inc care este inclus īn fisierul quest_var8.php utilizīnd functia include(). Astfel, pentru realizarea unei structuri modulare a script-urilor, precum si pentru a da posibilitatea de a crea biblioteci de cod (functii) care sa poata fi usor incluse īn orice script PHP, exista definite urmatoarele functii:
include ('nume_fisier') - include un fisier
include_once('nume_fisier') - īn plus, fata de functia anterioara, verifica daca fisierul a mai fost inclus; daca da, nu executa nimic
require('nume_fisier') - opereaza ca si include; singura deosebire este aceea ca includerea se realizeaza indiferent de eventualele conditii
require_once('nume_fisier') - verifica daca fisierul nu a mai fost inclus
Desi se obisnuieste ca fisierele de includere sa primeasca extensia .inc, acest lucru nu este īnsa obligatoriu. Daca fisierul de includere contine linii de program PHP, acesta trebuie sa includa marcatorii < ? respectiv ?> amplasati īn locatiile corespunzatoare.
Astfel, fisierul init_var8.inc inclus mai sus, si care contine, printre alte definitii, si functia afis_info(), este urmatorul:
<?
$titlu="Tabel nominal";
$tabel_date="utilizatori";
$bg_color="white";
$font_color="red";
function afis_info()
endwhile;
print "</table>";
}
?>
Exemplul de mai sus presupune existenta tabelei numita utilizatori din baza de date doina ; crearea tabelei poate fi realizata cu urmatoarea comanda MySQL :
create table utilizatori
(nume varchar(15),
prenume varchar(15),
email varchar(20),
obs varchar(30)) ;
Un alt exemplu care utilizeaza baze de date īl reprezinta implementarea unui proces de autentificare a utilizatorilor. Acestia se identifica printr-un nume de utilizator si o parola; atunci cīnd utilizatorul se īnregistreaza (la primul acces), numele utilizatorului ales si parola sunt memorate īntr-un tabel utilizatori (parola sub forma criptata, folosind algoritmul de criptare md5, pus la dispozitie de PHP prin intermediul functiei md5()). La urmatoarele intrari, utilizatorul este autentificat pe baza numelui si parolei stocate īn aceasta baza.
Īn plus, la crearea noilor utilizatori, se verifica daca numele dorit mai exista īn tabel; īn caz afirmativ, se cere introducerea unui alt nume de utilizator (trebuie sa fie unic!). Fisierul care implementeaza procesul de autentificare este autentif.php:
<html>
<head>
<title>Autentificare cu parola</title>
</head>
<body>
<?php
function print_form()
//setare variabile baza date
$host="classic";
$baza_date="doina";
$tabel_date="aut_utiliz";
$utilizator="doina";
$parola_acces="doina";
//utilizatori existenti
if (isset($trimis)):
if(!$bd=mysql_connect($host,$utilizator,$parola_acces)):
print("Nu se poate realiza
conexiunea la baza de date!\n");
else:
mysql_select_db($baza_date,$bd);
endif;
$sql="select * from $tabel_date
where nume='$nume_utiliz'";
$rez=mysql_query($sql);
$nr_linii=mysqli_num_rows($rez);
if ($nr_linii==0): //verifica existenta
numelui utilizator
?>
<h3>Nume utilizator eronat!
</h3>
<?
print_form();
else:
$linie=mysql_fetch_array($rez);
// verifica parola introdusa
if
(md5($parola_utiliz)!=$linie["cript_pass"]):
?>
<h3>Parola incorecta! </h3>
<?
print_form();
else:
?>
<h3>Parola acceptata! </h3>
<?
endif;
endif;
else:
//utilizatori noi, trebuie
inregistrati
if (isset($inreg)):
if(!$bd=mysql_connect($host,$utilizator,$parola_acces)):
print("Nu se poate realiza
conexiunea la baza de date!\n");
else:
mysql_select_db($baza_date,$bd);
endif;
//se cripteaza parola
$parola_md5=md5($parola_utiliz);
$exista="select * from $tabel_date
where nume='$nume_utiliz'";
$rez=mysql_query($exista);
$nr_linii=mysqli_num_rows($rez);
//daca nu mai exista utilizatorul
if ($nr_linii==0):
//acesta este inserat in tabela de
utilizatori
$sql="insert into $tabel_date values
(NULL,'$nume_utiliz','$parola_md5');";
$rez=mysql_query($sql);
if (!$rez):
?>
<h3>Eroare la introducerea
noului utilizator! </h3>
<?
print_form();
else:
?>
<h3>Utilizator inregistrat!
</h3>
<?
print_form();
endif;
else:
?>
<h3>Numele utilizator exista
deja! Introduceti un alt nume! </h3>
<?
print_form();
endif;
else:
print_form();
endif;
endif;
?>
</body>
</html>
Scriptul utilizeaza o tabela aut_utiliz pentru pastrarea informatiilor referitoare la numele si parola utilizatorilor care s-au inregistrat, care a fost creata cu urmatoarele carateristici
create table aut_utiliz
(id integer,
nume varchar(32),
cript_pass varchar(64),
primary key (id)) ;
Scriptul realizeaza doua lucruri distincte: īnregistreaza utilizatori noi (ceea ce presupune introducerea unei noi inregistrari īn tabela aut_utiliz īn cazul īn care utilizatorul nu mai exista deja) si autentifica utilizatorii existenti (ceea ce presupune o cautare īn tabela aut_utiliz, si o verificare a parolei introduse).
In mod asemanator, se poate pastra o baza de date care sa contina date de identificare referitoare la utilizatorii care au accesat un anumit sit. Astfel, pagina de intrare a unui astfel de sit contine un cookie care este setat la prima vizita a utilizatorului respectiv. Daca cookie-ul nu este setat, utilizatorul este īnregistrat īntr-o tabela numita vizitatori, iar cookie-ul este setat īn browser-ul clientului ; durata de viata a cookie-ului este stabilita de variabila timelimit. Dupa expirarea acestuia, o noua intrare a utilizatorului pe acelasi site, va fi īnregistrata din nou.
<?
include ("initial.php");
if (!isset($nume_cookie)) : //cookie-ul nu este setat
setcookie($nume_cookie, $val_cookie,
time()+$timelimit);
record_user(); //inregistreaza accesul in tabela cu
vizitatori
endif;
//daca cookie-ul exista, nu se inregistreaza nimic in baza!
?>
<html>
<head>
<title>Un site vizitat!</title>
</head>
<body>
Bine ati venit pe acest site! <br><a
href="vizit.php">Verificati numarul de vizitatori al acestui
site!</a>
</body>
</html>
Se observa includerea fisierului initial.php care contine definitii de variabile folosite precum si functiile record_user() respectiv most_recent_user()
<?php
//variabile de conectare baza date
$host="classic";
$user="doina";
$pswd="doina";
//baza de date
$baza_date="doina";
//tabela cu vizitatorii
$tabela_viz="vizitatori";
//conectare server MySQL
@mysql_connect($host, $user, $pswd) or
die("Nu
se poate realiza conexiunea la baza de date!");
//selectare baza date
@mysql_select_db($baza_date)
or
die("Nu se poate selecta baza de date $baza_date!");
$max_viz="7";
//variabile cookie
$nume_cookie="log_viz";
$val_cookie="1";
$timelimit=3600; //timpul dupa care
cookie-ul dispare
//dupa acest timp, la un nou acces se va realiza
// o noua inregistrare in baza
//functie pentru inregistrare utilizatori in tabela vizitatori
//din baza de date
function record_user()
//functie pentru extragerea si afisarea informatiilor din tabela
function most_recent_user()
?>
Tabela vizitatori a fost creata avīnd urmatoarea structura:
create table vizitatori
(browser varchar(20),
ip varchar(15),
host varchar(50),
time varchar(20)) ;
Functia record_user īnregistraza un nou utilizator īn tabela (informatii privind browser-ul clientului, adresa de ip, momentul accesului folosind variabilele de mediu $HTTP_USER_AGENT $REMOTE_ADDR') . Functia most_recent_user selecteaza afiseaza ultimii $max_viz vizitatori ai sit-ului; variabila $max_viz contine o valoare prestabilita, īn cazul nostru7. Functia este apelata īncadrul fisierului vizit.php, astfel:
<html>
<?
include ("initial.php");
?>
<head>
<title>Ultimii <?print $max_viz;?> vizitatori!</title>
</head>
<body>
<?php
print "Ultimii $max_viz vizitatori care au accesat acest site sunt:";
most_recent_user();
?>
</body>
</html>
Un alt exemplu īn cadrul caruia se utilizeaza baze de date īl reprezinta crearea unui motor de cautare. In cadrul acestuia, cautarea unei anumite informatii poate fi realizata pe baza mai multor criterii de selectie. In exemplul de mai sus, se utilizeaza un tabel de clienti, creat cu urmatoarele caracteristici:
create table clienti
(client_id integer auto_increment not null,
nume varchar(15),
prenume varchar(15),
email varchar(30),
primary key (client_id)); //identificatorul clientului este cheie primara
Cautarea unui client se poate realiza dupa nume, prenume sau email, selectie care pate fi realizata pe baza unei liste de selectie (categorii). Daca clientul a fost gasit, atunci, pe līnga informatiile corespunzatoare acestuia din tabela clienti, se mai afiseaza si toate comenzile pe care acesta le-a efetuat pīna īn momentul respectiv. Comezile sunt pastrate īntr-o alta tabela, comenzi, relationata cu tabela clienti pe baza cīmpului client_id. Astfel, structura tabelei comenzi este urmatoarea :
create table comenzi
(com_id integer auto_increment not null,
prod_id varchar(15),
cantitate integer,
id_client integer,
primary key (com_id)) ; //identificatorul comenzii este cheie primara
alter table comenzi add constraint che_leg
foreign key (id_client)references clienti (client_id) ;
//id client este cheie externa
Scriptul de mai jos nu prezinta si o parte pentru introducerea de date īn aceste tabele ; el doar extrage date din cadrul celor doua tabele relationate astfel.
<?
$form =
"<form action=\"search.php\" method=\"post\">
<input type=\"hidden\" name=\"ascuns\"
value=\"y\">
Cheie de cautare:<br>
<input type=\"text\" name=\"cheie\"
size=\"20\" maxlength=\"20\"
value=\"\"><br>
Cautare dupa:<br>
<select name=\"categorie\">
<option value=\"\">Alegeti un criteriu de cautare dupa:
<option value=\"nume\">Numele clientului
<option value=\"prenume\">Prenumele clientului
<option value=\"email\">Email-ul clientului
</select><br>
<input type=\"submit\" value=\"Cauta\">
</form>
";
// afiseaza form-ul daca inca nu a fost trimis
if ($ascuns != "y") :
print $form;
else :
// connectare la serverul MySQL si
selectia bazei de date
@mysql_connect("classic",
"doina", "doina")
or die("Nu se poate realiza conexiune la
serverul MySQL!");
@mysql_select_db("doina")
or die("Nu se
poate selecta baza de date!");
//
executa interogarea functie de categoria solicitata
$query = "SELECT nume, prenume,
email, client_id FROM clienti
WHERE $categorie = '$cheie'";
$result = mysql_query($query);
// Daca nu s-a gasit nimic, afiseaza
mesaj si reafiseaza form-ul
if (mysqli_num_rows($result) == 0) :
print "Din pacate nu a
fost gasita nici o inregistrare.
Incercati din nou!";
print $form;
// s-au gasit rezultate
else :
// formateaza si afiseaza
rezultatele interogarii
list($nume, $prenume, $email, $id) =
mysqli_fetch_row($result);
print "<h3>Informatii
despre clienti:</h3>";
print
"<b>Numele:</b> $nume <br>";
print
"<b>Prenumele:</b> $prenume <br>";
print
"<b>Email:</b> <a
href=\"mailto:$email\">$email</a> <br>";
print "<b>Id
client:</b> $id <br>";
print "<h3>Istoric
comenzi:</h3>";
// interogare comenzi
$query = "SELECT com_id,
prod_id cantitate FROM comenzi
WHERE id_client = '$id' ORDER BY cantitate DESC";
$result = mysql_query($query);
print "<table border =
1>";
print
"<tr><th>ID comanda</th><th>ID
produs</th><th>Cantitate</th></tr>";
// formateaza si afiseaza
rezultatele interogarii
while (list($id_comanda,
$id_produs, $cant) =
mysqli_fetch_row($result)) :
print
"<tr>";
print
"<td>$id_comanda</td><td>$id_produs</td><td>$cant</td>";
print
"</tr>";
endwhile;
print
"</table>";
endif;
endif;
?>
|