PHP PDO - Select, fetch

Pentru selectare date dintr-un tabel MySQL se foloseste instructiunea SELECT, iar prin metode fetch specifice PDO datele cu randurile selectate primite de la serverul MySQL pot fi preluate in mai multe moduri, cu metode si constante FETCH.

1. Selectare date din tabel MySQL

Dupa ce tabelul MySQL este creat si are randuri adaugate, se aplica interogarea SELECT pentru a obtine date din randurile tabelului. Se poate folosi metoda query(), aceasta returneaza un set de rezultate cu datele obtinute de la MySQL, sau FALSE in caz de eroare.
In exemplele prezentat aici se foloseste tabelul creat in lectia anterioara, care arata astfel:

| id | | nume                         | | categorie         | | adresa                                          |
------------------------------------------------------------------------------------------------------------
| 1 | | Cursuri - Tutoriale    | | educatie          | | www.marplo.net                      |
| 2 | | Curs PHP-MySQL      | | programare    | | www.marplo.net/php-mysql |
| 3 | | Cursuri Engleza        | | limbi straine    | | www.marplo.net/engleza     |

- In urmatorul exemplu vor fi selectate randurile in care "id" este 1 sau 3.
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';

try {
  // Conectare si creare obiect PDO
  $dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
  $dbh->exec("SET CHARACTER SET utf8");      // Setare encoding caractere UTF-8

  // Selectare date
  $sql = "SELECT * FROM `sites` WHERE `id` IN (1, 3)";
  $datas = $dbh->query($sql);

  // Daca select-ul e facut cu succes ($datas nu e false)
  if($datas !== false) {
    $cols = $datas->columnCount();           // Numar coloane returnate

    echo 'Nr. coloane returnate: '. $cols. '<br />';

    // Se parcurg si afiseaza datele selectate
    foreach($datas as $row) {
      echo $row['id']. ' - '. $row['nume']. ' - '. $row['categorie']. ' - '. $row['adresa']. '<br />';
    }
  }

  $dbh = null;        // Deconectare
}
catch(PDOException $e) {
  echo $e->getMessage();
}
?>
- Metoda "columnCount()" returneaza numarul de coloane din setul de rezultate. Observati ca se aplica la instanta in care s-a executat interogarea (aici variabila $datas).
- Parcurgerea datelor se poate face si cu WHILE, while($row=$datas->fetch()), in acest caz trebuie aplicata si metoda "fetch()" (este prezentata mai jos).
- Scriptul de mai sus va afisa:
Nr. coloane returnate: 4
1 - Cursuri - Tutoriale - educatie - www.marplo.net
3 - Cursuri Engleza - limbi straine - www.marplo.net/engleza

2. Metoda fetch()

fetch() returneaza fiecare rand, unul dupa altul, sau FALSE cand nu mai sunt randuri. Cu aceasta metoda se poate determina modul in care sunt preluate datele.
fetch() poate primi optional un argument prin care se determina modul in care valorile sunt returnate: Array, Obiect, Sir, .... Acest argument este o constanta care se aplica cu sintaxa:
                PDO::FETCH_MOD
In continuare sunt prezentate cateva din aceste moduri, cele mai comune:

FETCH_ASSOC

- Returneaza fiecare rand ca un Array in care cheile sunt numele coloanelor (similar cu mysql_fetch_assoc).
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';

try {
  // Conectare si creare obiect PDO
  $dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
  $dbh->exec("SET CHARACTER SET utf8");      // Setare encoding caractere UTF-8

  // Selectare date din MySQL
  $sql = "SELECT * FROM `sites`";
  $datas = $dbh->query($sql);

  // Se parcurg datele si le afiseaza
  while($row = $datas->fetch(PDO::FETCH_ASSOC)) {
      echo $row['id']. ' - '. $row['nume']. ' - '. $row['categorie']. ' - '. $row['adresa']. '<br />';
  }

  $dbh = null;        // Deconectare
}
catch(PDOException $e) {
  echo $e->getMessage();
}
?>
- In browser apare:
1 - Cursuri - Tutoriale - educatie - www.marplo.net
2 - Curs PHP-MySQL - programare - www.marplo.net/php-mysql
3 - Cursuri Engleza - limbi straine - www.marplo.net/engleza

FETCH_NUM

- Returneaza fiecare rand ca un Array in care cheile sunt numere consecutive (incepand de la 0), reprezentand ordinea coloanelor din setul de rezultate (similar cu mysql_fetch_row).
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';

try {
  // Conectare si creare obiect PDO
  $dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
  $dbh->exec("SET CHARACTER SET utf8");      // Setare encoding caractere UTF-8

  // Selectare date din MySQL
  $sql = "SELECT * FROM `sites`";
  $datas = $dbh->query($sql);

  // Se parcurg datele
  while($row = $datas->fetch(PDO::FETCH_NUM)) {
    echo $row[0]. '-'. $row[1]. '<br />';      // Afiseaza datele din prima si a doua coloana
  }

  $dbh = null;        // Deconectare
}
catch(PDOException $e) {
  echo $e->getMessage();
}
?>
- In browser afiseaza:
1-Cursuri - Tutoriale
2-Curs PHP-MySQL
3-Cursuri Engleza

