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          | | marplo.net                      |
| 2 | | Curs PHP-MySQL      | | programare    | | marplo.net/php-mysql |
| 3 | | Cursuri Engleza        | | limbi straine    | | 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 - marplo.net
3 - Cursuri Engleza - limbi straine - 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 - marplo.net
2 - Curs PHP-MySQL - programare - marplo.net/php-mysql
3 - Cursuri Engleza - limbi straine - 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-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().

Un Test simplu in fiecare zi

HTML
CSS
JavaScript
PHP-MySQL
Engleza
Spaniola
Ce tag HTML5 este indicat sa contina meniul cu link-uri de navigare in site?
<section> <nav> <article>
<nav><ul>
 <li><a href="http://coursesweb.net/css/" title="CSS Course">CSS Course</a></li>
 <li><a href="http://www.marplo.net/jocuri/" title="Flash Games">Flash Games</a></li>
</ul></nav>
Ce proprietate CSS muta elementrul in dreapta sau stanga de la locul unde e?
text-align clear float
.some_class {
  width: 30%;
  float: left;
}
Clic pe metoda obiectului Math care rotunjeste numarul x descrescator la cel mai apropiat intreg.
Math.ceil(x) Math.abs(x) Math.floor(x)
var num = 12.34567;
num = Math.floor(num);
alert(num);       // 12
Indicati functia PHP care returneaza numarul de caractere dintr-un sir.
mb_strlen() count() stristr()
$str = "sir cu caractere utf-8 åèö";
$nrchr = mb_strlen($str);
echo $nrchr;        // 29
Clic pe raspunsul potrivit la intrebarea: "When it happened?".
On the 7th of July 1996 It is a quarter to 5. Nice weather.
When it happened? On the 8th of August 2001.
- Cand s-a intamplat? Pe 8 August 2001.
Indicati raspunsul potrivit la intrebarea: "¿Cuando sucedió?".
Hace buen tiempo. En el 8 de Agosto de 2001 Son las tres menos cuarto.
¿Cuando sucedió? En el 8 de Agosto de 2001.
- Cand s-a intamplat? Pe 8 August 2001.
PHP PDO - Select, fetch

Last accessed pages

  1. Zoo Amigos (943)
  2. Butterfly Kyodai (5680)
  3. Bubbles3 (8791)
  4. The Rise Of Atlantis (1521)
  5. Adjective - Exercitii si teste engleza incepatori (553)

Popular pages this month

  1. Bubbles3 (3366)
  2. Gramatica limbii engleze - Prezentare Generala (3170)
  3. Prezentul simplu si continuu - Present Tense Simple and Continuous (2266)
  4. Butterfly Kyodai (2168)
  5. Trecutul simplu si continuu - Past Tense Simple and Continuous (1918)