LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> PHP a SQL - EZ_SQL

EZ_SQL je praktická knihovna pro zpřístupnění SQL databáze z PHP.

7.2.2005 15:00 | MaReK Olšavský | Články autora | přečteno 15600×

Patrně nejlepší seriál, který vycházel na tomto serveru je PHP od autora Petra Zajíce, na který si dovolím nepřímo navázat několika články o zajímavých PHP klihovnách a projektech. První z nich je EZ_Sql, která slouží ke zpřístupnění takřka libovolné běžněji používané SQL databáze, z nichž namátkou jmenujme MySQL, PostgreSQL a Firebirda. Zpřístupnění je řešeno do té míry, že nemusíte při psaní scriptu/projektu řešit to že se fce pro jednotlivé db servery liší názvem a můžete snadno převést projekt na jinou databázi. Pochopitelně neudělá Vám z MySQL PostgreSQL, protože rozdílů na úrovni databáze je více, než malé množství.

Jak jsem předestřel v předchozím odstavci, při použití základních dotazů a nedefinování db tabulek z PHP scriptu lze docílit takřka 100% přenositelnosti projektu na aplikační server, který bude napojen na jinou databázi, než kterou máte doma na svém vývojovém stroji. Já toho využívám dost často, protože vývoj jedu na PostgreSQL, ale většinou je na hostingu k dispozici "pouze" MySQL. Omezením je nepřenositelnost specifik jednotlivých serverů, na které narážím téměř jen při vytváření tabulek a nemožnosti tvořit a následně přenášet například uložené procedury.

Knihovna EZ_Sql je volně ke stažení, použití a další distribuci v souladu s LGPL licencí, což znamená, že Váš projekt již nemusí být dále šířen jako opensource, s výjimkou této knihovny. Stáhnout jí můžete zde, anglicky psaný manuál je součástí zip souboru, který stáhnete nebo jej máte dostupný na www stánkách. Rozhodně tímto článkem nechci tento manuál suplovat, ale hodlám ukázat základní funkcionalitu knihovny. V době kdy píši tento článek je ke stažení verze z řady 1, konkrétně 1.26, přižemž jsem dostal email, že se připravuje verze 2, kde asi největší změnou bude jiné načítání scriptů před použitím a očekávám přístup do MySQL i tak, jak jsou nové funkce v PHP5, další změnou bude lepší podpora SQLite, která je v PHP nově pořádně podpořena a která má dle mého poměrně velikou budoucnost. Bohužel z toho, co je momentálně k dispozici nelze moc vyčíst, protože není k dispozici nějaké readme, kde jsou popsány změny.

První krok

Dobře, měl by být krok třetí, protože za první by se dalo považovat stažení od tvůrce a za druhý rozbalení do adresáře webu. Dalším krokem by mohlo být základní nastavení, ale není nejvýše nutné. Dalším krokem dle původní dokumentace by mělo být nastavení konstant z počátku ez_sql.php příslušné k patřičnému serveru, který potřebujete používat. Jsou to po řadě EZSQL_DB_USER (uživatelské jméno), EZSQL_DB_PASSWORD (heslo uživatele), EZSQL_DB_NAME (jméno databáze) a nakonec EZSQL_DB_HOST (připojení k SQL serveru). Potom stačí do kódu vložit require_once 'ez_sql.php' z patřičného adresáře a jeden z posledních řádků, které jsou v kódu ez_sql zajistí vytvoření instance třídy a její připojení k databázi s parametry podle výše definovaných konstant.

