PDO este o extensie pentru php care vine o data cu vesriunea 5.1 a acestuia si marele avantaj este ca foloseste functii similare pentru interogarea bazelor de date. , cu alte cuvinte daca aveti un proiect cu usurita puteti sa ii schimbati baza de date + ca pdo va scapa de grija pentru vulnerabilitatile sql injection.
Daca va amintiti am mai creat un tutorial despre conexiunea la baza de date insa dupa cum am scris mai sus pdo prezinta avantaje multiple + securitate asa ca ar fi ok sa invatati sa lucrati si cu pdo. In prima faza dupa instalarea php PDO nu este activat asa ca testati prin:
<?php echo 'pdo exista'; else echo 'pdo trebuie instalat'; ?>
Daca o sa primiti mesaj ca nu este instalat , in fisierul php.ini decomentati liniile
extension=pdo.so extension=pdo_sqlite.so extension=sqlite.so extension=pdo_mysql.so
apoi restart la apache :
service apache2 restart
In caz ca nu stiti ce este oop , gasiti tutoriale la categoria incepatorilor , si va recomand sa le cititi. Constructoul clasei PDO initializaeaza o noua conexiune cu baza de date, mai jos o sa prezint un exemplu pentru mysql
<?php $str = 'mysql:dbname=test;host=127.0.0.1'; $user = 'root'; $pass = 'xxxxxxxx'; try { $con = new PDO($str, $user, $pass); } catch (PDOException $e) { } ?>
Daca ati trecut de acest pas fara eroare atunci inseamna ca vati conectat cu success la baza de date, in continuare voi prezenta metoda query din PDO , iar pentru asta avem nevoie de un tabel in baza de date, eu am creat unul numit users:
CREATE TABLE IF NOT EXISTS `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nume` varchar(100) NOT NULL, `prenume` varchar(100) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Am adaugat si doua inregistrari :
INSERT INTO `users` (`id`, `nume`, `prenume`) VALUES (1, 'Micul', 'Programator'),(2, 'Andrei', 'Marian');
Metoda este asemnatoare cu functia mysql_query prezetata in tutorialele incepatorilor
Un exemplu simplu pentru query este acesta
<?php $str = 'mysql:dbname=test;host=127.0.0.1'; $user = 'root'; $pass = 'dbconnect'; try { $con = new PDO($str, $user, $pass); } catch (PDOException $e) { } $query = " SELECT nume,prenume FROM users"; foreach ($con->query($query) as $row) { print $row['nume'].' '.$row['prenume'].'<br />'; } ?>
Iar rezultatul este :
Micul Programator Andrei Marian
Miam dat sema ca un tutorial prea stufos ar putea sa provoace plictiseala asa ca in acest tutorial o sa ne limitam la select insa o sa vin cu o propunere sa fac o clasa in care sa adaug tot ce o sa prezint in tutorialele despre pdo, ba mai mult sa vin cu cateva metode care sa va ajute in lucrul cu baza de date.
class DataBase extends PDO { //definim constructorul nostru public function __construct($string,$user,$pass,$driver = null){ //apelam constructorul PDO return parent::__construct($string,$user,$pass, $driver); } /* Vom face metoda privata sa obligam utilizatorul sa foloseasca o alta metoda , in care vom apela aceasta metoda * @param string $query -> query-ul care va fi rulat * */ private function myquery($query) { try{ $date = parent::query($query); } catch (PDOException $e) { } return $date; } /** * Metoda va face un select atutomat pentru un anumit tabel specificat * @param str $type -> tipul de interogare (all,fields) * @param array $info -> table : numele tabelului din care se face interogarea * */ switch ($type){ // select de tipul * case 'all': try { throw new Exception ('$info["table"] Nu poate fi null'); } else { $date = $this->myquery("SELECT * FROM ".$info["table"]); if(!$date){ //generam exceptie pentru numele tabelului gresit throw new Exception ($this->errorInfo()[2]); } else { return $date; } } } catch (Exception $ex) { print '<b>Eroare:</b> '.$ex->getMessage(); return false; } break; //select de tipul nume,prenume,varsta case 'fields': try { throw new Exception ('$info["table"] Nu poate fi null'); throw new Exception ('$info["fields"] trebuie sa contina campurile selectului'); } else { $date = $this->myquery("SELECT ".$fileds." FROM ".$info["table"]); if(!$date){ //generam exceptie pentru numele tabelului gresit throw new Exception ($this->errorInfo()[2]); } else { return $date; } } } catch (Exception $ex) { print '<b>Eroare:</b> '.$ex->getMessage(); return false; } break; } } }
Acum sa testam ce am facut :
<?php $str = 'mysql:dbname=test;host=127.0.0.1'; $user = 'root'; $pass = 'dbconnect'; try { $con = new DataBase($str, $user, $pass); } catch (PDOException $e) { } print $row['nume'].' '.$row['prenume'].'<br />'; } ?>
iar rezultatul este identic cu cel dat de pdo. dar functia noastra mai are un tip numit fields daca am face un astfel de apel
print $row['nume'].' '.$row['prenume'].'<br />'; }
o sa vedeti ca returneaza doar numele adica "Programator" si "Marian"
Probabil va intrebati dar daca exista where sau join sau sql injection ce o sa fac, dar o sa vedeti totul in tutorialele urmatoare si o sa intlege-ti facilitatile PDO
Descarca fisierul cu clasa de aici