În numerele anterioare am trecut prin câteva elemente de sintaxă şi am încercat să prezint probleme tipice, cu care vă veţi întâlni relativ repede atunci când veţi încerca să folosiţi practic cele învăţate. Voi continua în acceaşi notă şi voi încerca astăzi să vă familiarizez cu bazele de date
Orice site cu pretenţii va dori, din motive explicate pe larg în articole precedente, să aibă un conţinut cât mai variat, uşor accesibil şi uşor de modificat. Există multiple variante pentru a atinge aceste deziderate, însă, dacă se doreşte o soluţie simplă şi uşor de implementat, folosirea bazelor de date se impune de la sine. Rolul principal al acesteia este de a reţine şi organiza informaţia astfel încât accesul la ea să se poată face rapid şi exact. Înainte de a trece la modul de lucru în PHP cu bazele de date, am să încerc să sintetizez câteva lucruri de bază, utile începătorilor.
În primul rând, o bază de date conţine mai multe tabele, tabele ce stochează informaţia. Pentru un site de complexitate medie, o singură bază de date ar trebui să fie suficientă. Numărul de tabele este limitat, însă îndeajuns de mare. Un număr mai mare de tabele va asigura o mai mare rapiditate a accesului la informaţie. Vă recomand de aceea să preferaţi această variantă.
Ca studiu de caz vă propun să analizăm o parte din baza de date folosită de www.electronica-azi.ro. În primul rând, să-i dăm un nume şi să creăm tabelele necesare.
Vom avea, aşadar, baza de date electronica cu tabelele articole şi numere.
Tabela articole arată ca în figura 1, iar tabela numere ca în figura 2. Veţi remarca cum fiecare tabelă are mai multe câmpuri, conţinând date de diverse feluri. Există astfel câmpuri de date precum:
VARCHAR – care ţine minte un şir de caractere;
TEXT – care memorează un text (are o lungime mai mare decât varchar);
INT – care memorează numere întregi (cu variantele sale TINYINT, LONGINT, BIGINT);
DATE – care memorează data într-un format tip (pentru mysql este aaaa-ll-zz).
Acestea sunt cele mai folosite. În funcţie de ceea ce doriţi să memoraţi în acel câmp, alegerea vă aparţine. Pentru câmpul id vă recomand “unsigned BIGINT”, iar pentru cel vizibil, din moment ce poate avea doar două valori, 0 şi 1 tipul “TINYINT” (mysql nu are un tip de date boolean; ca alternativă la TINYINT puteţi folosi ENUM (‘0′,’1’)).
Este de menţionat faptul că bazele de date suportă diferite modificări de la una la alta. Exista, ca şi limbaje de programare, numeroase servere de baze de date, fiecare cu plusurile şi minusurile sale. Vă recomand MySQL ca fiind gratis, simplă şi eficientă. Rulează atât pe Linux cât şi pe Windows. Tipurile de date sunt cele pe care mysql-ul le pune la dispoziţie. Ele se pot regăsi exact aşa sau cu modificări şi la celelalte formate de baze de date.
Tabelele şi câmpurile ajută la organizarea informaţiei. Accesul la ea se face prin interogarea bazei de date. Pentru bazele de date actuale, aceasta se face folosind intrucţiuni sau secvenţe de instrucţiuni SQL (Structured Query Language). Standardul SQL diferă în funcţie de format; în cele ce urmează îl voi folosi tot pe cel al mysql-ului, ANSI SQL.
SQL-ul (a nu se confunda cu Microsft SQL Server care este un server de baze de date) conţine în principal patru instrucţiuni mari:
SELECT – folosit pentru a obţine listarea unor câmpuri anume dintr-o tabelă anume;
INSERT – folosit pentru a însera rânduri noi într-o tabelă;
UPDATE – folosit pentru a modifica anumite rânduri dintr-o tabelă;
DELETE – folosit pentru a şterge anumite rânduri dintr-o tabelă.
Să presupunem că mă interesează să obţin afişarea tuturor articolelor care aparţin numărului 2.
Query-ul arată în modul următor:
SELECT * FROM articole WHERE id_numar = 2;
Veţi remarca cuvintele cheie from şi where al căror rol este lesne de desprins din exemplul de mai sus. Acest query se poate complica dacă vrem să obţinem doar titlul şi descrierea articolelor din numărul 2 care sunt vizibile pe site, în ordinea descrescătoare a id-ului. Query-ul arată în modul următor:
SELECT titlu_articol, descriere_articol FROM articole WHERE id_numar = 2 AND vizibil=1 ORDER BY id DESC;
Veţi mai remarca cum * defineşte generic toate câmpurile dintr-o tabelă şi operatorul AND, cu funcţia de şi logic. Există, firesc, şi OR, sau logic, la fel cum există inversul lui DESC, ASC. ASC este însă opţiunea implicită atunci când folosiţi ORDER BY.
Cel mai important câmp din tabelele de mai sus este însă câmpul id. Fiecare tabelă trebuie să aibă un câmp creat de aşa natură încât să nu existe două valori identice memorate în el. Un astfel de câmp, de obicei un întreg cu valori de la 1 la numărul de înregistrări, se numeşte PRIMARY KEY şi are rolul de a facilita căutarea în tabelă. Vă este deasemenea de folos dumneavoastră, din moment ce, o valoare anume a id-ului, va defini un rând din tabelă şi numai unul.
Închei aici scurta trecere în revistă a bazelor de date, dându-vă însă un exemplu pentru fiecare din cele 3 instrucţiuni rămase nediscutate. Pentru detalii, vă rog să vizitaţi www.mysql.com.
INSERT:
INSERT INTO articole (id_numar, titlu_articol) VALUES (2, “Proiectarea controlerelor 5”); introduce în tabelă articole o înregistrare doar cu numărul din care aparţine şi titlul articolului; id-ul va fi înserat automat.
UPDATE:
UPDATE articole SET vizibil=0 WHERE id_numar = 3 OR id_numar = 4; face invizibile pe site (schimbând valoarea câmpului vizibil în 0) înregistrările din tabelă care aparţin numerelor 3 şi 4
DELETE:
DELETE FROM articole WHERE vizibil = 0; şterge din tabelă înregistrările invizibile pe site.
Presupunându-ne familiari cu sintaxa mysql, să trecem mai departe şi să încercăm să trimitem comenzi SQL către o bază de date şi să afişăm pe ecran rezultatul.
Algoritmul este ceva de genul:
1. conectarea din php la baza de date
2. transmiterea comenzilor către baza de date
3. transferarea rezultatului obţinut în variabile PHP
4. afişarea acestora
1. Conectarea la baza de date mysql se face folosind două funcţii
mysql_connect(‘localhost’,’username’,’password’);
mysql_select_db(‘electronica’);
“localhost” defineşte serverul pe care se află instalat mysql-ul; dacă este acelaşi cu cel al PHP-ului se poate folosi localhost; username şi password sunt numele de utilizator şi parola de acces la serverul mysql.
Pentru a crea un utilizator de mysql se execută următoarea instrucţiune SQL:
GRANT ALL PRIVILEGES ON electronica.* to username@localhost IDENTIFIED BY ‘password’;
funcţia mysql_select_db, primeşte ca argument numele bazei de date cu care se lucrează.
2. Transmiterea comenzilor SQL către baza de date se face folosind funcţia mysql_query();
$sql = “SELECT titlu_articol, descriere_articol FROM articole WHERE id_numar = 2 ORDER BY id DESC”;
$rezultat = mysql_query($sql);
$rezultat va fi false în cazul în care comanda SQL este incorectă.
ATENŢIE – $rezultat va avea o valoare ce nu poate fi folosită ca atare. Reprezintă doar o referinţă către rândurile care au fost obţinute prin executarea comenzii SQL.
3. Obţinerea rezultatelor propriu-zise şi afişarea lor
În acest scop putem folosi o sumă de funcţii de similare. Pentru exemplificare voi alege mysql_fetch_row();
Înainte de a trece la scrierea codului se impun câteva considerente.
Comanda SQL de mai sus va returna din tabelă data ca exemplu 2 înregistrări cu câte 2 câmpuri fiecare. Adică ceva de genul:
+—————————————————+
|Proiectarea controlerelor1 | Text descriptiv1 |
+—————————————————+
|Proiectarea controlerelor2 | Text descriptiv2 |
+—————————————————+
Funcţia mysql_fetch_row primeşte ca argument $rezultat şi va întoarce un rând din tabelă, într-un vector. Pentru a afla ambele înregistrări putem folosi aceeaşi funcţie de două ori:
$line1 = mysql_fetch_row($rezultat);
$line2 = mysql_fetch_row($rezultat);
Acest lucru este posibil datorită faptului că, deşi iniţial $rezultat se referă la primul rând din tabela rezultată, apelarea funcţiei face ca acesta să treacă pe rândul următor;
Putem afişa aşadar:
De cele mai multe ori numărul de rânduri rezultate nu este aşa de uşor de ghicit. Prin urmare, ca şi în exemplul de acum două săptămâni, este recomandată folosirea unui ciclu while.
Pentru a îngloba toţi paşii de la 1 la 4 vă propun următorul cod:
Închei aici, îndemnându-vă, ca de obicei, să exersaţi şi să descoperiţi atât PHP-ul cât şi bazele de date. Prin exerciţiu veţi putea desprinde diverse alte metode, mai bune sau mai rapide de a ajunge la aceleaşi rezultate. Vă recomand să căutaţi în manual la rubrica “mysql functions” şi aştept, deasemenea sugestiile şi întrebările dumneavoastră prin email.
bogdan.nita@ealliance.ro