Malý historický výlet
Jak už to tak bývá, někomu se nelíbila roztříštěnost přístupu PHP k databázím. A protože to nebyl lenoch, začal to řešit po svém. Ten někdo byl Stig Bakken a údajně to bylo v pondělí 22. listopadu 1999.
Vývoj se nezastavil, projekt pokračuje vesele dál. V současné době je k dispozici už 177 balíků řešící nejen databáze, ale také např. logování, autentizaci, emailování a mnoho dalšího. Zajímavé je také, že PEAR je oficiální částí PHP od verze 4.3.0.
Název a struktura
Každý správný projekt musí mít jednoduché a snadno zapamatovatelné jméno. Název PEAR to naprosto splňuje. Podle doporučení se vyslovuje jako ono známé ovoce (možná je autor fanouškem hruškového kompotu :). Oficiální název je PHP Extension and Application Repository. (Pozn.: ta hruška a kapalné produkty z ní jsou ale mnohem sympatičtější.)
Projekt kromě kódu samotného obsahuje také další vymoženosti, které zvyšují jeho i tak velkou hodnotu.
- Systém pro správu a distribuci kódu.
- Normy pro vývoj. Začínají odsazováním, pokračují přes definice a volání funkcí,… a končí jmennými konvencemi. (Není to tedy projekt typu nahoře huj a vespod fuj, procházet a popř. měnit zdrojáky je radost sama)
- PHP Foundation Classes (PFC). Zde se autoři zaměřují na kvalitu, kompatibilitu … Hlavní dopad je tedy distribuce balíků ve verzi STABLE – stálé API, vyladěná rychlost, může záviset pouze na STABLE balících atd.
- PHP Extension Code Library (PECL) anglicky [pickle], česky asi [pikl](kujme pikle?!). Rozšiřování Céčkem, k nastudování za domácí úkol.
- Poslední částí je bugtrag, mailing list, web, mirrory.
Připoutejte se, odlétáme
Pro začátek něco běžného, co třeba unifikovaný přístup k databázím prostřednictvím balíku PEAR::DB?
1. require_once 'DB.php'; 2. $db = DB::connect("pgsql://username:password@localhost/sazka"); 3. if (DB::isError($db)) { die ($db->getMessage()); } 4. $result = $db->query("select * from ne"); 5. if(DB::isError($result)){ die ($result->getMessage()); } 6. while ($row = $result->fetchRow()){ echo $row[0]."<br>\n"; } 7. $db->disconnect();
Uznávám, že ten příklad je hodně „trivoš“, ale na vysvětlení bude stačit. Aspoň je vidět ta jednoduchost.
Řádek 1 snad ani nemá cenu popisovat. Include souboru zvládne i cvičená opice.
Řádek 2 už začíná být zajímavější. Na začátku je uveden ovladač, v tomto případě se tedy budu připojovat k Postgresu. Na výběr jsou samozřejmě i další možnosti, z běžných lze jmenovat MySQL, Oracle, ODBC, SQL Server a ještě pár dalších. Následují login a heslo, počítač a název databáze. (Trochu mi to připomíná Javu, tady se to ale všechno stihne v jednom příkazu.)
Poskočíme na řádek 3. Místo try/catch zde použijeme if a otestujeme případnou chybu, zde selhání přístupu k databázi.
Na řádku 4 se konečně provede dotaz. (Konkrétně se vyberou všechna nedělní losování sazky od roku 1957).
Na pětce opět odchytáváme chybu.
Pokud dotaz proběhl v pořádku, můžeme výsledek začít zpracovávat. Řádek 6 vypíše vždy první pole. Správnější by asi bylo použití hashe, což se dá snadno zařídit. Stačí provést tuto změnu: …->fetchRow(DB_FETCHMODE_ASSOC) a můžeme vesele používat echo $row[‚rok‘]…
Malá chvilka logování
Další krátká ukázka se bude týkat komponenty pro logování. Možností, kam logovat je několikero, mimo jiné soubor, databáze (samozřejmě používá předchozí), syslog a další. Pro jednoduchost uvedu jenom logování do souboru.
1. require_once "Log.php"; 2. $log = &Log::singleton('file', '/tmp/log.txt', '--POKUS--'); 3. $log->("ahoj"); 4. $log->log("nazdar",PEAR_LOG_DEBUG); Výstup Jun 17 23:35:48 --POKUS-- [info] ahoj Jun 17 23:35:48 --POKUS-- [debug] nazdar
Tak tomu říkám pohoda. Zařídit logování na dvou řádcích.
Řádek 1 snad ani nepotřebuje komentář.
Na řádku 2 vytvářím kopii objektu. Při změně na …singleton(‚syslog‘) se hlášení najednou objevují ve /var/log/syslog :) atd.
A dál už jenom používám a loguju a loguju… Závažnost lze měnit od debug až po emerg, celkem 8 stavů.
Jdeme do finále
V předchozím jsem se pokusil pro neznalé aspoň trochu objevit framework PEAR. A úplným závěrem ještě pár bodíků, proč používat zrovna tenhle softík.
- slušně napsaný kód
- slušně dokumentovaný
- zdá se být v dynamickém vývoji
- a ta cena :)