FETCH_BOTH

- Produce un Array cu ambele tipuri de chei, atat numele coloanelor cat si numere consecutive reprezentand ordinea coloanelor din setul de rezultate.
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';

try {
  // Conectare si creare obiect PDO
  $dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
  $dbh->exec("SET CHARACTER SET utf8");      // Setare encoding caractere UTF-8

  // Selectare date din MySQL, unde "id" are valoarea 2
  $sql = "SELECT `id`, `nume` FROM `sites` WHERE `id`=2";
  $datas = $dbh->query($sql);

  // Se parcurg datele
  while($row = $datas->fetch(PDO::FETCH_BOTH)) {
    echo $row['id']. '-'. $row['nume']. '<br />';      // Afiseaza datele din coloanele 'id' si 'nume'
    echo $row[0]. '-'. $row[1]. '<br />';      // Afiseaza din prima si a doua coloana (aceleasi)
  }

  $dbh = null;        // Deconectare
}
catch(PDOException $e) {
  echo $e->getMessage();
}
?>
- In browser apare:
2-Curs PHP-MySQL
2-Curs PHP-MySQL

FETCH_OBJ

- Returneaza fiecare rand ca un obiect. Valorile coloanelor se acceseaza ca proprietati ale obiectului, prin numele lor.
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';

try {
  // Conectare si creare obiect PDO
  $dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
  $dbh->exec("SET CHARACTER SET utf8");      // Setare encoding caractere UTF-8

  // Selectare date din MySQL, randuri cu "id" mai mic decat 3
  $sql = "SELECT `id`, `nume` FROM `sites` WHERE `id`<3";
  $datas = $dbh->query($sql);

  // Se parcurg datele
  while($row = $datas->fetch(PDO::FETCH_OBJ)) {
    echo $row->id. '-'. $row->nume. '<br />';      // Afiseaza datele din coloanele 'id' si 'nume'
  }

  $dbh = null;        // Deconectare
}
catch(PDOException $e) {
  echo $e->getMessage();
}
?>
- Va afisa:
1-Cursuri - Tutoriale
2-Curs PHP-MySQL

FETCH_CLASS

- Permite ca datele sa fie preluate intr-o clasa, creand o instanta de obiect la acea clasa. Numele campurilor sunt folosite ca proprietati in acea clasa. Se aplica cu metoda fetchALL().
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';

// Definire clasa
class Sites {
  // Definire proprietati
  public $id;
  public $categorie;

  // Metoda a clasei
  function makeString() {
    // Returneaza un sir cu valorile proprietatilor, cu primul caracter din cuvinte majuscula
    return ucwords($this->id. ' - '. $this->categorie). '<br />';
  }
}

try {
  // Conectare si creare obiect PDO
  $dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
  $dbh->exec("SET CHARACTER SET utf8");      // Setare encoding caractere UTF-8

  // Selectare date din MySQL, coloanele "id"  si "categorie"
  $sql = "SELECT `id`, `categorie` FROM `sites`";
  $datas = $dbh->query($sql);
  $obj = $datas->fetchALL(PDO::FETCH_CLASS, 'Sites');      // Aplicare FETCH_CLASS la clasa Sites

  // Parcurge datele din setul de rezultate, creaza instanta de clasa $insSites
  foreach($obj as $insSites) {
    echo $insSites->makeString();        // Apeleaza metoda makeString() la instanta clasei
  }

  $dbh = null;        // Deconectare
}
catch(PDOException $e) {
  echo $e->getMessage();
}
?>
- Observati cum e aplicat FETCH_CLASS, la metoda "fetchALL()" si cu un argument tip sir ce reprezinta numele clasei (aici "Sites").
- Acesta metoda e utila in cazul unor proiecte mai mari, definind intr-o clasa instructiunile ce trebuie aplicate datelor primite de la baza de date se poate reduce cantitatea de cod si se imbunatateste flexibilitatea scriptului.
- Script-ul va afisa:
1 - Educatie
2 - Programare
3 - Limbi Straine

• O alternativa la FETCH_CLASS este metoda fetchObject(). Similar, si cu aceasta datele din coloanele fiecarui rand din cele obtinute la "query()" sunt preluate printr-o clasa care este adaugata ca argument la metoda.
        Exemplu:
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';

// Definire clasa
class Sites {
  // Definire proprietati
  public $id;
  public $categorie;

  // Metoda a clasei
  function makeString() {
    // Returneaza un sir cu valorile proprietatilor, primul caracter al cuvintelor majuscula
    return ucwords($this->id. ' - '. $this->categorie). '<br />';
  }
}

