Introducerea in PHP PDO (PHP Data Objects)

Post Title

      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:  

  1.  
  2. <?php
  3. if(class_exists('PDO'))
  4. echo 'pdo exista';
  5. else
  6. echo 'pdo trebuie instalat';
  7. ?>

Daca o sa primiti mesaj ca nu este instalat , in fisierul php.ini decomentati liniile

  1.  
  2. extension=pdo.so
  3. extension=pdo_sqlite.so
  4. extension=sqlite.so
  5. extension=pdo_mysql.so

apoi restart la apache :

  1.  
  2. 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

  1.  
  2. <?php
  3. $str = 'mysql:dbname=test;host=127.0.0.1';
  4. $user = 'root';
  5. $pass = 'xxxxxxxx';
  6. try {
  7. $con = new PDO($str, $user, $pass);
  8. } catch (PDOException $e) {
  9. die( 'Connection failed: ' . $e->getMessage());
  10. }
  11. ?>
  12.  
  13.  

 

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:

  1.  
  2. CREATE TABLE IF NOT EXISTS `users` (
  3. `id` int(11) NOT NULL AUTO_INCREMENT,
  4. `nume` varchar(100) NOT NULL,
  5. `prenume` varchar(100) NOT NULL,
  6. PRIMARY KEY (`id`)
  7. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

 

Am adaugat si doua inregistrari :

 

  1.  
  2. 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 

 

  1.  
  2. <?php
  3. $str = 'mysql:dbname=test;host=127.0.0.1';
  4. $user = 'root';
  5. $pass = 'dbconnect';
  6. try {
  7. $con = new PDO($str, $user, $pass);
  8. } catch (PDOException $e) {
  9. die( 'Connection failed: ' . $e->getMessage());
  10. }
  11. $query = " SELECT nume,prenume FROM users";
  12. foreach ($con->query($query) as $row) {
  13. print $row['nume'].' '.$row['prenume'].'<br />';
  14. }
  15. ?>
  16.  

Iar rezultatul este :

  1.  
  2. Micul Programator
  3.  
  4. 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.

 

  1.  
  2. class DataBase extends PDO
  3. {
  4. //definim constructorul nostru
  5. public function __construct($string,$user,$pass,$driver = null){
  6. //apelam constructorul PDO
  7. return parent::__construct($string,$user,$pass, $driver);
  8. }
  9. /* Vom face metoda privata sa obligam utilizatorul sa foloseasca o alta metoda , in care vom apela aceasta metoda
  10. * @param string $query -> query-ul care va fi rulat
  11.  * */
  12. private function myquery($query) {
  13. $date = array();
  14. try{
  15. $date = parent::query($query);
  16. } catch (PDOException $e) {
  17. die( '<b>Query error: </b>' . $e->getMessage());
  18. }
  19. return $date;
  20. }
  21. /**
  22.  * Metoda va face un select atutomat pentru un anumit tabel specificat
  23.  * @param str $type -> tipul de interogare (all,fields)
  24.  * @param array $info -> table : numele tabelului din care se face interogarea
  25. * */
  26. public function find ($type = 'all',$info = array('table'=>null,'fields'=>array())) {
  27. switch ($type){
  28. // select de tipul *
  29. case 'all':
  30. try {
  31. if(!strlen($info['table'])) {
  32. throw new Exception ('$info["table"] Nu poate fi null');
  33. } else {
  34. $date = $this->myquery("SELECT * FROM ".$info["table"]);
  35. if(!$date){
  36. //generam exceptie pentru numele tabelului gresit
  37. throw new Exception ($this->errorInfo()[2]);
  38. } else {
  39. return $date;
  40. }
  41. }
  42. } catch (Exception $ex) {
  43. print '<b>Eroare:</b> '.$ex->getMessage();
  44. return false;
  45. }
  46. break;
  47. //select de tipul nume,prenume,varsta
  48. case 'fields':
  49. try {
  50. if (!strlen($info['table'])) {
  51. throw new Exception ('$info["table"] Nu poate fi null');
  52. } else if (!count($info['fields'])) {
  53. throw new Exception ('$info["fields"] trebuie sa contina campurile selectului');
  54. } else {
  55. $fileds = implode(',',$info['fields']);
  56. $date = $this->myquery("SELECT ".$fileds." FROM ".$info["table"]);
  57. if(!$date){
  58. //generam exceptie pentru numele tabelului gresit
  59. throw new Exception ($this->errorInfo()[2]);
  60. } else {
  61. return $date;
  62. }
  63. }
  64. } catch (Exception $ex) {
  65. print '<b>Eroare:</b> '.$ex->getMessage();
  66. return false;
  67. }
  68. break;
  69. }
  70. }
  71. }

 

Acum sa testam ce am facut :

 

  1.  
  2. <?php
  3. $str = 'mysql:dbname=test;host=127.0.0.1';
  4. $user = 'root';
  5. $pass = 'dbconnect';
  6. try {
  7. $con = new DataBase($str, $user, $pass);
  8. } catch (PDOException $e) {
  9. die( 'Connection failed: ' . $e->getMessage());
  10. }
  11. foreach ($con->find('fields',array('table' => 'users','fields'=>array('id','nume'))) as $row) {
  12. print $row['nume'].' '.$row['prenume'].'<br />';
  13. }
  14. ?>

 

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

 

  1.  
  2. foreach ($con->find('fields',array('table' => 'users','fields'=>array('prenume'))) as $row) {
  3. print $row['nume'].' '.$row['prenume'].'<br />';
  4. }

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

Autor articol
Y!M : mic_programator

Ştiinţa fără religie este şchioapă, religia fără ştiinţă este oarbă (Albert Einstein)

Acest articol nu este comentat, fii primul care o face

Trebuie sa fii logat sa poti lasa un comentariu Autentificare Inregistrare
top