Documente Academic
Documente Profesional
Documente Cultură
&n acest exemplu, serverul MySQL ruleaza pe $local+ost$ ca si modulul P,P, utilizatorul este $root$ iar parola $-./0$. 1upa executia acestui script, daca nu se reuseste conectarea la MySQL, va aparea mesa2ul $#nable to connect to MySQL$, in caz de reusita, apare mesa2ul $3onnected to MySQL$ 4n mod prestabilit, functia mysql_connect ! se conecteaza la serviciul MySQL prin intermediul portului //56, portul MySQL standard. 1aca doriti sa obtineti accesul la un server MySQL care ruleaza pe un port non7standard, puteti atasa un caracter doua puncte si numarul portului dorit la ar%umentul care contine numele %azdei* de exemplu, $local+ost"//58$.
Baze de date & PHP Aceasta functie inc+ide conexiunea curenta. 'unctia returneaza 9:#( )n caz de reusita* )n caz contrar, returneaza 'ALS(. 4n %eneral, nu este necesara invocarea functiei mysql_close !, deoarece P,P )nc+ide automat conexiunile desc+ise cu bazele de date atunci c;nd un script )si )nc+eie executia. &ata un exemplu de conectare la serverul MySQL si inc+idere a conexiunii folosind functia mysql_close !"
<?php $conn = mysql_connect( "localhost", "root", "1234") or die("Una le to connect to !y"#$")% '' )ici ada*+ati datele necesare l*cr*l*i c* ser,er*l !y"#$ mysql_close()% ?(
1aca se reuseste conexiunea la serverul MySQL si baza de date cu numele $test$ este inexistenta, rezultatul afisat de exemplul de mai sus va fi urmatorul" 3onnected to MySQL -50> " #n?no@n database AtestA
Baze de date & PHP =umeroase functii P,P pot produce erori sau mesa2e de avertizare care )i pot deruta pe utilizatorii siturilor Beb sau le pot cauza neplaceri. P,P furnizeaza functia error_reportin% !, care va permite sa eliminari mesa2ele nedorite. 'unctia are urmatoarea forma" error_re"ort!ng(mas-# unde $mas?$ specifica tipul mesa2elor care vor fi raportate. 1aca specificati zero ca valoare a atributului $mas?$ error_reportin% 5!!, nu va fi raportat nici un mesa2. 1aca specificati $(_ALL$ in loc de $mas?$ error_reportin% (_ALL!!, vor fi raportate toate mesa2ele. Sau, o alta metoda pentru oprirea mesa2elor de eroare, explicata in lectiile anterioare, este adau%and C inaintea functiei.
Baze de date & PHP 7 1upa executarea acestui script, daca totul este corect, va fi creata baza de date $test$ si va fi afisat mesa2ul $<aza de date 9(S9 a fost creata$. 1upa ce pro%ramul a obtinut o conexiune cu serverul MySQL, inainte de a lucra cu tabelele dintr7o baza de date MySQL, pro%ramul trebuie sa selecteze baza de date respectiva. Pentru aceasta, folositi functia mysql_select_db !, care are urmatoarea forma" mysql_select_d/(/aza_de_date# #nde $baza_de_date$ este numele bazei de date la care urmeaza a se obtine acces. 'unctia returneaza 9:#( daca poate obtine accesul la baza de date, respectiv 'ALS( )n caz contrar. (xemplu de selectare a bazei de date $test$"
<?php $conn = mysql_connect( "localhost", "root", "1234") or die("Una le to connect to !y"#$")% $selectd = mysql_select_d (8test8)% i- ($selectd ) echo "6a7a de date test a -ost selectata < r '("% else echo "< r '("/ mysql_errno()/ " 0 "/ mysql_error()% mysql_close()% ?(
1. Crearea ta/elelor
1upa conectare si selectarea bazei de date putem crea tabele in cadrul bazei de date selectate. Pentru aceasta folosim limba2ul SQL 3:(A9( 9A<L( nume9abel coloana-, coloana., ...!* impreuna cu functia mysql_query !. &n exemplul urmator cream tabelul cu numele $carti$ care contine urmatoarele campuri" 2ume cam" id nume autor %en data_intrare pret 3!" &dentificator unic, =ot =ull, c+eie primara 3+ar /5! 3+ar .E! 3+ar -5! 1ate 1ecimal -.,.!
&n stan%a, la $=ume 3amp$, sunt trecute coloanele tabelului, iar in dreapta tipul acestora, coloana cu nume $id$ fiind c+eia primara.
Baze de date & PHP 1e asemenea, folosim indicatorul $A#9D_&=3:(M(=9$ pentru a preciza faptul ca MySQL va repartiza o valoare secventiala unica )n coloana care serveste drept c+eie primara a tabelului. Scriptul P,P pentru crearea tabelului este"
<?php $conn = mysql_connect( "localhost", "root", "1234") or die("Una le to connect to !y"#$")% $selectd = mysql_select_d (8test8)% i- (9$selectd ) echo "6a7a de date test n* a p*t*t -i selectata deoarece 0 "/ mysql_errno()/ " 0 "/ mysql_error()% $sql = "&23)43 4)6$3 :carti: (id ;<4 U<";=<35 )U4>_;<&23!3<4 ?2;!)2@ A3@, n*me ,archar(3B) <>4 <U$$, a*tor ,archar(2C) , +en ,archar(1B) <>4 <U$$, data_intrare date, pret decimal(12,2))"% i- (mysql_q*ery($sql, $conn)) echo "4a el*l carti a -ost creat < r '("% else echo "4a el*l carti n* a p*t*t -i creat deoarece 0 "/ mysql_errno()/ " 0 "/ mysql_error()% mysql_close()% ?(
&n exemplul de mai sus, variabila $Fsql$ contine comanda SQL pentru crearea acestui tabel. &nstructiunea mysql_query Fsql, Fconn!, executa aceasta comanda si in cazul in care rezultatul este 9:#( se trimite la iesire sirul" $9abelul carti a fost creat$. &n cazul in care instructiunea SQL nu a putut fi executata, functia mysql_query Fsql! intoarce valoarea 'ALS(, afisand eroarea din cauza careia tabelul nu a putut fi creat.
7 &n acest exemplu, datele $AHlossaA, AMi+ai (minescuA, ApoezieA, A->75E7.55>A, A8A$ vor fi adau%ate in coloanele $nume, autor, %en, data_intrare, pret$ in aceeasi ordine in care sunt scrise si datele si coloanele. 7 1aca au fost adau%ate cu succes, apare mesa2ul $1atele au fost adau%ate$, in caz contrar apare mesa2ul de eroare. 1aca doriti sa adau%ati mai multe linii in tabel, printr7o sin%ura intero%are, puteti folosi urmatorul model"
<?php '' )ici ada*+ati comen7ile pt/ conectare si selectarea a7ei de date $sql = ";<"324 ;<4> :n*me_ta el: (coloana1, coloana2, coloana3) D)$U3" (8date18, 8date28, 8date38), (8,aloare18, 8,aloare28, 8,aloare38), (8teHt18, 8teHt28, 8teHt38)"% i- (mysql_q*ery($sql)) echo 85atele a* -ost ada*+ate8% else echo "5atele n* a* -ost ada*+ate deoarece 0 "/ mysql_errno()/ " 0 "/ mysql_error()% mysql_close()% ?(
Baze de date & PHP 1upa ce au fost adau%ate mai multe date randuri! intr7un tabel MySQL, se poate selecta anumite randuri si coloane cautand dupa un anumit termen sau cuvant. Pentru aceasta se foloseste comanda =H+6+.
7 $col-$ si $col.$ sunt coloanele din $tabel$ care vrem sa fie selectate. Puteti adau%a mai multe nume separate prin vir%ula!, sau pentru a selecta toate coloanele, se foloseste caracterul J Pe lan%a formula $B(:($ pot fi folosite si comenzile 52* si! sau 76 sau!, pentru a efectua selecturi mai complexe, sau mai precise, cautand randurile in functie de valorile mai multor coloane. 7 1e exemplu, daca se doreste selectarea doar a randurilor in care avem $col-$ cu valoarea $val-$ si $col.$ cu valoarea $val.$* randul selectat sa indeplineasca ambele conditii, se foloseste comanda SQL cu A=1 astfel"
7 1aca se doreste selectarea randurilor in care avem $col-$ cu valoarea $val-$ sau $col.$ cu valoarea $val.$* randul selectat sa indeplineasca una oricare! din aceste conditii, se foloseste comanda SQL cu D: astfel"
$sql = ""3$3&4 :col1:, :col2: I2>! :ta el: JK323 :col1:=8$,al18 >2 :col2:=8$,al28"%
$sql = ""3$3&4 :col1:, :col2: I2>! :ta el: JK323 :col1: $;A3 8$term8"%
7 Laloarea lui AFtermA poate fi un cuvant sau fraza exacta, ori o parte dintr7un cuvant, in acest caz se foloseste si caracterul $M$, astfel, pot fi obtinute urmatoarele 0 cazuri" ;term; 7 va returna randurile in care valoarea coloanei este exact cuvantul $term$, fara altceva. ;term?; 7 va %asi randurile in care valoarea coloanei incepe cu $term$, cum ar fi" $term ceva$, $termenii$, etc. ;?term; 7 va %asi randurile in care valoarea coloanei se termina cu $term$, cum ar fi" $-.term$ $ceva term$, etc. ;?term?; 7 va returna randurile in care coloana are in valoarea ei oriunde, si in interiorul continutului! termenul $term$, cum ar fi" $term ceva$ $ceva -.termeni$, $ceva ex7terma altceva$, etc. 1e obicei, termenul cautat este preluat dintr7un formular. 9rebuie sa tineti cont de modul in care au fost adau%ate datele in tabelul MySQL, daca au fost filtrate cu o functie, precum $mysql_real_esca"e_str!ng(#0 cand se face selectul pentru cautare trebuie aplicata aceeasi functie termenului cautat. 7 Mai 2os puteti studia si folosi codul unui model de script, cu formular, pentru selectarea dintr7un tabel MySQL a randurilor in care se %aseste termenul transmis prin formular. (xplicatiile detaliate sunt in codul scriptului.
<'head( < ody( <-orm action="" method="post"(
1upa ce s7a facut conectarea la serverul MySQL si s7a reusit selectarea bazei de date, variabila $Fsql$ contine comanda SQL pentru introducerea unui nou rand in tabelul $carti$, prin intermediul functiei mysql_query Fsql! se introduce datele in baza de date, variabila $Fnranduri$ preia de la functia mysql_affected_ro@s ! numarul de randuri afectate aici introduse! iar variabila $Fid$ va avea prin $mysql_insert_id !$! valoarea c+eii primare atribuite de MySQL. 1aca nu apare nici o eroare, rezultatul afisat de acest script este urmatorul" 1atele au fost adau%ate in tabelul carti Au fost adau%ate - randuri, c+eia primara I . 'unctia mysql_!nsert_!d(# poate returna un rezultat incorect pentru coloanele MySQL de tipul <&H&=9 N<&H&=9 este un tip de valoare care suporta numere cu .5 de cifre, folosit pentru campurile inte%er spre deosebire de M(1&#M&=9 care suporta numere de la 5 la -6.OOO..-E / bytes! sau &=9 care suporta numerele de la 5 la 0..>0.>6O..>E 0 bytes!P. 1upa efectuarea unei intero%ari &=S(:9, &n locul functiei mysql_insert_id ! se poate folosi functia L5S3_&2S+63_&*(# aceasta returneaza valoarea atribuita de MySQL unei coloane A#9D_&=3:(M(=9, indiferent de tipul coloanei. Mai mult, apelurile ulterioare in script la functii MySQL nu afecteaza rezultatul returnat de L5S3_&2S+63_&*(# care este afectat numai de operatiile &=S(:9 )n care sunt implicate coloane A#9D_&=3:(M(=9. 9otusi, spre deosebire de $mysql_insert_id !$, LAS9_&=S(:9_&1 ! necesita o intero%are suplimentara la MySQL. &ata un exemplu care prezinta modul de obtinere a valorii LAS9 &=S(:9 &1 !"
<?php $sql = ";<"324 ;<4> :carti: (n*me, a*tor, +en, data_intrare, pret) D)$U3 (8&arte38, 8)*tor38, 8=en38, 82BBGFEF1S8, G/3B)"% $insert = mysql_q*ery($sql)% i- (9$insert) . echo "< r '( &manda ;<"324 a es*at0 "/ mysql_errno()/ " 0 "/ mysql_error()/ "< r '("% 1 $intero+are = ""3$3&4 $)"4_;<"324_;5() I2>! :carti:"% $re7*ltat = mysql_q*ery($intero+are)% i- (mysql_errno()) . echo "< r '("/ mysql_errno()/ " 0 "/ mysql_error()/ "< r '("% 1 $rand = mysql_-etch_roL($re7*ltat)% echo "< r '( Ultim*l ;5 reparti7at0 $randMBN"% mysql_close()% ?(
Baze de date & PHP 1upa executarea acestui script, daca nu apare vreo eroare, rezultatul afisat va fi de %enul" #ltimul &1 repartizat" / 'unctia last_!nsert_!d(# returneaza rezultatul corect numai dupa ce a fost efectuata o comanda &=S(:9. 'unctia mysql_a@@ected_roBs(# numara numai r;ndurile efectiv modificate de catre o intero%are #P1A9(. :;ndurile )n cazul carora vec+ea si noua valoare din coloana sunt identice nu se numara printre r;ndurile afectate. 1e asemenea, o intero%are 1(L(9( care nu contine o clauza B,(:( va determina functia mysql_a@@ected_roBs(# sa returneze valoarea zero, indiferent de numarul r;ndurilor sterse din tabel. D modalitate simpla de a determina daca ster%erea tuturor r;ndurilor unui tabel a reusit consta )n a emite o intero%are care returneaza numarul r;ndurilor existente )n tabel. 1e exemplu"
<?php $sql = ""3$3&4 &>U<4(Q) I2>! :carti:"% $res*lt = mysql_q*ery($sql)% $nr = mysql_-etch_roL($res*lt)% echo $nrMBN% ?(
1aca intero%area returneaza valoarea zero, demonstreaza ster%erea tuturor r;ndurilor din tabel.
mysql_@etc$_assoc(# sau mysql_@etc$_array(# cu parametru $MQSQL_ASSD3$!. 7 sunt similare, adau%a datele intr7o matrice asociativa unde pentru
Baze de date & PHP fiecare element avem c+ei cu numele coloanelor iar valoarile lor sunt datele din randul respectiv. o mysql_@etc$_roB(#. 7 adau%a datele intr7o matrice asociativa unde pentru fiecare element avem c+ei cu numere consecutive incepand de la 5! care reprezinta ordinea coloanelor iar valoarile lor sunt datele din randul respectiv o mysql_@etc$_o/,ect(#. 7 aduce rezultatele randului sub forma de obiect cu perec+ile CrandD Ecoloana 0. Pentru a prelucra coloanele stocate )n matrice, depinde de functia folosita. 7 pentru mysql_@etc$_assoc(# sau mysql_@etc$_array(#! puteti folosi o sintaxa de %enul CrandF;coloana;G 7 pentru mysql_@etc$_roB(# puteti folosi o instructiune $foreac+$, prin care parcur%eti datele din fiecare element a matricei 7 pentru mysql_@etc$_o/,ect(# puteti folosi o sintaxa de %enul CrandDE;coloana; 7 Aceste functii returneaza 'ALS( daca nu mai exista r;nduri )n setul de rezultate 1e exemplu, daca doriti sa aflati toate datele din anumite coloane puteti folosi functia mysql_fetc+_assoc ! astfel"
<?php $intero+are = ""3$3&4 :n*me:, :a*tor: I2>! :carti:"% $re7*ltat = mysql_q*ery($intero+are)% i- (mysql_errno()) . echo "< r '("/ mysql_errno()/ " 0 "/ mysql_error()/ "< r '("% 1 i- (mysql_n*m_roLs($re7*ltat) == B) . echo 8B re7*ltate8% 1 else . Lhile ($rand = mysql_-etch_assoc($re7*ltat)) . echo 8< r '(8/ $randM8n*me8N/ 8 F 8/ $randM8a*tor8N% 1 1 ?(
7 Lariabila $Frand$ devine o matrice ale carei c+ei sunt numele coloanelor iar valorile lor sunt datele coloanelor respective din randul curent* instructiunea B,&L( parcur%e fiecare rand. &ata acest exemplu, dar cu functia mysql_fetc+_array !. &n plus, in intero%are SQL voi adau%a numele coloanelor prin variabile, ca sa vedeti cum se lucreaza si cu variabile.
<?php '' Daria ilele c* n*mele coloanelor $col1 = 8n*me8% $col2 = 8a*tor8%
3el de7al doilea ar%ument al functiei mysql_fetc+_array ! este optional. 9otusi, daca nu specificati MQSQL_ASSD3 ca valoare a ar%umentului, P,P returneaza un tablou in care valoarea c+eilor vor fi numerele si numele coloanelor. 7 3onform datelor adau%ate in tabelul $carti$, aceste doua exemple vor afisa urmatorul rezultat" Hlossa 7 Mi+ai (minescu 3arte. 7 Autor. 3arte/ 7 Autor/ 1aca doriti sa afisati toate datele din fiecare coloana de pe fiecare rand al tabelului, puteti folosi functia mysql_fetc+_ro@ ! astfel"
<?php $intero+are = ""3$3&4 Q I2>! :carti:"% $re7*ltat = mysql_q*ery($intero+are)% i- (mysql_errno()) . echo "< r '("/ mysql_errno()/ " 0 "/ mysql_error()/ "< r '("% 1 i- (mysql_n*m_roLs($re7*ltat) == B) . echo 8B re7*ltate8% 1 else . Lhile ($rand = mysql_-etch_roL($re7*ltat)) . -oreach ($rand as $coloana) . echo "T $coloana T"% 1 echo "< r '("% 1 1 ?(
(xemplul de mai sus va afisa urmatorul rezultat, in functie de datele din tabel"
Baze de date & PHP T 1 TT =lossa TT !ihai 3minesc* TT poe7ie TT BBBBFBBFBB TT G/BB T T 2 TT &arte2 TT )*tor2 TT 3d*cati, TT 2BBGFBEF1S TT 11/BB T T 3 TT &arte3 TT )*tor3 TT =en3 TT 2BBGFBEF1S TT G/3B T 1aca doriti sa obtineti acces la valoarea unei anumite coloane, puteti face referire la elementul din tablou folosind o c+eie a tabloului. 1e exemplu, daca rezultatul functiei mysql_fetc+_ro@ ! este stocat )n variabila $Frand$, puteti obtine acces la prima coloana folosind sintaxa $FrandN5P$, la a doua coloana folosind sintaxa $FrandN-P$ etc. &ata un exemplu in care este utilizata functia mysql_fetc+_ob2ect !, iar in intero%area SQL este adau%ata si o conditie B,(:( si o variabila $Fnr$.
<?php $nr = 3% $intero+are = ""3$3&4 :n*me:, :a*tor: I2>! :carti: JK323 :id:<8$nr8"% $re7*ltat = mysql_q*ery($intero+are)% i- (mysql_errno()) . echo "< r '("/ mysql_errno()/ " 0 "/ mysql_error()/ "< r '("% 1 i- (mysql_n*m_roLs($re7*ltat) == B) . echo 8B re7*ltate8% 1 else . Lhile ($rand = mysql_-etch_o Uect($re7*ltat)) . echo 8< r '(8/ $randF(n*me/ 8 F 8/ $randF(a*tor% 1 1 ?(
H. +'"lorarea Bazelor de *ate MySQL a. 7/t!nerea numarulu! coloanelor d!ntrDun ta/el MySQL
Pentru a obtine numarul coloanelor dintr7un set de rezultate, utilizati functia" mysql_num_@!elds(# Aceasta foloseste ca ar%ument valoarea returnata de functia mysql_query(#. &ata un exemplu in care functia mysql_num_fields ! determina numarul coloanelor dintr7 o intero%are care selecteaza toate coloanele folosind specificatorul SQL pentru toate c;mpurile $J$, astfel puteti afla numarul de coloane dintr7un tabel"
<?php $sql = ""3$3&4 Q I2>! :n*me_ta el:"% $re7*ltat = mysql_q*ery($sql)% i- (mysql_errno()) . echo "< r '("/ mysql_errno()/ " 0 "/ mysql_error()/ "< r '("% 1 $nr_camp*ri = mysql_n*m_-ields($re7*ltat)% echo "< r '( <*mar camp*ri0 $nr_camp*ri"% mysql_close()% ?(
Baze de date & PHP Aceasta returneaza lun%imea maxima a coloanei din setul de rezultate. 'unctia preia doua ar%umente" valoarea returnata de functia mysql_query ! si indexul coloanei care va fi descrisa. &ndexul asociat cu prima coloana este 5, indexul asociat celei de7a doua coloane este l etc. &ata un exemplu care determina lun%imea maxima a coloanei doi dintr7un tabel MySQL"
<?php $sql = ""3$3&4 Q I2>! :n*me_ta el:"% $re7*ltat = mysql_q*ery($sql)% i- (mysql_errno()) . echo "< r '("/ mysql_errno()/ " 0 "/ mysql_error()/ "< r '("% 1 $l*n+ime = mysql_-ield_len($re7*ltat, 1)% echo "< r '( $*n+ime &oloana 2 F $l*n+ime"% mysql_close()% ?(
Pentru a obtine aceste proprietati pentru toate coloanele din tabel, folositi o instructiune $for$, dupa exemplul de mai 2os, care parcur%e fiecare coloana, folosind ca limita a numarului de coloane valoarea returnata de functia mysql_num_fields !
<?php $sql = ""3$3&4 Q I2>! :n*me_ta el:"% $re7*ltat = mysql_q*ery($sql)% i- (mysql_errno()) . echo "< r '("/ mysql_errno()/ " 0 "/ mysql_error()/ "< r '("% 1 $nr_camp*ri = mysql_n*m_-ields($re7*ltat)% -or ($i=B% $i<$nr_camp*ri% $iWW) . echo "< r '( &oloana $i0 "% $in-o = mysql_-etch_-ield($re7*ltat)% i- ($in-o) . echo "<?23( lo 0 $in-oF( lo maH_len+th0 $in-oF(maH_len+th m*ltiple_Vey0 $in-oF(m*ltiple_Vey name0 $in-oF(name not_n*ll0 $in-oF(not_n*ll n*meric0 $in-oF(n*meric primary_Vey0 $in-oF(primary_Vey ta le0 $in-oF(ta le type0 $in-oF(type *niq*e_Vey0 $in-oF(*niq*e_Vey *nsi+ned0 $in-oF(*nsi+ned 7ero-ill0 $in-oF(7ero-ill <'?23("% 1 else . echo "<ec*nosc*t"% 1 1 mysql_close()% ?(
Baze de date & PHP 'unctiile mysql_@etc$_roB(# si mysql_@etc$_array(# returneaza, )n %eneral, r;ndurile dintr7un set de rezultate )n mod secvential, incepand de la primul rand al tabelului. 9otusi, functia mysql_data_see-(# permite obtinerea accesului la r;ndurile unui set de rezultate )ntr7o maniera non7secventiala, . 'unctia are forma" mysql_data_see-(rezultat numar_rand# #nde $rezultat$ este valoarea returnata de functia mysql_query(), iar $numar_rand$ este indexul r;ndului la care doriti sa obtineti accesul. Primul r;nd al tabelului este numerotat cu 5, al doilea cu - etc. 'unctia returneaza 9:#( daca executia reuseste, respectiv 'ALS( )n caz contrar. Apoi, o invocare ulterioara a functiei mysql_@etc$_roB(# sau a functiei mysql_@etc$_array(# va returna r;ndul din pozitia specificata in functia mysql_data_see-(#. Studiati urmatorul exemplu, care obtine accesul la al treilea r;nd al setului de rezultate returnat de o intero%are anterioara"
<?php $sql = ""3$3&4 Q I2>! :n*me_ta el:"% $re7*ltat = mysql_q*ery($sql)% i- (mysql_errno()) . echo "< r '("/ mysql_errno()/ " 0 "/ mysql_error()/ "< r '("% 1 i- (9mysql_data_seeV($re7*ltat, 2)) . echo "< r '("/ mysql_errno()/ " 0 "/ mysql_error()/ "< r '("% 1 else . $rand = mysql_-etch_array($re7*ltat, !@"#$_)"">&)% -oreach ($rand as $coloana) . echo "T $coloana T"% 1 1 mysql_close()% ?(