Dupa ce ai reusit conectarea la o baza de date, iar instantierea obiectului PDO a fost facuta, acesta poate fi folosit pentru interogari SQL.
Sunt doua metode prin care poti face interogari ale bazei de date cu PDO:
– direct, prin folosirea metodelor “exec()” si “query()“;
– sau prin actiuni de tip “prepare()” … “execute()“.
Exec() si query()
Interogarile care modifica datele dintr-un tabel, fara returnarea unui set de rezultate cu randuri si coloane (INSERT, UPDATE si DELETE) sunt realizate prin metoda exec(). Aceasta metoda returneaza numarul de randuri care au fost afectate de interogare, sau FALSE in caz de eroare.
Interogarile care selecteaza randuri de date (SELECT) si returneaza un set de rezultate cu randuri si coloane sunt realizate prin metoda query(). In caz de eroare este returnata valoarea FALSE.
Cum fac INSERT intr-o baza de date cu PDO
In cea mai simpla forma a sa, metoda de introducere a datelor intr-o baza de date este urmatoarea:
Dar puteai face asta la fel de bine si fara PDO, prin folosirea extensiei standard MySQL.
Dupa cum am mentionat si in prima lectie, cel mai bun lucru legat de PDO este faptul ca nu mai trebuie sa te ocupi de curatarea datelor inainte de introducerea sau selectarea acestora din baza de date.
Asadar, daca vrei sa te bucuri de principalul avantaj al extensiei PDO, securitatea, ar trebui ca de fiecare data cand ai interogari SQL sa folosesti declaratii pregatite (prepared statements), pentru ca valorile pe care le introduci vor fi mereu curatate. Dar acesta nu este singurul avantaj. Celalalt avantaj este viteza (despre care voi vorbi in urmatorul capitol “Executarea declaratiilor pregatite intr-o bucla”).
Acum sa ne intoarcem la declaratiile pregatite. Cum arata ele?
Dupa cum poti vedea din cod, inainte de a face interogarea propriu zisa, am pregatit declaratia. Cu alte cuvinte, am spus bazei de date ca voi dori sa insereze in anumite coloane ale unei tabele un rand de inregistrari. Astfel, baza de date a compilat interogarea, tot ce ii mai trebuie fiind valorile pentru ca interogarea sa aiba loc.
De asemenea, “:field1″,”:field1″,”:field3″, sunt parametri numiti (named placeholders) carora li se vor adauga ulterior valori intr-un vector (array).
Daca ti se pare ca folosirea de parametri numiti este mult prea solicitanta, poti folosi parametrii pozitionali (positional placeholders). Astfel, in loc sa mai dai nume la fiecare parametru pe care il folosesti in interogare, poti folosi semne de intrebare urmand ca apoi sa pui valorile fiind foarte atent la ordinea acestora:
Dupa cum poti vedea, folosim semnele de intrebare pentru a desemna pozitia valorilor din declaratia pregatita. Aceste semne de intrebare sunt numite “parametri pozitionali“. Trebuie sa avem griza ca ordinea elementelor din vector sa fie exact aceeasi atunci cand o transferam metodei PDOStatement::execute().
bindValue() si bindParam()
Un alt mod de a transmite valori la o interogare SQL este utilizarea metodelor bindValue() sau bindParam().
Utilizarea acestor metode in locul unui vector ofera un control mai bun asupra valorilor transmise, putand fi specificate prin atributele lor tipul de date si chiar numarul de caractere ce-l va avea valoarea transmisa.
Si bindParam() si bindValue() au acelasi format: bindParam(paramSQL, $variabila_sau_valoare, tip) unde:
– paramSQL este parametrul din declaratia SQL, specificat cu :nume, intre ghilimele. Daca e folosit semnul-intrebarii ?, la paramSQL se adauga numarul de ordine (incepand cu 1) al acelui parametru.
– $variabila_sau_val e o variabila in care e stocata valoarea. In cazul bindValue, poate fi data direct valoarea;
– tip e optional, la el se precifica o constanta prin care se defineste tipul de date care trebuie transmis: PDO::PARAM_INT pt. numere intregi, PDO::PARAM_STR pentru siruri.
Merita mentionat…
Prin bindParam(), poti doar sa transmiti variabile, nu valori. Cu bindValue(), poti transmite atat valori, bineinteles, cat si variabile. bindParam functioneaza doar cu variabile deoarece permite ca parametrii sa fie oferiti ca input/output, prin “referinta” (iar o valoare nu este o “referinta” valida in PHP): este folositor cand vorbim de drivere care (citand din manual): suporta invocarea de proceduri de stocare care returneaza date ca parametri de output, iar unele sunt chiar folosite in acelasi timp ca parametri de input/output care in acelasi timp trimit date si sunt actualizate pentru a le primi.
Cand vorbim de anumite motoare de baze de date, procedurile de stocare pot avea parametri care poti fi folositi atat ca input (prin oferirea unei valori dinspre PHP catre procedura) cat si ca output (prin returnarea unei valori dintr-o procedura catre PHP); pentru legarea acestor parametri trebuie sa folosesti bindParam si nu bindValue.
(http://stackoverflow.com/questions/1179874/pdo-bindparam-versus-bindvalue)
Executarea de interogari pregatite intr-o bucla
Interogarile pregatite (prepared statements) au un avantaj foarte important, anume acela ca pot fi chemate de mai multe ori, avand atasate valori diferite. Vorbim aici de viteza. Cand folosesti interogari pregatite, extensia PDO intai “pregateste interogarea” (interogarea SQL este compilata), pentru ca apoi aceasta sa fie chemata de mai multe ori la rand avand de fiecare data alte argumente. Asta inseamna o modalitate mai rapida de a executa interogari in PDO, spre deosebire de utilizarea aceleiasi interogari in modul mysql traditional!
In mod normal, interogarea bazei de date se face prin legarea parametrilor prin bindParam. Dupa cum am spus si mai devreme bindParam() se aseamana mult cu bindValue(), exceptia fiind faptul ca in loc de legarea unei valori a unei variabile, bindParam() leaga variabila in sine, astfel ca, daca aceasta se schimba, aceasta va fi citita din nou la momentul executiei.
Cum vezi numarul de randuri returnate
Daca vrei sa vezi cate inregistrari au fost returnate poti folosi metoda rowCount():
Preia ultimul ID inserat
Sunt momente cand ai nevoie sa afli care este ID-ul ultimului rand de inregistrari inserat. Pentru astfel de momente avem nevoie de metoda lastInsertId():
Lecturi suplimentare:
Marplo – Curs PHP-MySQL, Lectia 39
PHP PDO – exec (INSERT, UPDATE, DELETE) MySQL
[…] “exec()” si “query()“; – sau prin actiuni de tip “prepare()” … “execute()“. avenir.ro cateva secunde 0 […]