PHP a SQL - EZ_SQL (2)

EZ_SQL je praktická knihovna pro zpřístupnění SQL databáze z PHP. Uložení, aktualizace, mazání dat a práce s chybami, neboli pokračování z minula.

14.2.2005 15:00 | MaReK Olšavský | přečteno 12243×

Minule jsme si udělali základní seznámení s knihovnou Ez_slq.php včetně výběru dat z databáze. V tomto díle bude vysvětlena funkce k zadání ostatních (neSELECT) dotazů a práci s chybami.

Ostatní dotazy

Kromě výběru dat skoro pro veškerou ostatní funkčnost nad SQL databází použijete funkci $db->query(dotaz);, takže například pro vymazání uživatelů, kteří jsou nastaveni jako rescrticted='yes' použijete $db->query('DELETE FROM '.DBPREFIX.'users WHERE restricted=\'yes\'');. Návratová hodnota funkce je typu bool, tzn. je-li příkaz (DELETE, UPDATE, INSERT, ...) proveden úspěšně, je nastavena na 'True' a jestliže je záporná, je 'False'. Pokud existuje i nějaký další výsledek provedeného dotazu, než je (ne)úspěšnost, je tento nacacheován a je dostupný pomocí další funkce.

Další příklady

$db->query('UPDATE '.DBPREFIX.'emplyes SET plat=plat+1500 WHERE plat<23000');
$db->query('INSERT INTO '.DBPREFIX.'log(lastlogin, ip, id_user) VALUES ('...')');

Prvním dotazem zvedáme plat všem, kteří mají méně, než 23000,- o 1500,- a druhým vložíme záznam do logovací tabulky, kdy se přihlásil některý z uživatelů.

Představte si situaci, že zákazník si na jednoduchém redakčním systému přeje vkládat obrázky, ideální je ukládání pod jejich původními adresáři, ale protože není ve Vašich silách zajistit, že každý vložený obrázek bude mít jedinečný název (a zákazník zapomene za 2 týdny, cože to vlastně vložil), může být jednou z cest dynamické tvoření adresářů na serveru. Hlavní adresář pro ukládání těchto dat může být například artimg (jako articles images) a v něm budete twořit podadresáře pro uložení obrázků k článům (přes DOM model stránky si zajistíte políček na ně, kolik si zrovna uživatel vzpomene) s logikou art###, kde ### je ve významu id posledního vloženého řádku.

K získání toho ### jste, pokud jste používali MySQL, použili funkci MySQL_Insert_Id();, v případě PostgreSQL funkci pg_last_oid();, atd. Pokud použijete Ez_sql, máte k dispozici proměnnou $db->insert_id, která je vždy po uložení data automaticky nastavena. Jedná se o hodnotu, která je v tabulce pod typem (big)serial (nebo auto_increment pro MySQListy).

V tomto případě zvolíte způsob, že budete mít tabulku článků a druhou tabulku, kde budete mít názvy obrázků (ten kód co tu bude nebude nejhezčí, ale berte to jako návrh možného řešení), někdo teď namítne, proč je rovnou nenakopírovat do databáze, ale to je řešení, proti kterému mám docela silné výhrady. Ukázka uložení (nekompletní):

//ulozeni clanku na server
$db->query('INSERT INTO '.DBPREFIX.'articles (title, content, visible, lasedit)'.
  'VALUES('.$_POST['title'].'\', \''.$_POST['content'].'\', \''.
  $_POST['visible'].'\', NOW())');
//vytvoreni adresare
$myDir='./../artimg/art'.$db->insert_id.'/';
mkdir($myDir,0777);
//prekopirovani obrazku na server a jejich ulozeni do db reseno jen pro jeden
move_uploaded_file($_FILES['pic']['tmp_name'],$myDir.$_FILES['pic']['name']);
$db->query('INSERT INTO '.DBPREFIX.'artpic(id_art, name) VALUES (\''.
  $db->insert_id.'\', \''.$_FILES['pic']['name'].'\'');

Sloupeček id_art používam jako referenci na článeček, ke kterému obrazák patří. Pokud chci zobrazit článek s nějakým znamým id (poslaným metodou GET přes URL), tak použiji 2 dotazy:

$art=$db->get_row('SELECT * FROM '.DBPREFIX.'articles WHERE visible=\'yes\' '.
  'AND id=\''.$_GET['id'].'\'', ARRAY_A);
