Már lassan egy éve nem volt új bejegyzés, gondoltam ideje írni valamit. :) Régebben már volt szó a PHP objektum-orientált adatbázis elérési felületéről, a PDO-ról. Mivel utóbb inkább csak a használatára tértem ki, nem lett megemlítve, hogy ezekből az osztályokból származtathatjuk saját osztályainkat is, ami alapvetően egy jó dolog tud lenni.

Vegyünk is egy egyszerű példát. Tegyük fel azt, hogy már annyira jók vagyunk, hogy az SQL szerverrel is csak l33t nyelven vagyunk hajlandóak kommunikálni. Persze a mysqld (vagy egyéb tetszőleges daemon) nem ilyen megértő, és folyamatosan panaszkodik, hogy nem ért meg minket. A probléma elsimítása érdekében származtatunk a beépített PDO osztályból egy sajátot:

class L33tPDO extends PDO {
	private static $from = array(
		's3l3ct', 'fr0m', 'wh3r3', 's3t', '1ns3rt', '1nt0', 'upd4t3', '0rd3r', '4sc', 'd3sc', 'l3ft', 'r1ght', '1nn3r', 'j01n'
	);
	private static $to = array(
		'SELECT', 'FROM', 'WHERE', 'SET', 'INSERT', 'INTO', 'UPDATE', 'ORDER', 'ASC', 'DESC', 'LEFT', 'RIGHT', 'INNER', 'JOIN'
	);
	public function query($statement, $type = false, $param1 = false, $param2 = false) {
		$statement = $this->convertStatement($statement);
		
		if ($type && $param1 && $param2) {
			return parent::query($statement, $type, $param1, $param2);
		}
		if ($type && $param1) {
			return parent::query($statement, $type, $param1);
		}
		if ($type) {
			return parent::query($statement, $type);
		}
		
		return parent::query($statement);
	}
	public function prepare($statement, $driver_options = array()) {
		$statement = $this->convertStatement($statement);
		parent::prepare($statement, $driver_options);
	}
	private function convertStatement($statement) {
		return str_ireplace(self::$from, self::$to, $statement);
	}
}

Hogy takarékoskodjunk a hellyel, a kulcsszavak listája nem teljes. Nézzünk is egy példát a használatra:

$conn = new L33tPDO('pgsql:host=localhost port=5432 dbname=test user=test password=test');

$stmt = $conn->query("s3l3ct * fr0m users wh3r3 id > 1 0rd3r by login_name 4sc" );

var_dump($stmt->fetchAll());

Bár a felhozott példa nem igényli, a PDOStatement osztályból is származtathatunk sajátot, csak meg kell mondanunk a saját PDO osztályunknak, hogy az általunk írt PDOStatement-tet adja vissza a megfelelő függvényei. Ehhez bővítsük ki a L33tPDO osztályunkat egy konstruktorral:

function __construct($dsn, $username = null, $password = null, $driver_options = array()) {
	parent::__construct($dsn, $username, $password, $driver_options);
	
	$this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('L33tPDOStatement', array($this)));
}

És egy hozzá passzoló statement osztály:

class L33tPDOStatement extends PDOStatement {
	private $dbh;
	protected function __construct($dbh) {
		$this -> dbh = $dbh;
	}
}

Ennyit mára. További kellemes kódolást.

A minap találkoztam össze a twofifty.org oldallal, ahol az ember trendi Ajax-os rendszer segítségével kihuzogathatja az IMDb 250-es listából azokat a filmeket, amiket látott. Meg mellesleg kommenteket is lehet hozzá fűzni, meg vannak statisztikák is nem, kor szerinti bontásban. Amellett, hogy meglepően kevés filmet láttam ebből a listából, eszembe jutott, hogy mekkora jó lenne már egy olyan kis alkalmazás, ahol az ember a tennivalóit tudná hasonló módon kihuzogatni. Gyorsan össze is dobtam egy ilyen kis oldalacskát a Prototype és a PDO segítségével.

Tovább...

Gondolom sokaknak megfordult a fejében (akik 2 percnél többet töltöttek el a PHP tanulmányozásával és adatbázis kapcsolatot is próbáltak létesíteni), hogy kellene valami egységesebb felület (mondjuk egy adatbázis objektum), ha például a rendszerünket MySQL alapokról PostgreSQL-re akarnánk átvinni, vagy csak egyszerűen szeretnénk, hogy valahogy kinézzen az a kód. Gondolom akadnak olyanok is, akik fogták magukat és megírták ezt a bizonyos objektumot (vagy objektumokat), vagy olyanok, akik a PEAR által kínált megoldást találták megfelelőnek. Viszont a PHP 5.1-es verziójától már beépített megoldás is van erre az égető problémára egy kiterjesztés-csoport személyében.

Tovább...