Még a PHP 5-el frissítésként megjelent a PDO is, mely egy natív absztrakciós réteg a webfejlesztés során. Használatával egységes formában kezelhetünk többféle adatbázist, és jobb esetben minimális módosítással cserélhetjük ki az adatbázis kiszolgálót. Előnye, hogy a PHP része, illetve mivel C alapú, így elég gyors is. A PDO illesztkedik a PHP OOP irányú vonalához, szóval egy osztályként kapjuk kézhez.
Vegyük is gyorsan használatba
<?php
// Csatlakozási adatok
$tipus = 'mysql';
$host = 'localhost';
$database = 'adatbazis';
$username = 'felhasznalo';
$password = '12345';// Csatlakozás
try
{
$db = new PDO("$tipus:host=$host;dbname=$database", $username, $password);
echo 'Sikerült a csatlakozás';
}
catch(PDOException $e)
{
echo 'Hiba: '.$e->getMessage();
}
?>
A példában egy MySQL adatbázishoz csatlakoztam. Bármilyen probléma esetén PDOException -t fogunk kapni.
A következő példákban a kódba már nem írom bele a csatlakozást, hanem feltételezem, hogy van egy élő kapcsolatod.
Az egyik nagy előnye a PDO-nak, hogy képes a parancsokba behelyettesíteni paramétereket úgy, hogy az adatok escapelését is elvégzi. Ennek az SQL injection miatt van szerepe, ahol olyan adatot küldhetnek be amit megfelelő előszűrés nélkül SQL parancsnak értelmezhet a rendszer. Node nézzük is, hogy miként is megy ez:
$sth = $db->prepare('UPDATE post SET title = ":title" WHERE id=:id');
$sth->execute(array(':title' => 'Első bejegyzés', ':id' => 1));
$sth->execute(array(':title' => 'Második bejegyzés', ':id' => 2));
$sth->execute(array(':title' => 'Harmadik bejegyzés', ':id' => 3));
Mint látható "beállítottunk előre egy parancsot" melyet az $sth változóban eltároltunk, és későbbiekben bárhányszor meghívhatunk megfelelően paraméterezve. A paraméter konkrétan egy tömb, ahol kulcs-érték párokkal jelezzük, hogy minek a helyére mit helyettesítsen be a rendszer. Ilyen egyszerű az első három bejegyzésnek egyéni címet adni.
Tranzakció létrehozása sem túl bonyolult. A tranzakciók lényege, hogy vagy a tranzakciós blokkon belüli összes parancs lefut, vagy egyik sem. Rendkívül jól használható fícsör lehet például fizetések eltárolásánál.
$db->beginTransaction();
$sth->execute(array(':title' => 'Első bejegyzés', ':id' => 1));
$sth->execute(array(':title' => 'Második bejegyzés', ':id' => 2));
$db->commit();
A $db->rollBack(); parancs kiadásával pedig megszakíthatjuk a tranzakciót.
Lépjünk is szintet, jöhetnek a lekérdezések:
$sth = $db->prepare('SELECT * FROM post WHERE id>:id');
$sth->execute(array(':id' => 1));
$posts = $sth->fetchAll();
A fenti kód a $posts változóba visszaadja fetchelve az összes sort aminek az ID-je nagyobb mint 1. A $posts[0] -ban az első sor a $posts[1]-ben a második stb lesz. Emiatt egy foreach segítségével könnyen listázhatóak a találatok.
Ha konkrétan az 1-es ID-jűt szeretnéd kiíratni akkor értelemszerűen a id>:id cserélődik id=:id-re, és mivel ott csak 1 visszaadott sor lesz ezért a $posts[0]['title'] segítségével rögtön íratható is a bejegyzés címe.
Ha valamilyen hibába futnál akkor:
var_dump($db->errorInfo());