Já osobně volím trochu jiný postup. Tyto řádky mám zakomentovány a veškeré definice konstant a natažení potřebných knihoven (nebo chcete-li jinak scriptů) řeším dvojicí init.php a config.php. Napřed requirnu init.php, který první co obsahuje je require_once 'configure.php', kromě toho init obsahuje natažení všech potřebných knihoven a vytvoření instancí tříd, které běžně používám, jako je právě zde popisované ez_sql a Smarty. Soubor configure.php obsahuje definice všech konstant, které používám. Vím, že to asi není nejrychlejší řešení pro server, ale milisekundy už většinou nic neřeší. Naopak, protože se webovým programováním zabývám více, šetří mi to práci a do nového projektu jen překopíruji adresáře lib, smarty, plugins a init. Adresář (nebo název databáze), ze kterého používám si také dávám do konstanty. V knihovně init.php vytvořím i instanci knihovny pomocí db(DBUSER, DBPWD, DBNAME, DBSERVER), takže v důsledku vypadá začátek init.php nějak takto:

//requires
require_once './../init/configure.php';
require_once './../lib/'.DBTYPE.'/ez_sql.php';
require_once './../Smarty/smarty.php';

//inits
$db=new db(DBUSER, DBPASSWORD, DBNAME, DBSERVER);
$page=new Smarty();
...

Další užitečnou radou, kterou mě v mých PHP začátcích kamarád počastoval je používat proměnnou DBPREFIX (pochopitelně definovanou v config.php), přes kterou si zadávám části názvů tabulek. Toto oceňuji zejména v testovacím provozu, kdy několik projektů stílí jednu databázi, ale potřebují stejně pojmenované tabulky (například pro projekt fotovideo budu mít předponu "fo_" a pro kucharske potreby "ku_") a když testovací projekt skončí a na server dám tabulky bez těchto předpon, jednoduše v config.php tuto konstantu nastavím na prásdná řetězec.

Práce s daty

Knihovnu máme nataženu, vytvořenu její instanci a můžeme (se) vrhnout na práci s daty na SQL serveru. Vím, že Petr Zajíc do svého seriálo objektově orientované programování zahrnul relativně zběžně, ale není to chyba, protože většina začínajících má s objekty docela potíže. Knihovna Ez_sql je objektová, což se vám může nelíbit, můžete s tím nesouhlasit, ale to je asi tak vše, co s tím můžete dělat. No ještě ji můžete nepoužívat, napsat si něco podobného sami a bez objektů, ale jaká bude Vaše efektivita, když budete tvořit již hotové tedy opravdu nevím.

Výhodou při práci s touto knihovnou je to, že už nebudete nuceni psát neustále sekvence, kdy zadáte databázi příkaz pro manipulaci s daty a potom "pěšky" testujete, zda-li proběhl v pořádku a pakliže ne, řešíte nějaké ošetření chyby. Toto z velké části odpadá.

"Dolování" dat z databáze

Získávání dat z databáze je určitě nejkomplexněji řešená část tohoto projektu. Pomocí třech funkcí můžete získat jednu proměnnou, jeden řádek, nebo pole řádků z databáze.

Začneme získáním jedné proměnné z databáze. Dejme tomu, že potřebujete získat počet řádek v tabulce zákazníci, u nichž je nastaven příznak restricted='no', to znamená, že nemají zakázán přístup na náš webshop. Při použití klasického postupu (připojen už jsem) to vypadalo třeba takto:

$result=pg_query($pgconnection,'SELECT COUNT(*) AS cnt FROM '.
  DBPREFIX.'consumers WHERE restricted=\'no\'');
if(!$result){
  //osetreni chyby
} else {
  $record=pg_fetch_array($result, NULL, PGSQL_ASSOC);
};
...
...

a někde v programu později zobrazíte pomocí $record['cnt']. Omlouvám se všem, kteří preferují MySQL, ale vše je skoro stejné až na to, že pg nahradíte za mysql, nebude te mít za proměnnou s výsledkem, který odchytáváme do pole, konstanty a budete mít extra funkce pro odchycení do asociativního a indexovaného pole. Já osobně preferuji spíš používání asociativních polí, než indexovaných, přeci jen názvy sloupců v tabulce si pamatuji, ale abych si pamatoval jejich pořadí v dotazu považuji za kontraproduktivní.

