Cand se creaza un obiect PDO cu o conexiune la o baza de date, daca apare vreo eroare in transmiterea de comenzi la baza de date determina lansarea PDOException. Daca eroarea nu e preluata cu try ... catch() PHP va opri executia scriptului.
PDOException este o extensie a clasei PHP Exception, prin care pot fi "prinse" erorile.
Cu formula try ... catch(), pe langa faptul ca eroarea e preluata iar scriptul isi continua executia, se poate de asemenea si personaliza mesajul ce va fi afisat. Sintaxa generala este:
Cu metoda PDO setAttribute() se pot seta diferite atribute la obiectul PDO prin care se face conexiunea la baza de date, printre care si modul de raportare a erorilor retinute cu "try ... catch()".
Formula generala de aplicare a acestei metode este:
$obiectPDO->setAttribute(ATRIBUT, OPTIUNE)
- ATTRIBUT reprezinta tipul atributului care va fi aplicat, iar OPTIUNE este optiunea lui, cum ar fi:
<?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 // Seteaza ca numele coloanelor sa fie returnat cu majuscule $dbh->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER); // Selecteaza primul rand $sql = "SELECT * FROM `sites` LIMIT 1"; $datas = $dbh->query($sql)->fetch(PDO::FETCH_ASSOC); // Executa interogarea si preia in modul FETCH_ASSOC // Daca select-ul e facut cu succes ($datas nu e false) if($datas !== false) { // Se parcurg datele si afiseaza numele coloanelor foreach($datas as $col=>$row) { echo ' - '. $col; } } $dbh = null; // Deconectare } catch(PDOException $e) { echo $e->getMessage(); }- Script-ul va afisa in browser numele coloanelor, cu majuscule:
<?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); // Seteaza ca mod pt. erori cel standard PHP $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); $dbh->exec("SET CHARACTER SET utf8"); // Setare encoding caractere UTF-8 // Selecteaza primul rand $sql = "SELECT `zzz` FROM `sites` LIMIT 1"; $datas = $dbh->query($sql); // Executa interogarea // Se parcurg datele si afiseaza ce e in coloana 'zzz' foreach($datas as $row) { echo $row['zzz']; } $dbh = null; // Deconectare } catch(PDOException $e) { echo $e->getMessage(); }- Deoarece coloana "zzz" nu exista, va emite urmatoarea eroare:
Metoda beginTransaction() se foloseste impreuna cu commit().
beginTransaction() opreste executia oricarei interogari la baza de date, pana cand e apelata metoda commit(), in acel moment vor fi executate declaratiile SQL adaugate intre aceste 2 metode.
Avantajul acestei tehnici consta in faptul ca pot fi scrise mai multe seturi de interogari SQL, care "stau in asteptare", iar cand e apelata metoda commit() sunt executate toate deodata.
<?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->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Seteaza mod exception pt. erori $dbh->exec("SET CHARACTER SET utf8"); // Setare encoding caractere UTF-8 $dbh->beginTransaction(); // Incepe inscrierea comenzilor // 1. Modificare date din coloanele "nume" si "adresa", unde id=3 $dbh->exec("UPDATE `sites` SET `nume`='Cursuri Spaniola', `adresa`='marplo.net/spaniola' WHERE `id`=3"); // 2. Adaugare date in rand nou $dbh->exec("INSERT INTO `sites` (`nume`, `categorie`, `adresa`) VALUES ('JavaScript', 'programare', 'marplo.net/javascript')"); $last_id = $dbh->lastInsertId(); // Retine ultimul id adaugat // 3. Selectare date din randurile anterioare celui adaugat inainte ("id" mai mic decat $last_id) $datas = $dbh->query("SELECT `nume`, `adresa` FROM `sites` WHERE `id`<'$last_id'"); $dbh->commit(); // Determina transmiterea tuturor comenzilor la MySQL // Daca select-ul e facut cu succes ($datas nu e false) if($datas !== false) { echo 'Ultimul id adaugat: '. $last_id. '<br />'; // Afiseaza ultimul id adaugat (la comanda 2) // Se parcurg si afiseaza datele selectate foreach($datas as $row) { echo $row['nume']. ' - '. $row['adresa']. '<br />'; } } $dbh = null; // Deconectare } catch(PDOException $e) { echo $e->getMessage(); } ?>- Dupa cum arata si exemplu, aceasta metoda este utila in cazul cand trebuie efectuate mai multe interogari diferite la baza de date, in acelasi script. In plus, imbunatateste si viteza de executie a scriptului, face mai eficient lucru cu multiple interogari la baza de date. Intre comenzile SQL care "sunt in asteptare" se pot adauga diferite instructiuni PHP care sa influenteze urmatoarele comenzi (precum aici SELECT-ul a fost facut in functie de ultimul "id" creat prin comanda precedenta).
Daca atributul setAttribute() e setat pe modul ERRMODE_WARNING si apare vreo eroare la una din declaratiile SQL dintre beginTransaction() si commit(), cand acestea sunt transmise la server, celelalte comenzi dupa cea care a determinat eroarea nu mai sunt executate.
Dar daca nu e specificat modul de eroare ERRMODE_WARNING, scriptul continua executia si la celelalte comenzi.
<input type="number" name="points" min="5" max="80" />
#id { filter:alpha(opacity=40); /* for IE */ opacity:0.4; }
var num = 12.84567; alert( num.toPrecision(3) ); // 12.8
$lang =[10=>"PHP", 20=>"JavaScript", "site"=>"coursesweb.net"); shuffle($lang); var_export($lang); // array (0=>"coursesweb.net", 1=>"PHP", 2=>"JavaScript")
She is the best in our class. - Ea este cea mai buna din clasa noastra.
Él es el mejor en nuestra clase. - El este cel mai bun din clasa noastra.