Sunteți pe pagina 1din 10

i

EDITORIAL II

.
Am vazut din aceste exemple carezultatulunei functiipoate fi 0valoare (functia inmultire care ofera rezultatul inmultirii lui $x eu $y) sau 0 aetiune (functia vreau_la_mareO care afi~eaza un text). Rezultatul unei functii mai poate fi ~i 0 valoare de adevar, TRUE sau FALSE, ca in exemplul urmator: operatorul ! NOT: Aceasta functie ilustreaza foarte bine folosirea operatorilor logici. Dad ora este mai mare sau egala cu 5 ~imai mica sau egala cu 9, ne putem face cafeaua. Daca e 4am nu yom bea cafea de~i $ora <=9 ~ila fel daca e ora 22 de~i $ora >=5. Ambele conditii trebuie sa fie adevarate pentru ca e_dimineataO sa fie TRUE.

Daca (if) este vara mergem la mare, daca nu (else), mai a~teptam.

function

$luna

date("n");

/* date("n") retumeaza reprezentarea numerica a lunii in care suntem, de la 1 pentru ianuarie palla la 12 pentru decembrie. Astfel, daca luna curenta e aprilie, $lunava fi 4 ~idaca e noiembrie $luna va fill*/

$luna-a";

Functii predefinite
Toate functiile exemplificatepanaacum au fast definite de noi. Existii insa ~ifunctii predefinite, integrate in PHP, pentru 0 multime deactiuni. Un exemplu este functia dateO pe care tocmai am folosit-o ~i care returneaza ora, luna, anul precum ~i alte elemente ale datei. Alt exemplu ar fi functia countO pe care am folosit-o sa numaram cate elemente sunt intr-un array. Exista functii pentru aproape orice in PHP ~i va sIatuiesc sa cautati in manualul PHP de pe CD ori de cate ori aveti nevoie de ceva.

?>

Dadi e mai devreme de luna iunie sau (operatorullD mai tarziu de septembrie, nu e eazul sa ne facem bagajele. Altfel, drumul e al nostru! Puteti modifica (temporar) setarile de data din Windows ~i sa schimbati luna pentru a vedea ce se intampla. Nu uitati sa reveniti la setarile anterioare!

Sau, acela~i lucru scris folosind

"&

Scriptul care are grija de tensiunea noastra: nici un pic de cafea dupa ora 10.

CHIP SPECIAL

SITEDINAMIO

.
I'

PHP i formularele HTML

PHP i formularele
Formularele ~i link-urile sunt mediatorii interactivitatii on-line.
A li completat, desigur, zeci de for~ulare on-line, incepand de la inscrierea la un serviciu gratuit de e-mail palla la semnareaunei carli de oaspeli.Vali intrebat cum funclioneaza acestea ~i care este mecanismul care face posibil pastrareadatelorintroduse ~imanipularea lor ulterioara? V-ali uitat vreodata nedumerili la link-urile interminabile ~i aparenttara gensdinunelepagini de web? In acest capitol yom afla cum ajunge informalia dintr-un formular la un script PHP ~i cum, un link poate fi mai mutt decat ceea ce pare la prima vedere.

HTML
name~"nrl" value~"15"><br> Al doilea numar: <input type~"text" name~"nr2" value~"13"><br> <input type~"submit" name~"buton submit" value~"Aduna"> </form>

Rezultatul

adunarii lui 15 cu 13 este 28

'in;~pO1

Numerele trimise cu ajutorul formularului au fast adunate ~i rezultatul afi~at.

Actiune! ,
Un formular este campus in mod normal din declaralia <form...> urmata de elemente de tip <input> ~iun buton "submit". Inmomentulin care apasambutonul submit, datele adaugate de utilizator sunt transmise serveruluiuncleStintprelucrate. Sa vedem practic cum se realizeaza acest lucru, recreand intr-un formular dialogul cu care am inceput sa invalam PHP, uncleGigel trebuie sa adune doua numere. Pentru aceasta yom crea doua fi~iere, formular.html ~i adunare.php. In fi~ierulHTML yom avea urmatorul formular:
<form action~"adunare.php"
Primul numar: <input name~"nrl"><br> Al doilea numar: <input type~"text" method~"POST"> type~"text"

name~"nr2"><br> <input type~" submi t" value~"Aduna">

name~"buton

submit"

</form>

Rulali httv:/Ilocalhostlformular.html, scrieli cate un numar in fiecare casula de text ~iapasali butonul "Aduna". Repetali experimentul cu alte numere. Din acest exemplu observam mai multe lucruri: in declararea tag-ului <form> am specificat fi~ierul care urmeaza sa prelucreze datele (action="adunare.php"), precum ~i metoda prill care se transmit dateIe caire server, in cazul de fala POST. Elementele formularului au cate un nume dura care vor fi recunoscute de caire interpretor (ex: $]OST['nrl 'J). La apasarea butonului "Aduna", informalia va fi trimisa serverului. $_POST este un array care conline toate datele trimise prill formular cu metoda POST jar fiecare din elementele acestui array poate fi accesat ca $]OST['nume - variabila']. Tema: adaugali inca un element, <input type="text" name="nr3"> in formutar ~i modificali scriptul PHP pentru a aduna cele trei numere.

Daca accesam httv:lllocalhostl formular.html observam ca in campurile destinate numerelor ce urmeaza a fi adunate exista deja valorile 15 ~i respectiv 13. Putem apasa butonul "Aduna" pentru a obline rezultatu128 sau putem modifica oricare din valorile prezentate in formular (direct in browser, nu editand codul HTML), pentru a obline alt rezultat.

Verificare
Un utilizator ~ugubal ar putea introduce un text in lac de un numar sau ar putea lasa chiar cele doua campuri goale. In exemplul nostru aceasta n-ar fi 0 problema insa daca am face 0 aplicalie serioasa on-line pentru primaria ora~ului, cu ajutorul careia cetalenii sa-~i plateasca impozitele, omiterea verificarii datelor trimise de utilizator ar duce la haos. Daca cetalenii arputea scrie un text oarecare in lac de codul numeric personal sau nu l-ar completa, fi~a de impozit nu ar putea fi procesata. De aceea, pentru orice fel de date trimise de catre utilizatori yom face verificarile de rigoare. Pentru a exemplifica, yom face doua fi~iere noi, cnp.html cu care yom cere codul numeric personal al utilizatorului ~i verificare_cnp.php cu care yom verifica daca acesta este valid. cnp.html va conline urmatorul formular:
<form action-" verificare_cnp.php" method~"POST"> Nume: <input type~"text" name~"nume"><br> Cod numeric personal: <input type-"text" name-"cnp"><br> <input type~"submit" value~"Verificare CNP"> </form>

Fi~ierul adunare.php va conline urmatorul cod:


<?
$nrl $nr2
~

Valoare
Elementele unui formular pot avea 0 valoare predefinita, modificabila de caire utilizator, daca atunci cand Ie declaram, specificam aceasta valoare. Modificali fi~ierul formular.html pentru a conline codul urmator:
<form action~"adunare.php"

$_POST['nrl'];

$_POST['nr2'];
~

$rezultat

$nrl + $nr2;

print "Rezultatul adunarii lui $nrl cu $nr2 este $rezultat"; ?> <p><a href~" </a></p>
formular. html

">inapoi

method~"POST"> Primul numar: <input type~"text"

Algoritrnul din verificare

cnp.php va

CHIP SPECIAL SITEDINAMIC -

to

fi orientat dura cerinte: campul "Cod numeric personal" nu poate fi gal, trebuie sa fie numeric, sa cantina 13 caractere ~iprima cifra a sa trebuie sa fie 1 sau 2.Vomverifica pe rand fiecaredin cerinte iar in cazul unei incompatibilitati oprim executia scriptului folosind exit;. Daca nu am opri executia dura semnalarea erorii, scriptul ar rula in continuare palla la carat ~i un cod numeric personal invalid ar fi introdus in baza de date a primariei de~i pe pagina de output ar aparea mesajul de eroare.Am putea evita rularea scriptului pana la carat daca am folosi if ... else:
if cerinta 1 nu este indeplinita

personal\" este gol! Apasati butonul <b>Back</b> in browser pentru a reveni la pagina anterioara ~i a-l serle corect."; exit;

*/ $prima_cifra
0, 1); if($prima_cifra !~ 1 && !~ 2)
~

substr ($_POST['Gnp'],

$prima_cifra

print "Prima cifra a CNP trebuie

/* Daca scriptul a ajuns pana aici inseamna ca cerinta anterioara a fast indeplinita. Trecem atunci la urmatoarea verificare: daca CNP nu este numeric, afi~am alt mesaj de eroare. is_numeric este 0 functie predefinita in PHP care verifica dura cum ii zice ~inumele, daca informatia trimisa de utilizator este un numar sau nu*/
if(!is_numeric($_POST[ 'cnp']))

sa fie 1 sau 2! Apasati butonul <b>Back</b> in browser pentru a reveni la pagina anterioara ~i a1 serle corect."; exit;

afi~eaza mesaj de eroare print "Campul \"Cod numeric else personal\" trebuie sa fie numeric! Apasati if cerinta 2 nu este indeplinita butonul <b>Back</b>

/*Daca rularea scriptului a ajuns palla in acest punct inseamna ca toate cerintele au fast indeplinite ~icodul numeric personal este corect. In aplicatia noastra ar urma sa il introducem in baza de date dar cum nu acesta era scopul exemplului, yom afi~adoarunmesaj de confirmare:*/
print "Acesta este un CNP valid!"; ?>

in

browser pentru a reveni la pagina anterioara ~i a-l serle corect.";

afi~eaza mesaj de eroare

exit;

GET
else
if cerinta 3 nu este indeplinita...

/* daca CNP nu are exact 13 caractere, afi~am un mesaj de eroare. Functia strlen retumeaza numaml de caractere (inclusiv spatii) dintr-un string. strlen("mere")=4, strlen("120")=3 ~i strlen("4 mere")=6. */
$nr_caractere
~

Cu if ... else De-ampierde in acolade a~a ca yom folosi exit in verificarile noastre pentru a opri rularea ulterioara a scriptului daca una din cerinte nu este indeplinita. In continuare yom scrie scriptul de verificare a codului numeric personal introdus in formularul cnp.html. Scrieti ~i voi acest cod omitand comentariile ajutatoare.
<?

strlen ($_POST['cnp']);
!~ 13)

if($nr_caractere

print "Campul \"Cod numeric personal\" trebuie sa alba exact 13 caractere! Apasati butonul <b>Back <It> in browser pentru a reveni la pagina anterioara ~i a-l serle

core ct.";

exit;

/*daca utilizatorul nu a introdus nimic in campul "Cod numeric personal", ii afi~am un mesaj de eroare ~i oprim
executia scriptului */
~~

1
if ($_POST['cnp'] "")

print "Campul \"Cod numeric

/* dacaprima cifra a CNP nu este 1sau 2, codul numeric personal nu este valid. Pentru verificarea acestei cerinte yom folosi functia substr care returneaza 0 parte dintr-un string. Functia substr se apeleaza astfel: substr("string", numarul caracterului de lacare seincepe "taierea", numarul de caractere ce urmeaza a fi retumate dura acest caracter). lata ~i cateva exemple:
substr("Anaare mere", 0, 6) ~ "Ana ar" substr("Anaare mere", 1, 6)
~

Formularele pot fi transmise serverului ~i cu metoda GET form action="fi~ier.php" method="GET" insa este preferabil sa evitati sa folositi GET in formulare din trei motive: datele din cadrul formularului stint transmise serverului prill ata~areala URL, nu sepot transmite decat caractere ASCII ~icantitatea deinformatietransmisibila estelimitata ca marime. Daca folosim metoda GET trebuie ca ~i in cadrul scriptului PHP sa accesam variabila ca atare (ex: $_GET['cnp'] in lac de $]OST['cnp']). Datele formularului Stinttransmise prill URL sub forma http://www .adresa. site/fi~ier.php? variabila 1=valoare 1 &variabila2= valoare2. Ca regula generala, orice variabile trimise scriptului PHP prill intermediul unui URL sunt accesibile in array-ul $- GET ~i astfel nu este neaparat necesar sa construim un formular pentru a trimite variabile serverului. Vom rula un exemplu simplu:
formular.html <form action~"adunare .php" method~"GET"> Primul numar: <input type~"text" name~"nrl"><br> Al doilea numar: <input type~"text" name~"nr2"><br> <input type-"submit">
I

"na are"
~

Formular cu un camp pentru introducerea codului numeric personal pentru verificare.

substr("Ana are mere", 0, 1)


substr("Ana are mere", 1, 2)
~

"A" "na"

substr("Anaare mere", 6, 5)

"e mere"

CHIP SPECIAL .....

SITE DINAMIC
I

.
I

I
I

Variabilele transmise prin metoda GET suntvizibile in bara de adrese a browserului.


</form>

adunare.php
<?
II

$nrl

$_GET['nrl']; $_GET['nr2'];
~

$nr2

$rezultat

$nrl + $nr2;

adunare.php?nr 1=423&nr2=546, transmitand datele prill URL, tara sa completam formularul. In cadrul site-ului nostru yom folosi formulare pentru a lasa posibilitatea utilizatorilor sa adauge comentarii ipentru a trimite adresa uncledoresc saprimeasca cartile cumparate. Datele din formularele completate de catre vizitator vor fi trimise serverului prill metoda POST. Tot in cadrul site-ului yom folosi de multe ori GET pentru a obtine variabile dintr-un URL. Spre exemplu, pentru a vedea 0 carte anume adresa va fi http://localhost/ carte.php?carte_id=345. ScriptulPHP va selecta din baza de date claarinformatiile despre cartea cu id 345 iIeva afia.Vom vedea cum in urmatoarele doua capitole.

Formularul cu ajutorul caruia yom trimite doua numere pentru a fi calculate la server. bil i pentru metoda GET sau pentru elementele din array-ul $]ILES. Variabila $- GET['oarecare']ar puteafi accesibilaca $oarecare iar $]ILES['fisier']['size'] ca $fisier size. Deipoate parea mai uor de _ programat aa,este recomandabilsa lasati setarea Globals=Off in php.ini (aa cum
este setataimplicit) iintotdeauna sa accesati

print "Rezultatul adunarii lui $nrl


I'
I

cu $nr2 este $rezultat"; ?>

Glebals
Exista 0 setare in php.ini care v-ar permite accesulla variabilele trimise de utilizator lara sa Ie accesati din array. Astfel, intrun form trimis prill metoda POST, valoarea din <input type="text" nume="oarecare"> ar putea fi accesibila ca $oarecare in lac de $]OST['oarecare']. Acelailucruestevala-

Ruland acest exempluputem vedea

cum numele i valorile elementelor formularului se transmit fiierului PHP in URL. Putem accesa direct in browser http://localhost/adunare.php?nrl=9053 &nr2=4906 sau http://localhost/

variabilele din array-ill din care provin. Asfel evitati0 seriede problemede securitate, probleme pe care Ieyom explica mai pe larg in capitolul dedicat securitatii

aplicatiilor web).

Lucrul cu baze de date


III

PHP i MySQL
Dezvoltarea exploziva a limbajului PHP din ultimii ani este in cea mai mare parte datorata u~urintei cu care acesta lucreaza cu bazele de date.
HP oferaprogramatorului 0multime de functii predefinite pentru lucrul cu baza de date. Aceasta inseamna ca din cadrul PHP putem executa toate operatiunile pe care Ie-am tacut in capitolul dedicat invatarii MySQL. Sa ne reamintim paiipe care i-am facut pentru a interactiona cu baza de date din linia de comanda: 1. lie-am conectat cu numele iparola (mysql -u root -p) 2. am ales baza de date cu care sa interactionam (USE librarie) 3. am executat 0 comanda SQL (SELECT * FROM carti;)
CHIP SPECIAL - SITE DINAMIC

abordari. Cu functia mysqt connect ne conectam la baza de date specificandhostulla care aceasta se afla (localhost), numele de utilizator (root) iparola (pentru ca aceasta este goala folosim un string
gal:
1111).

Functia mysqtselect-

db ("libra-

Din PHP putem face acelai lucru, cu ajutorul functiilor predefinite. Sa facem primul nostru script cu care sa interactionam cu baza de date (nu uitati ca serverul MySQL trebuie sa fie pornit!):
testphp <?
mysql_connect("localhost","root", ""); mysql_select_db("librarie") ;

mysqlquery(" SELECT * FROM carti");


?>

Observam similitudinea illITecele doua

rie") este echivalenta cu USE librarie. Aceste doua functii trebuie apelate intotdeauna atunci dnd dorim sa lucram cu baza de date, inainte de a efectua vreo interogare. Putem efectua oricat de multe interogari dorim tara sa fie nevoie sa ne reconectam pentru fiecare din ele la baza de date, doarprin apelareamysqt connect i mysql_select_db 0 singura data la inceput. In ce privete mysql_query, notam doua lucruri. In primul rand, nu am folosit punct i virgula pentru a incheia instructiunea SQL aacum era necesar in linia de comanda. In al doilea rand, daca rulati scriptul in browser nu yeti vedea nimic pe ecran aa cum probabil v-ati ateptat.Aceasta pentru ca mysql_query

EDITORIAL n

n;:8n

executainterogarea Jar nu afi~eazarezultatulciretumeaza 0 valoare: TRUE daca interogareaa fast efectuata cu succes sail FALSE daca aceasta a e~uat. Pentru instructiunile de tip SELECT, SHOW, EXPLAINsauDESCRIBE, mysql- query retumeaza ~i un identificator de resurse pe care 11putem atribui unei variabile. Resursele stint variabile speciale care cantin referinte catre resurse exteme (precum rezultatul unei interogari a bazei de date) ~i pot fi manipulate cu ajutorul functiilor. Este evident ca dad rezultatul interogarii ar fi fast afi~atdirect in browser, nu amputeamodificaaspectul sailfunctia paginilordewebdinamice~iamazon.com ar fi 0 simpla in~iruire de date. Sa ne convingem ca rezultatul interogarii este 0 resursa. Pentru aceasta modificatiultimaliniea scriptului~iscrieti:
testphp
<7 mysql_connect("localhost","root",""); mysql_select_db("librarie");

Pentru aafi~avalori cadrul din resursei retumate putem folosi mysql_result In exemplul urmiitorafi~amcontinutul campului titlu de pe primul rand al tabelului (numerotarea incepe de la 0): testphp
<7 mysql_connect("localhost","root", ""); mysql_select_db("librarie") ;

FROM carti");

.
($resursa,MYSQLASSOC) ;

$arrRezultat ~
mysql_fetch _array

print_r

($arrRezultat);

Daca nu specificam tipul array-ului Sail folosimMYSQL_BOTH, vomputeaaccesa rezultatul atilt numeric cat ~i asociativ.
$resursa = mysql_query("SELECT * FROM carti"); $arrRezultat
~

$resursa~ mysql_query("SELECT FROM *


carti") ; $rezultat = mysql_result($resursa, 0, "titlu") ; print $rezultat; 7>

mysql_fetch_array($resursa) print $arrRezul tat [1] ." ."<br>";

".$arrRezultat[3] print

$arrRezul tat [ 'id_carte' ] ."

".$arrRezultat['titlu'];

Parametrii functiei mysqtresult sunt: resursa ($resursa), randul (0, primul rand al tabelului) ~i numele campului ("titlu");
testphp <7
mysql_connect(" localhost", "root", ""); mysql_select_db("librarie") ; /* afi"eaza continutul eampului descriere de pe eel de-al doilea rand al tabelului */ $resursa - mysql_query("SELECT * FROM carti") ; $rezultat = mysql_result($resursa, 1,

$resursa~ mysql_query("SELECTFROM *
carti") ; print $resursa; 7>

Observam folosirea operatorului . de concatenare a stringurilor pentru a interpune spatii ~iline break intre variabilele ce urmeaza a fi afi~ate.Mai observam ca, de~imysql_numJows ne spline ca avem mai multe carti, printJ ($arrRezultat) sailprint $arrRezultat['titlu'] ne afi~eaza doar primul element al array-ului. Putem afi~a toate valorile array-ului folosind while:
$resursa

mysql_query("SELECT *

FROM carti");
while ($row=mysql_fetch _array ($resursa))

Putem de asemenea scrie interogarea SQL intr-o variabila pe care sa 0 folosim ca parametru al functiei mysql_query. Aceasta metoda este preferata de multi deoarece textul interogarii este mai u~or de reperat in cadrul scriptului:
testphp
<7 mysql_connect("localhost","root", ""); mysql_select_db("librarie") ; $sql
~

"descriere") ; print $rezultat; /* sau continutul campului id carte de


pe eel de-al treilea print rand al tabelului * / 2,

print $row[ 'titlu']." " .$row ['descriere'] . "<br>";

mysql_result($resursa,

"id_carte");
7>

"SELECT * FROM carti";


~

$resursa
7>

mysql_query($sql);

print $resursa;

MysqlJesult este greoi de folosit deoarece suntem nevoiti sa accesam fiecare coloana a fiecarui rand in parte. In ajutorulnostru vine mysqljetch_array cu care putem accesa valorile din tabelul retumat in interogare dintr-un array. Putem accesa resursa ca un array numenc:
testphp
<7
mysql_connect ("localhost", "root", "") ; ;

PHP ofera functii pentru accesarea resurselor care rezulta din mysql_query. Cuajutorulmysql_num Jows putemafla dite randuri a retunat interogarea: test
<7 mysql_connect("localhost", "root", ""); mysql_select_db("librarie"); $resursa

Folosind while scriptul trece prilltoate valorile array-ului palla la sf'ar~it~ipentru fiecare din ele afi~eazavalorile campurilor titlu ~i descriere. Variabila $row este la randul ei un array (observatica am apelat-o ca atare, $row['titlu']) ~i asta pentru ca $arrRezultat este un array multidimensional. Ce este un array multidimensional? Un array care contine la randullui alte array-uri. In cazul de rata, $arrRezultat este multimea array-urilor de randuri din tabel iar fiecare $row este un array care cuprindevalorileranduluirespectiv. Spre exemplu, in pseudocod:
$arrRezultat

mysql_select_db("librarie")

php

$resursa
FROM

mysql_query("SELECT *

- array(randul

1,

carti");

$arrRezultat

randul 2, randul 3); $randull = array(titlu de pe randul 1, descriere de pe randul 1); $randu12
~

mysql_fetch_array$resursa,MYSQL_NUM); ( print_r 7> ($arrRezultat);

mysql_query("SELECT * FROM

array(titlu de pe randul 2,
de pe randul 2);

carti");
$nr = mysql_num_rows($resursa);

descriere

$randu13

array(titlu de pe randul 3,

print "Stint $nr carti in baza de date"; 7>

sail asociativ:
$resursa
~

descriere de pe randul 3); mysql-query (" SELECT *

CHIP SPECIAL - SITE DINAMIC

~---

Dupa cum yom vedea in continuare, aceste ciiteva func!ii ne vor fi de ajuns pentru a putea construi un site dinamic interactiv ~i rareori yeti avea nevoie de mai mult. Va recomand ca de Gate ori sunte!i in impas sa consulta!i manualul PHP pentru a afla informa!ii despre celelalte func!ii MySQL disponibile.

nume_domeniu-'. $row['nume_domeniu' .' ] ">' .$row['nume_domeniu' '</a><br>'; J.

Iibl~aria Olea
Soot 6 carti In baza de date

Mai putin inseamna mai mult


Sa revenim la site-ul nostru. Daca ar fi fast sa facem site-ul in HTML, pentru fiecare carte ar fi trebuit sa concepem Gate0 pagina ~ipentru fiecare noua carte ar fi trebuit sa modificam pagina domeniului caruiaii apaqine. CuPHP in schimb tot ce trebuie sa facem este prima pagina, 0 pagina pentru domeniu ~i una pentru carte. Atat - trei pagini vor fi tot ce avem nevoie, indiferent de numarul caqilor sau domeniilor din baza de date. In continuare yom exersa func!iile MySQL ale PHP creand 0 schi!a a site-ului. Spuneam ca pe prima pagina yom avea numele de domenii. Numele de domenii Ie ob!inem folosind interogarea SELECT

Domenii
Poezii Teatru :tJitologie
0 primapagina ce contine lista domeniilor disponibile.
print $row['nume_domeniu'J .'<br>'; ?> </body></html>

Astfel in prima pagina toate numele de domenii vor fi link-uri, ca de exemplu <a href="domeniu.php?nume_domeniu =Poezie">Poezie</a>. Fi!i aten!i la dispunerea ghilimelelor in cadrul scriptului, in specialla modul in care am inclus ghilimele duble intr-un string incadrat de ghilimele simple. Sa facem in continuare scriptul care afi~eazatitlurile disponibile in domeniul pe care am dat click. In fi~ierul domeniu.php yom folosi variabila trimisa prill URL pentru a ob!ine din baza de date doar carlile apaqinand domeniului respectiv:
domeniu.php
<html> <head> <meta http-equiv-"Content-Type" content-"text/html; charset=iso-8859-2">

<title>libraria mea</title>

nume- domeniufrom domenii iarpentru a


Ie afi~a, scriptul PHP pentru prima pagina va arata ca in exemplul urmator:
index.php <html> <head> <meta
'Ii

http-equiv-"Content-Type"
charset-iso-8859-2">

content-"text/html;

Scrie!i ~irula!i acest script. E interesant, spune!i, dar nu suficient de impresionant? Ei bille, atunci sa facem in a~a fel incat sa putem da click pe fiecare nume de domeniu ~i sa intram intr-o pagina unde ne Stint afi~ate carlile din domeniul respectiv. Cum facem acest lucru? Ne reamintim ca am legat tabelele domenii ~i carti prill id_domeniu. In limbaj SQL am putea sa folosim interogarea SELECT
titlu from Dartt, dementi and where nume domeniu='Poezii' dementi.

</head> <body> <? mysql_connect("localhost", "root", ""); mysql_select_db("librarie") ; $sql = "SELECT titlu FROM Dartt, dementi WHERE nume domeniu= '".$_GET ['nume_domeniu'].'" AND domenii.id_domeniu=carti.id_domeniu"; $resursa

- mysql_query($sql);

$nr - mysql_num_rows($resursa);
print "<p>Sunt $nr Dartt in acest domeniu</p>"; ?> <h2>Titluri</h2> <?

<title>libraria mea</title> </head> <body> <hl>libraria mea</hl> <? mysql_connect("localhost","root", ""); mysql_select_db("librarie") ; /* sa afi"am pe prima pagina numarul de Dartt din baza de date: */ $sqll = "SELECT * FROM carti"; $resursal

id_domeniu-carti.id_domeniu; pentru a

mysql_query($sqll);

$nr - mysql_num_rows($resursal); print "<p>Sunt $nr Dartt in baza de date</p>"; ?> <h2>Domenii</h2> <? /* "i in continuare afi"am numele de dementi: */ \ $sq12

afi~atoatetitluriledincategoria"Poezii" ~ila fel pentru toate celelalte categorii. Nu yom face Gate pagina pentru fiecare 0 domeniu in parte deoarece acesta este exact scopul nostru: sa scriem un singur script care sa afi~eze dinamic rezultatele: carlile de poezii pentru domeniul "Poezii" ~ioperele de teatru pentru domeniul "Teatru". Pentru aceasta yom folosi 0 variabila care sa cantina numele domeniului, variabila pe care 0 transmitem scriptului domeniu.php printr-un URL. Va trebui samodificam in index.php linia
print $row[ 'nume_domeniu'J. '<br>';

while($row-mysql_fetch_array($resursa)

Soot 3 carli 1n acest domeruu

Titluri
Poem
Poem. Poem, volumul volumul 2 3

"SELECT nume_domeniu

FROM domenii"; $resursa2

mysql_query($sq12);

while($row -mysql_fetch array($resursa2) _ )

~i sa transformam numele de domeniu intr-un linkprin care sa transmitem variabila scriptului din domeniu.php.
print '<a href-"domeniu.php?

Lista cartilor din domeniul Poezii alese dupa id-':domeniu.

.
~

CHIP SPECIAL - SITE DINAMIC

$sql din domeniu.php ~isa 0 simplificam folosind id- domeniu ca referinta:


$sql
~

.
lib."arhl men
Sunt 6 carliin baza de date

"SELECT titlu FROM carti WHERE

id_domeniu~". $_GET ['id_domeniu'];

libraria mea
Soot 6 carli In baza de date

Domenii
Poem Teatru Nfitolo.cie

Putem, in mod similar, face 0 pagina care sa preia id_carte din URL ~isa afi~eze pentru cartea respectiva titlul, autorul ~i descrierea. Vom face acest lucru intr-unul din capitolele urmatoare. Pentru moment insa, este suficient sa intelegeti functiile MySQL ~i modulin care se folosesc variabilele in interogarile SQL.

Dolnenii
Poezii Teatru Mtologie

~i chiar mai mult


Putem trimite numele domeniului prin URL.

print $row['titlu'].'<br>';

7> </body> </html>

Putem folosi functia mysql_query pentru a efectua ~ialte operatii cu baza de date: INSERT, UPDATE sau DELETE. Sa facem intiii un script care ne afi~eaza toate titlurile din tabelul carti, script de care yom avea nevoie in continuare pentru a consulta baza de date tara sa fim nevoiti sa intram in linia de comanda. Vom prezenta dateleintr-un tabelHTML:
toate_cartile.php
<7 mysql_connect("localhost", "root", ""); mysql_select_db("librarie") ;

Putem trimite id-ul domeniului, pentru 0 orientare mai uoara.

Va spuneam in capitolul despre MySQL cum id-urile ne pot u~uramunca. Acest lucru devine evident atunci cand creem pagini de web dinamice deoarecesintaxainterogarilor SQLpeate fi simplificata foarte mult. Fiecare nume de domeniu din tabelul domenii are dite un id asocial ~i atunci, ~tiindcadomeniulPoezii are id- domeniu I am putea alege cartile din domeniul respectiv folosind simplu: SELECT * FROM carti WHERE id domeniu=l in lac de mai greu de intelesul SELECT titlu FROM carli, domenii WHERE nume domeniu='Poezii' AND domenii.id- domeniu=carti. id- domeniu.
Cum? Trimitiind valoarea lui id- domeniu

<A href~"toate_cartile.php"> Vezi modificarea!</a>

$sql ~ "SELECTid_carte,titlu FROM


carti"; $resursa
~

mysql_query($sql);
tabelul:

II deschidem

print "<table border~'l'>";


II scriem fiecare rezul tat pe un rand:

while ($row~mysql_fetch _array ($resursa) )

Rulati scriptulin browser apoi accesati http://localhost/toate_cartile.php pentru a vedea ca noul titlu a fast introdus in label ~ii-a fast acordat automat ~iun id. Daca folositi Opera sau setarea de refresh din Internet Options din Internet Explorer "Check for newer versions of stored pages - Never", va fi nevoie sa reincarcati pagina (re:tresh). Sa modificam operatii.php pentru a vedea cum folosim instructiunea DELETE, rescriind variabila $sql:

print "<tr>
<td>". $row [ 'id_carte' ] <td>".$row['titlu']

. "</td>

."</td>

</tr>"; } II 8i inchidem tabelul print "</table>";

prill URL, pentru fiecare domeniu in parte. Modificati index.php astfel:


$sq12
'~
~

"SELECT id_domeniu,

7>

nume_domeniu FROM domenii"; $resursa2 while($row


~

mysql_query($sq12);
~

mysql_fetch_array($resursa2) )

Rulati scriptul accesiind adresa http:// localhost/toate - cartile.php ~i apoi creati un nOli fi~ier, operatii.php: operatiLphp
<7
mysql_connect("localhost","root", ""); mysql_select_db("librarie") ;

print '<a href-"domeniu.php? id_domeniu~.$row['id_domeniu'] ."'> '.$row['nume_domeniu'] .'</a><br>';

Acum link-urile catre pagina domenii.php vcr fi de tipul <a href="

$sql

"INSERT INTO carti(titlu)


( 'Dune' ) "; ;

VALUES

domenii.php?id- domeniu=I">Poezii
<fa>. Sa modificam acum ~iinterogarea

mysql_query($sql)

?>

Toate cartile din baza de date. CHIP SPECIAL - SITE DINAMIC

'

D.

;)

))

I'

operatii.php
<? mysql_connect("localhost","root", ""); mysql_select_db("librarie"l ;

$sql

"INSERT INTO carti(titlu)

mysql_select_db("librarie") ;

VALUES ("'.$_POST[ 'titlu'].'"I"; mysql_query($sql) ; ?> <A href~"toate_cartile.php">Vezi modificarea!</a><br> <A href~"adaugare. html">Adauga inca un titlu!</a>

$sql ~ "DELETE FROM carti WHERE


id_carte~". $_POST ['id_carte'J;
mysql_query($sql) ;

$sql ~ "DELETEFROM carti WHERE


titlu~'Dune"'; mysql_query($sql) ; ?> <A href~"toate_cartile.php">Vezi modificarea!</a>

?> <A href~"toate_cartile.php">Vezi modificarea!</a><br> <A href~" stergere .php">Mai sterge una!</a>

IUi

Rulati ~iacest exemplu ~iapoi accesati http://localhost/toate_cartile.php pentru a vedea ca inregistrarea a fast ~tearsa din label.

Accesati http://localhost/adaugare. html ~iputeti adauga oricate titluri doriti! Va puteti verificaoricand, accesandhttp:/
/localhost/toate
-

cartile.php.

PHP, MySQL ~i formularele


A sosit momentul sa punem cap la cap toate lucrurile invatate palla acum. Folosind formularele HTML putem interactiona cu baza de date tara sa trecernprillchinurilescrieriiinterogariiSQL in linia de comanda sau in cadrul unui script PHP ori de cate ori vrem sa adaugam, sa modificam sau sa ~tergem vreo inregistrare. Sa facem un formular care sa ne ajute in adaugarea de titluri noi: adaugare.html
Adauga un titlu in baza de date: <form action~"adaugare.php" method~"POST"> <input type~"text" name~"titlu"> <INPUT type~"submit" value~"Adauga">

Sa scriem acum un script cu care sa ~tergem titluri din baza de date ~i cu aceasta ocazie yom vedea ~icum folosim alte controale de formulare decal <input type="text"> sau <input type="submit">. In exemplul urmator yom vedea cum afi~amtitlurile intr-un dropdown list pentru a putea selecta titlul care urmeaza sa-l ~tergem. Vom folosiun scriptPHPpentru a afi~a utilizatorului0 lista cu titlurile disponibile in baza de date, urmand ca el sa aleaga titlul ce urmeaza a fi ~ters.
stergere.php
Sterge un titlu din baza de date: <form action~"stergere_act.php" method~"POST"> <select name~"id carte"> <? mysql_connect("localhost","root",""); mysql_select_db("librarie") ;

Cat de u~or este sa ~tergem ceva din baza de date ~inu trebuie sa tinem minte nici un id, nici un titlu - amandoua ne sunt servile pe lava de catre script! Pentru a modifica datele din baza de date yom scrie trei scripturi: until care ne afi~eazatitlurile ~ine permite sa selectam titlul pe care dorim sa 11 modificiim, until care sa afi~eze datele intr-un formular unde sa Ie putem modifica ~i inca until care sa trimita datele modificate la baza de date:
lista_carti.php
Alege una din carti si apasa butonul Modifica: <FORM action~"modifica .php" method~"POST"> <? mysql_connect ("localhost", "root",""); mysql_select_db("librarie") ; $sql
~

"SELECT id_carte, titlu,


FROM carti";

descriere

$resursa

mysql_query($sql);
~

while ($row

$sql ~ "SELECTid_carte,titlu FROM


carti ORDER BY titlu ASC"; $resursa
~

mysql_fetch_array($resursa)

II!:
II

</form>

mysql_query($sqll;
~

~iiata ~iscriptul care va prelua valoarea din <input type="text" name="titlu"> transmisa prill metoda POST ~i 0 va adauga in baza de date:
adaugare.php
<?
mysql_connect ("localhost", "root", "") ;

while ($row

mysql_fetch_array($resursa) )

print "<option value~"'.$row['id_carte'J ."'>

". $row ['titlu'] . "</option>";


?> </select> <INPUT type~"submit" value~"Sterge"> </form>
I

Sterge un titlu din baza de date:


Legendele Olimpului

mysql_select_db("librarie") ;

Dune

a I (?t!3Cg!3

Adauga un titluin baza de date:


IPreludiul Fundajiei Formularul in care yom introduce titlul ce urmeaza a fi inclus in baza de date.

In acest formular transmitem variabila cu numele id_carte (definita in <select name="id_carte" a carei valoare este continuta in tagul option option value="'.$row['id- carte']."'. lata ~i scriptulcarepreiaaceastavariabila~i~terge randul corespondent din baza de date: stergere_actphp
<? mysql_connect("localhost","root", "");

Legendele Olimpului Poezii Poezii.volumul 2 Poezii,volumul 3 Romeo si Julieta

Afi~area cat1i1or disponibile intr-o lista dropdown pentru 0 selectie rapida.

CHIP SPECIAL

SITE DINAMIC

'"

EDITORIAL ))

))

.
Modifica aceasta carte:

while ($row print "<input type~'radio' name~'id carte'


value~' " .$row [ 'id - carte' ] . '" >

mysql_fetch_array($resursal )

print '<input type~"text" name="titlu"


value~'"

<b>" .$row['titlu']."</b><br> <i>".$row['descriere'] ."</i> <br><br>";

. $row

['ti tlu' ] .'"><br>

<textarea name~"descriere">' .$row['descriere'].

?> <INPUT type~"submit"


value~"Modificl">

'</textarea><br>' ;

/* ~i folosind un control ascuns trans-

i t J

<I form>

mitemmaidepartecatremodifica - actphp
id-ul caqii deoarece va avea nevoie de el atunci Ganciva opera efectiv modificarea in baza de date */
print '<input type="hidden"

Accesati scriptul in browser pentru a vedea rezultatele. Sa trecem la urmatorul fi~ier:


modifica.php
Modifica aceasta carte: <FORM action~':modifica_act.php" method~"POST"> <?

IHamlet Ceva e put red in ,Danemarcal Alt text


I

Modifica.1
Done

name~"id carte"
value='"

. $_POST

1'['id_carte'] .'">';

?> <INPUT type="submit" value="Modificl"> <Iform>

Formularul cu ajutorul caruia modificam efectivdetaliile ca'1ii.

Luam titlul ~idescrierea din nOlidin baza de date pentru a Ie afi~a in controaIeIe formuiarului deoarece din fi~ierul precedent nu am primit dedit 0 singura variabila, $]OST['id_carte'], din butonul radio input type='radio' name='id _carte' value="'.$row['id _carte' ]."'*/
/* mysql_connect ("localhost", "root", "");

mysql_select_db("librarie") ;

$sql ~ "SELECTtitlu, descriere


FROM carti WHERE
id_carte~". $_POST ['id_carte'] ;

In fine, ultimul script din aceasta serie, modifica_act.php preia variabilele $]OST['titlu'] ~i$]OST['descriere '] din formularul precedent ~iactualizeaza inregistrarea caqii a carui id_carte are valoarea lui $]OST['id_carte']. La star~itul scriptului folosim headerO pentru a redirectiona automat browserul catre lista- cacti.php dura ce modificarea a fast efectuata:

$resursa

mysql_query($sqll;

modifica_actphp <?
mysql_connect("localhost", "root", "");

mysql_select_db("librarie") ;

$sql ~ "UPDATEcarti SET


titlu="'.$_POST['titlu'] ."',
descriere~"'. WHERE
Alege una dill carti si apaso butonul Modilica

$_POST ['descriere' ] .'"

id- carte~". $_POST ['id_carte'];

mysql_query($sql) ; header ("location: lista_cartLphp");

Romeo ,i Juliet"

Ceomarfrumoasa povestede dragoo'e tuturortimpunlor a


~

r. Hmnle'
Ceva e putred in Dan.marca!

r Poem
Carte de peen!

r Poem. vobunul 2 Carte de poezii r Poem. vobunnl 3 Carte depeen! r Legelldel. Olimpului Fara desenae

I ModijiciiI
Formularul cu ajutorul caruia putem alege cartea ale carei date dorim sa Ie modificam.

Accesati acum adresahttp://localhost/ lista- carti.php ~i modificati dura plac orice titlu sau descriere a unei caqi! Deacum puteti spline Adio! Iucruluicu baza de date din Iinia de comanda. In acest capitol am vazut cum putem face pagini dinamice ~iinteractive ~icat de u~or este sa creezi ~i sa tii "Ia zi" un site cu un numar uria~de pagini folosind claar cateva scripturi. Caincepatoriinprogramarev.:atiputea simti ITustrati e complexitateaghilimeled lor, variabilelor sau array-urilor dar nu renuntati, aveti nevoie claar de ceva exercitiu ~iin curand toate vi se vor parea

floare la ureche. Nu uitati: de Gateori lucrurile nu functioneaza a~acum ar trebui, verificati daca ati pus pUllCt~i virgula la sf'ar~itulpropozitiilor, dac'anu ati scris gre~it numele unei variabile sau functii sau daca ati pus toate ghilimelele la locullor. Inainte de a trece la capitolul urmator va recomand sa faceti cateva exercitii. Noi avem cateva caqi in baza de date insa nici una nu are pret sau data (de rapt valorile stint 0 pentru pret I~i0000-00-00 pentru data). Scrieti scripturi pentru a modifica pretul ~i data fiecarei caqi, la fel ca in ultimul exemplu prezentat Nu uitati ca pretul este de tip INT in baza de date ~iva trebui sail scrietica,,98500" nu ,,98,500", ,,98500 lei" sau ,,98,500". La rei, data este in format yyyy-mm-dd (ex: 200302-23). Dupa ce ati scris scripturiIe, rulatile ~i efectuati modificarile pentru fiecare carte care are pret 0 sau data 0000-00-00. Fiti imaginativi ~iscrieti preturi ~idate diferite pentru fiecarecarte. Vom aveanevoie de aceste date in capitolele urmatoare. Inainte de a continua, verificati daca toate caqile din tabelul carti apaqin unui domeniu (id- domeniu nu este 0 ~i se regase~te ~i in tabelul domenii) ~i au
autor (id - autor nu este 0 ~i se regase~te ~i

in tabelul autori). Daca nu, modificati inregistrarile (in linia de comanda sau cu ajutorul unui script PHP) astfel incat toate caqile sa aiM un id- domeniu ~i id- autor valid. Vom avea nevoie de toate aceste date in cele ce urmeaza.

CHIP SPECIAL - SITE DINAMIO

'f:./1;/ '

\.,

'I

:;1:1.
,

" !! ,
",'.

36

EDITORIAL

:1,1

Crearea siteului

Noul site pas cu pas


Puteti sa uitati corvoada modificarilor ~iupload-urilor zilnice: cunoa~teti suficient indit sa puteti crea un site dinamic ~i interactiv!
A. n acest capitol yom face pagina cu pagina sectiunea navigabila a site-ului nostru, folosind tot ce am invatat palla acUill. Vom afla pe parcurs mai multe tips and tricks care sa ne faca munca ~i mai u~oara. Ca ~ipalla acum, sfatul meu este sa scrieti codul prezentat aici ~i sa 11 testati voi in~iva, multe concepte pot parea greu de digerat pe hiirtie ~i foarte u~or de inteles in practica. Vom face intai curatenie in Document root (c:\Program files\Apache Group\ Apache\htodcs). $tergeti sau mutati fi~ierele deja existente acolo pentru a nu va incurca mai departe. Apoi asigurati-va ca serverul MySQL este pornit ~i deschideti editorul PHP preferat.

conectarea la baza de date

partea de sus a paginii Fisierul page - top.php va contine tagurile clasice cu care se incepe un fi~ier HTML, setul de caractere ~i titlul paginii, logo-ul ~i imediat dura, deschide tabelul ce urmeaza sa cuprinda meniul ~i continutul paginii:

11

meum

continutul paginii

partea de jos a paginii Aceasta structura 0 yom folosi pentru toate paginile site-ului ~i in afara de continutul paginii care difera, celelalte raman practic neschimbate. Le yom refolosi, scriind fiecare din ele intr-un fi~ier separat ~iapoi incluzandu-Ie atunci cand avem nevoie de ele. Astfel, orice pagina din site-ul nostru nu va contine decat elementele relevante care se regasesc doar in ea: pe homepage cele mai noi carti, in pagina de domeniu lista cartilor din domeniul respectiv ~iin pagina cu detalii, doar informatia despre cartearespectiva. Toatepaginile voravea aceea~i structura: conectarephp
page_top.php

Prima pagina
0 prima pagina atractiva este vitala pentru succesulunui site. Menirea ei este sa ofere utilizatorului motiveIe pentru a continua sa vada mai mutt ~ieventual sa fie imediat interesat sa cumpere ce avem de oferit. Vitrina librariei noastre virtuale va prezenta utilizatorului atat domeniile de carte disponibile cat ~icele mai noi carti adaugate ~iprecum ~icele mai populare. Vom mai avea ~i0 casuta pentru cautare pentru cei grabiti sau gata hotariiti pentru ca ace~tia sa poata gasi rapid ceea ce ii intereseaza. Prima pagina este de rapt 0 combinatie din mai multe pagini. Unele elemente stint prezente pe toate paginile din acest site, ca de exemplu notita de copyright de la sfiir~it,instructiunile de conectare la baza de date sau prima parte in care specificam titlul, setul de caractere folosit ~i stilul CSS. PHP ne ofera functia include cu care Ie putem include in cadrul scriptului ~isa Ie refolosim in orice alt script in care avem nevoie de ele tara sa trebuiasca sa Ie scriem din nOli. Structura fiecarei pagini din site-ul nostru, indiferentdaca este prima pagina, pagina de domeniu sau pagina cu detalii despre carte, va arata astfel:
CHIP SPECIAL- SITE DINAMIC

III

,I

In page_bottom.php scriem notita de copyright ~iinchidem toate tagurile deschise. meniu.php continutul pagmn

page_bottom.php

Fi~ierul conectare. php va contine cele doua instructiuni, mysql- connect ~i mysql- select_db pe care Ie yom folosi pe fie care pagina a site-ului.

Pagina meniu.php va contine toate domeniile de carte disponibile astfelincat ele sa fie accesibile in orice moment de

S-ar putea să vă placă și