Při použití Ez_sql si vystačíte s jediným příkazem - $cnt=$db->get_var('SELECT COUNT(*) FROM '.DBPREFIX.'consumers WHERE restricted=\'no\'');, máte počet přímo v proměnné a nemusíte řešit přístup přes pole.

Získání jedné proměnné budeme potřebovat rozhodně méně často, než získání jednoho, či několika řádků z databáze. Zatímco pro výběr dat klasickým způsobem používáme stále stejné funkce ve stálém pořadí, zde nám přibyde napřed funkce pro výběr jednoho řádku, která se použije příkazem: $db->get_row(dotaz[,OBJECT/ARRAY_A/ARRAY_N[,offset]]). Nejprve si vysvětlíme konstanty, které jsem napsal za slovo dotaz:

  • OBJECT - data z řádku se Vám vrátí jako objekt
  • ARRAY_A - data budou uložena v associativním poli
  • ARRAY_N - data budou v číslovaném poli a v tom případě můžete pomocí offset určit pozici prvního prvku. Význam tohoto pochopí zejména ti, kteří dělali v jazyce C/C++ a v začátcích dělali chybu v tom, že si vytvořili pole o 10 prvcích a k prvkům pole přistupovali pomocí indexu v rozsahu 1 až 10, místo 0 až 9 a při zápisu nastala chyba.

Jak jsem psal o něco výše, preferuji použití asociativního pole. Pokud by podmínkám dotazu odpovídalo více záznamů, návratovou hodnotou funkce bude první z nich.

Pojďme si ukázat alespoň dva příklady, potom bude vše jasné.

$user=$db->get_row('SELECT * FROM '.DBPREFIX.'users WHERE login=\''.$_POST['login'].'\' AND pwdhash=\''.sha1($_POST['login'].$_POST['pwd']).'\'',OBJECT);

Vám vrátí všechna data uživatele, jestli-že jste napsali správné jméno a hesla. Pro tabulku s autorizacemi je rozumný výchozí předpoklad, že máte kombinaci login a pwdhash jedinečnou. Přístup k jednotlivým položkám pak máte přes objekt $user, takže hodnoty id, email a další získáte pomocí $user->id, $user->email.

Pro asociativní pole použiji:

$user=$db->get_row('SELECT * FROM '.DBPREFIX.'users WHERE login=\''.$_POST['login'].'\' AND pwdhash=\''.sha1($_POST['login'].$_POST['pwd']).'\'',ARRAY_A);

a data potom budete mít v poli, ze kterého je získáte pomocí $user['id'], $user['email'], ... Z hlediska toho, co si programátor musí při vývoji pamatovat považuji tyto dva přístupy za rovnocenné.

Pro získání pole záznamů je vytvořena další funkce $db->get_results(dotaz[,OBJECT/ARRAY_A/ARRAY_N]), kde význam konstant je stejný jako v předchozím případě, jen nemůžete nastavit offset.

$articles=$db->get_results('SELECT id, title, lastedit, visible FROM '.DBPREFIX.'articles WHERE editor=\''.$_POST['userid'].'\'',ARRAY_A);

Vám do asociativního pole vrátí vybrané údaje o článcích příslušných k uživateli, kterého jste vybrali někde ve formuláři.

Použil jsem asociativní pole, které můžete "projet" pomocí cyklu foreach, takže bychom data mohli zobrazit pomocí:

$articles=$db->get_results('SELECT id, title, lastedit FROM '.
  DBPREFIX.'articles WHERE editor=\''.$_POST['userid'].'\'',ARRAY_A);
foreach($articles as $oneart)
  echo $oneart['id'].' - '.$oneart['title'].' -> '.$oneart['lastedit'];

Pokud bychom použili jako výstup OBJECT, bude Vám vráceno pole objektů, takže k "projetí" celého pole můžete použít zase cyklu foreach, jen jednotlivé položky budete zobrazovat pomocí $oneart->id, ...

Upozornění: Defaultně je výstup nastaven jako OBJECT, takže chcete-li něco jiného, musíte to ez_sql sdělit.

Závěrem