try {
  // Conectare si creare obiect PDO
  $dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
  $dbh->exec("SET CHARACTER SET utf8");      // Setare encoding caractere UTF-8

  // Selectare date din MySQL, coloanele "id"  si "categorie"
  $sql = "SELECT `id`, `categorie` FROM `sites`";
  $datas = $dbh->query($sql);

  // Parcurgere instanta de obiect creata cu fetchObject() la clasa Sites
  while($obj = $datas->fetchObject('Sites')) {
    echo $obj->makeString();        // Afiseaza rezultatul apelarii metodei makeString()
  }

  $dbh = null;        // Deconectare
}
catch(PDOException $e) {
  echo $e->getMessage();
}
?>
- Numele coloanelor din fiecare rand sunt folosite ca proprietati ale clasei apelate (aici Sites)
- In browser apare:
1 - Educatie
2 - Programare
3 - Limbi Straine

FETCH_FUNC

- O alta constanta FETCH_ care se aplica la metoda fetchALL() este FETCH_FUNC. Returneaza un Array cu rezultatul apelarii unei functii, folosind ca argumente coloanele fiecarui rand din setul de rezultate. Cheile din Array sunt numere consecutive (de la 0), iar valoarea lor e rezultatul dat de functie pt. fiecare rand.
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';

// Definire functie
function test($id, $nume) {
  // Returneaza un sir cu datele din parametri, cu majuscule
  return strtoupper($id.'-'.$nume);
}

try {
  // Conectare si creare obiect PDO
  $dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
  $dbh->exec("SET CHARACTER SET utf8");      // Setare encoding caractere UTF-8

  // Selectare date din MySQL
  $sql = "SELECT `id`, `nume` FROM `sites`";
  $datas = $dbh->query($sql);
  $ar_row = $datas->fetchALL(PDO::FETCH_FUNC, 'test');       // Aplicare FETCH_FUNC la functia test()

  var_export($ar_row);        // Afiseaza structura Array-ului

  $dbh = null;        // Deconectare
}
catch(PDOException $e) {
  echo $e->getMessage();
}
?>
- Acest mod este util cand se doreste aplicarea acelorasi instructiuni la mai multe seturi de date obtinute din tabel MySQL, astfel, pot fi toate definite intr-o functie.
- Rezultatul afisat este:
array ( 0 => '1-CURSURI - TUTORIALE', 1 => '2-CURS PHP-MYSQL', 2 => '3-CURSURI ENGLEZA', )

• Metoda query() accepta, dupa interogarea SQL, si un argument optional ce reprezinta modul-fetch.
        Exemplu:
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';

try {
  // Conectare si creare obiect PDO
  $dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
  $dbh->exec("SET CHARACTER SET utf8");      // Setare encoding caractere UTF-8

  // Selectare date din MySQL, unde "id" este 3
  $sql = "SELECT `id`, `adresa` FROM `sites` WHERE `id`=3";
  $datas = $dbh->query($sql, PDO::FETCH_OBJ);        // Aplicare query() cu un mod-fetch

  // Se parcurg datele
  while($row = $datas->fetch()) {
    echo $row->id. '-'. $row->adresa. '<br />';      // Afiseaza datele din coloanele "id" si "adresa"
  }

  $dbh = null;        // Deconectare
}
catch(PDOException $e) {
  echo $e->getMessage();
}
?>
- In browser apare:
3-www.marplo.net/engleza

Daca metoda fetch() este apelata fara argumente si la "query()" nu e specificat vreun tip FETCH_, modul implicit (default) este PDO::FETCH_BOTH.
- O alta metoda prin care se poate seta modul FETCH_ default este setFetchMode().
    Ex.:
            $datas = $dbh->query($sql);
            $datas->setFetchMode (PDO::FETCH_OBJ);
            while($row = $datas->fetch()) { // ... }

- Mai multe detalii la pagina oficiala setFetchMode


In tutorialul urmator este prezentat modul de utilizare al metodelor prepare() si execute().
PHP PDO - exec ... <<-- Anterior --- Urmator -->> PHP PDO - prepare ...

Un Test simplu in fiecare zi

HTML
CSS
JavaScript
PHP-MySQL
Engleza
Spaniola
Ce atribut e folosit in tag-ul <a> pentru adresa link-ului?
src href rel
<a href="http://coursesweb.net/" title="CoursesWeb.net">CoursesWeb.net</a>
Ce proprietate CSS seteaza tipul fontului utilizat?
font-family text-decoration font-size
h2 {
  font-family:"Calibri", sans-serif;
}
Ce instructiune selecteaza toate tag-urile <div> cu class="cls"?
querySelector("div.cls") getElementsByTagName("div") querySelectorAll("div.cls")
var elm_list = document.querySelectorAll("div.cls");
var nr_elms = elm_list.length;       // numar elemente selectate
alert(nr_elms);
Indicati functia care returneaza suma valorilor dintr-un array.
array_sum() array_diff() array_shift()
$arr = array(1, 2, 3, 4);
$arr_sum = array_sum($arr);
echo $arr_sum;       // 10
Indicati forma corecta a verbului "study" (a studia) la Trecutul Simplu in aceasta propozitie: "We (study) English."
studyed studys studied
We studied English.
- Noi am studiat engleza.
Indicati forma corecta a verbului "decir" (a spune) la Prezent in aceasta propozitie: "Yo (decir) siempre la verdad."
digas digo decir
Yo digo siempre la verdad.
- Eu spun mereu adevarul.
PHP PDO - Select, fetch - Tutorial PHP