$pics=$db->get_results('SELECT * FROM '.DBPREFIX.'artpic WHERE id_art=\''.
  $_GET['id'].'\'');

Předpokládám, že nemusím ukazovat, jak obrázek dostanete na stránku.

Užitečné proměnné jsou $db->num_rows, kam je přiřazen počet řádků, které jste získali po provedení SELECTu a $db->rows_affected, ve které bude uložen počet záznamů (nebo chcete-li řádků) oblivněných pomocí INSERT, UPDATE, DELETE. K obojímu existují ekvivalentí funkce v PHP, ale je snažší použít toto, protože jak jsem napsal minule, výhodou je, že pro různé databáze mám stejné funkce a nemusím si jich pamatovat x různých, nebo je hledat v nápovědách a manuálech.

Další funkcí, která se může ukázat jako docela užitečná je $db->debug();, která Vám vytiskne sql dotaz a zároveň data, která jste tímto dotazem získali (pokud nějaké byly, takže INSERT a UPDATE Vám teoreticky nic rozumného zpět neposkytnou). Zkuste si třeba následující:

$art=$db->get_row('SELECT * FROM '.DBPREFIX.'articles WHERE visible=\'yes\''
  , ARRAY_A);
$db->debug();

A uvidíte tabulku se všemi viditelnými článečky, které máte na serveru uloženy. Tato funkce Vám může být velmi nápomocna pří ladění.

Funkce $db->vardump() Vám poslouží k zobrazení obsahu a struktury proměnné. Kromě obsahu a typu dostanete zobrazený poslední SQL dotaz, který byl proveden, jakou funkcí (zde zjistíte, že vlastně vše se vykonává pomocí $db->query() s následným odchycením dat) a počet řádků dat.

Pokud tvoříte nějakou rozsáhlejší aplikaci, bude se Vám velice hodit dvojice příkazů $db->hide_errors() a $db->show_errors(), kterými přepneme, zda-li chceme zobrazovat chyby SQL (připojení k serveru, výběr databáze, chyba v dotazu, ...), nebo ne. Defaultní nastavení je takové, že se chyby zobrazují, což je sice výborné, dokud tvoříte, ale doporučuji vypnout (třeba v init.php), pokud zakázku odevzdáváte zákazníkovi, protože toto zobrazení chyb je dosti detailní a nedobře působící na návštěvníky stránek, které jste napsali.

Pokud máte stránky, kde je v podstatě vše v SQL databázi, je vhodné udělat i podstránečku s omluvou, na kterou se přesměrujete v případě, že nebude fungovat SQL server, nebo nastane jakákoliv jiná chyba v práci s databází. K tomu, abyste zjistili, že je něco v nepořádku Vám poslouží pole $EZSQL_ERROR, které je-li prázdné, proběhlo vše v pořádku a je-li v něm cokoliv, jednako se můžete přesměrovat na stránku s omluvou a zároveň s tímto bych doporučoval uložit chyby do nějakého errorlog.txt, nebo rovnou jejich odeslání na mail administrátora. $EZSQL_ERROR je dvou rozměrné pole, ve kterém počet řádků odpovídá počtu chyb a sloupečky query, error_str a error_no poskytují popis chyby. V trochu nehezké formě si můžete toto pole zobrazit pomocí $db->vardump($EZSQL_ERROR).

Pokud nemáte řešeno ošetření vstupů z formuláře pomocí vlastní knihovny, nebo alespoň nepoužijete php funkci addslashes(), knihovna EZ_Sql Vám poskytuje funkci $db->escape(string), která rozumě nahradí potenciálně nebezpečné znaky ve vstupech. Pro použití alespoň tohoto mluví nutnost mít aplikace alespoň nějakým způsobem robusní a odolné vůči SQL Injections.

Závěrem

V tomto krátkém dvojdílném článečku jsem se pokusil Vám představit zajímavou knihovnu, která usnadní vývoj PHP aplikací nad databázemi nejen začátečníkům, ale i pokročilým (pokud si něco lepšího nenapíšou sami). Knihovna skýtá i další funkce (změna databáze, získání sloupečků, ...), které jsem tu nepopisoval, ale najdete je v dokumentaci.

Jelikož WWW stránky poměrně aktivně programuji, mohu Vám předem přislíbit další članečky, ve kterých se podíváme na zajímavé knihovny pro použití v projektech, ale nebude se jednat jen o PHP projekty, ale budeme zasaženi i JavaScriptem.

Online verze článku: http://www.linuxsoft.cz/article.php?id_article=681