V tomto díle jsem Vám provedl základní představení Ez_sql, včetně získávání dat z databázového serveru. Protože věřím, že se Vám tato knihovnička zalíbí a budete jí používat, přečtete si i další díl, kde si řekneme něco o obecných dotazech, podíváme se jak na chyby a případně co s nimi...

Verze pro tisk

pridej.cz

 

DISKUZE

Další výhoda 7.2.2005 22:33 Petr Zajíc
  L Re: Další výhoda 8.2.2005 09:04 MaReK Olšavský




Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

13.9.2017 8:00 /František Kučera

Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt – tentokrát netradičně v pondělí: 18. září od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).


Přidat komentář

3.9.2017 20:45 /Redakce Linuxsoft.cz
PR: Dne 21. září 2017 proběhne v Praze konference "Mobilní řešení pro business". Hlavní tématy konference budou: nejnovější trendy v oblasti mobilních řešení pro firmy, efektivní využití mobilních zařízení, bezpečnostní rizika a řešení pro jejich omezení, správa mobilních zařízení ve firmách a další.
Přidat komentář

15.5.2017 23:50 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 18. května od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

12.5.2017 16:42 /Honza Javorek
PyCon CZ, česká konference o programovacím jazyce Python, se po dvou úspěšných ročnících v Brně bude letos konat v Praze, a to 8. až 10. června. Na konferenci letos zavítá např. i Armin Ronacher, známý především jako autor frameworku Flask, šablon Jinja2/Twig, a dalších projektů. Těšit se můžete na přednášky o datové analytice, tvorbě webu, testování, tvorbě API, učení a mentorování programování, přednášky o rozvoji komunity, o použití Pythonu ve vědě nebo k ovládání nejrůznějších zařízení (MicroPython). Na vlastní prsty si můžete na workshopech vyzkoušet postavit Pythonem ovládaného robota, naučit se učit šestileté děti programovat, efektivně testovat nebo si v Pythonu pohrát s kartografickým materiálem. Kupujte lístky, dokud jsou.
Přidat komentář

2.5.2017 9:20 /Eva Rázgová
Putovní konference československé Drupal komunity "DrupalCamp Československo" se tentokrát koná 27. 5.2017 na VUT FIT v Brně. Můžete načerpat a vyměnit si zkušenosti z oblasti Drupalu 7 a 8, UX, SEO, managementu týmového vývoje, využití Dockeru pro Drupal a dalších. Vítáni jsou nováčci i experti. Akci pořádají Slovenská Drupal Asociácia a česká Asociace pro Drupal. Registrace na webu .
Přidat komentář

1.5.2017 20:31 /Pavel `Goldenfish' Kysilka
PR: 25.5.2017 proběhne v Praze konference na téma Firemní informační systémy. Hlavními tématy jsou: Informační systémy s vlastní inteligencí, efektivní práce s dokumenty, mobilní přístup k datům nebo využívání cloudu.
Přidat komentář

15.4.2017 15:20 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě IoT a radiokomunikace? Přijď na sraz spolku OpenAlt, který se bude konat ve středu 19. dubna od 18:30 v Šenkovně (Sokolská 60, Praha 2).
Přidat komentář

5.3.2017 19:12 /Redakce Linuxsoft.cz
PR: 23. března proběhne v Praze konferenci na téma Cloud computing v praxi. Hlavními tématy jsou: Nejžhavější trendy v oblasti cloudu a cloudových řešení, Moderní cloudové služby, Infrastruktura současných cloudů, Efektivní využití cloudu, Nástrahy cloudových řešení a jak se jim vyhnout.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

18.9.2017 14:37 / Rojas
high security vault

15.9.2017 7:33 / Wilson
new zealand childcare jobs

31.8.2017 12:11 / Jaromir Obr
Re: ukůládání dat ze souboru

30.7.2017 11:12 / Jaromir Obr
Národní znaky

27.7.2017 12:24 / Jaromir Obr
Cteni/zapis

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2017) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze