Arhive categorie: PDO

PDO Tutorial – 02: Conectarea la o baza de date folosind PDO

Created at: ianuarie 27, 2013; Last update: noiembrie 1, 2013

Odata ce ai fost de acord cu avantajele folosirii PDO si ai verificat ca poti folosi PDO pe serverul tau, este momentul sa te conectezi la baza de date. Spre binele tau sper ca deja ai realizata o baza de date. Daca nu, ar fi o idee buna sa o faci.

Cum ne conectam la baza de date prin folosirea extensiei PDO

Trebuie sa iti reamintesc faptul ca extensia PDO este orientata pe obiecte, ceea ce face ca pe termen lung totul sa mearga mai usor. Conectarea la baza de date se face destul de simplu:

Conectarea la o baza de date – metoda rapida

Dupa ce ti-ai setat coordonatele bazei de date, poti face schimbari un codul urmator:

Conectarea la o baza de date – metoda corecta

Da, exista si o metoda corecta de conectare la baza de date. Nu stiu daca intr-adevar aceasta este, dar aceasta este metoda pe care eu o folosesc:

Lecturi suplimentare:

HashPHP – http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers

PHP Database Access: Are You Doing It Correctly? – http://net.tutsplus.com/tutorials/php/php-database-access-are-you-doing-it-correctly/

PHP PDO MySQL:Example How to Connect to MySQL Using PDO Class, PDO Error Attributes – http://php.tutorialref.com/pdo-mysql-connect-example.html

PDO Tutorial – 03: Inserarea de date intr-o baza de date cu PDO

Created at: ianuarie 27, 2013; Last update: noiembrie 1, 2013

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

 

PDO Tutorial – 01: Verifica prezenta PDO

Created at: ianuarie 18, 2013; Last update: noiembrie 1, 2013

Prin urmare, dupa ce ai vazut care sunt avantajele, ai luat decizia de a trece la PDO

Care sunt avantajele folosirii extensiei PDO?

PDO este o extensie PHP care ofera un strat de abstractizare pentru accesul la baze de date. Acest strat poate fi folosit cu orice tip de baza de date. Asta inseamna ca poti, in orice moment sa schimbi tipul de baze de date fara sa fie necesara si schimbarea codului de acces.

PDO poate lucra cu urmatoarele baze de date:

MySQL
PostgreSQL
SQLite 2 & 3
Firebird
Informix (IBM Informix Dynamic Server)
ODBC
Oracle
DBLM: FreeTDS / Sybase / MS-SQL
IBM (IBM DB2)

Chiar daca vei lua decizia de a folosi MySQL, PDO ofera multe avantaje; poti folosi aceleasi medode de acces la baza de date indiferent de versiunea MySQL. Prin folosirea PDO, nu mai trebuie sa iti faci griji cu privire la folosirea standard a extensiei MySQL cand e vorba de versiuni mai vechi de MySQL. Un alt avantaj este posibilitatea de a folosi cod orientat pe obiecte indiferent de versiunea de MySQL.

Pentru a functiona, PDO are nevoie de capabilitatile proprii PHP 5, asadar este necesara folosirea PHP 5.0 sau a unei versiuni mai noi. Extensia PDO vine impreuna cu versiunile PHP 5.1 and 5.2, fiind foarte usor de implementat pe majoritatea sistemelor de operare.

De ce sa folosim PDO?

Motivul numarul unu este securitatea. Pentru a folosi functii simple MySQL este necesar ca mai intai sa cureti inputul (ceea ce se introduce prin formulare etc.) sau folosirea mysql_real_escape_string(). Spre deosebire de functiile MySQL, PDO ia totul in grija, nemaifiind nevoie sa fii atent la variabilele folosite in interogarea bazei de date sau, mai bine zis, la SQL injection.

De asemenea, posibilitatea de a migra catre o baza de date diferita este (SQLite, Oracle, MSSQL, ODBC etc.) este una ce nu trebuie uitata.

Dar, inainte de a folosi PDO, trebuie sa…

Verifica daca poti folosi PDO

Poti verifica daca extensia PDO este instalata prin crearea unui fisier .php cu urmatorul cod: