PHP (81) - Uživatel versus programátor
Při programování (nejen) v PHP by měl být na prvním místě VŽDY uživatel. Dnešní díl seriálu o tvorbě hudebního portálu je krásným příkladem.
20.12.2004 15:00 |
Petr Zajíc
| Články autora
| přečteno 26632×
V předchozím díle jsme sestavili rozhraní pro zadávání alb a písní
do databáze. Zkusme dnes toto rozhraní ještě nějak vylepšit.
Vylepšujeme rozhraní pro alba a písně
Naše "diskografické" rozhraní je již docela schopné. Připomeňme si,
že pomocí šikovně rozstrkaných formulářů už umíme:
- přidat píseň do seznamu písní
- přidat album do seznamu alb
- přidat píseň do alba
- odebrat píseň z alba
Člověku by se mohlo zdát, že je prostředí téměř dokonalé. Zkusme ale
chvíli uvažovat jako uživatel: Co bude pro administrátora webu zdaleka
nejčastější důvod k návštěvě stránky zadejdiskografii.php? Bude to
situace, kdy kapela vydá nové CD. Má v takovém případě nebohý
administrátor snadný život? Vlastně moc ne. Takový člověk totiž musí k
zadání dejme tomu deseti písní udělat následující věci:
- Zadat album do seznamu alb
- Zadat píseň č.1 do seznamu písní
- ... atd až do písně č. 10
- Přiřadit píseň č. 1 na album
- ... atd až do písně č. 10
Bystrý počtář sečte, že administrátor musí odklepat 21 formulářů! A
člověk ani nemusí být bystrý počtář, aby mu došlo, že administrátor
takového webu bude už u několikátého formuláře programátora proklínat.
Tento rozbor měl objasnit jednu věc: To, že jsme splnili nějaký úkol
ještě neznamená, že jsme jej splnili dobře! Pojďme se nyní podívat, jak
to s pomocí pár triků celé zajistíme jedním (!) jediným formulářem. Ten
formulář bude vypadat nějak takto:
Asi každému je jasné, že práci s jedním formulářem uvítá každý
administrátor mnohem raději, než práci s jedenadvaceti formuláři. Jak
ale celý výstup formuláře ošetřit skriptem? Skript bude
muset provést následující věci:
- Zjistit, zda album s daným názvem již neexistuje, pokud ano,
upozornit na to.
- Zadat album, zjistit si, jaké mu databáze přidělila číslo řádku v
tabulce alb
- Rozsekat seznam písní na jednotlivé písně
- Zjistit, zda tyto písně v databázi již jsou nebo ne; pokud nejsou
zapsat
- Přiřadit písně na album
Realizace
Skript zadejdiskografii.php tedy dozná mohutných změn. Bude
obsahovat čtvrtý formulář s jedním textovým polem pro zadání alba a s
dalším, víceřádkovým textovým polem pro zadání seznamu písní oddělených
koncem řádku. Rovněž část pro zpracování formuláře se nám poněkud
zvětší. Bude obsahovat především příkaz pro rozdělení jednotlivých
řádků do pole:
$pisne=explode("\r\n",$_POST["nazvynovychpisni"]);
a rovněž funkci pro kontrolu každé jedné písně na délku:
function
pisneok ($pisne)
{
$problem="";
foreach ($pisne as $pisen)
{
if ((strlen ($pisen)>50) | strlen ($pisen)<3) $problem.="Název písně musí mít
3-50 znaků ($pisen)<BR>\n";
}
echo $problem;
return (boolean)($problem==="");
}
Všimněte si, že tato funkce jednak vrací hodnotu TRUE nebo FALSE a
jednak vypisuje hlášení. Někteří programátoři razí teorii, že funkce by
měly pouze vracet hodnoty, zatímco příkazy echo by měly být umístěny
spíše v těle skriptu. Něco na tom je, ale pro nás by to znamenalo
vadnou píseň vypsat pomocí další funkce, což by bylo poměrně složité.
Název "vadné" písně bychom ale přece jen vypisovat měli, protože jinak
mezi několika či několika desítkami "dobrých" písní uživatel tu
"špatnou" bude obtížně hledat.
Skript dále obsahuje kontrolu toho, zda jsme vůbec zadali nějaké
písně, a to pomocí následujícího příkazu:
elseif
($_POST["nazvynovychpisni"]=="") echo "Musíte zadat nějaké písně";
Někoho by mohlo napadnout kontrolovat počet prvků pomocí funkce
count() pole $pisne, ale to by nefungovalo. Důvodem je fakt, že funkce
explode vrátí v případě, kdy "dělící" řetězec nebyl nalezen celý
původní "dělený" řetězec. To platí i pro prázdný řetězec a počet prvků
pole $pisne tak vždy bude nejméně jeden!
V další části skriptu se program pokusí přidat do databáze album
(což může selhat) a pokud to neselže, zapamatuje si číslo alba pomocí
funkce mysql_insert_id.
<?
mysql_query ("insert into alba (nazev) values ('".$_POST["nazevnovehoalba"]."');", $GLOBALS["link"]);
$chyba = mysql_error($GLOBALS["link"]);
if ($chyba==='') $albumid=mysql_insert_id();
else echo "Album NEBYLO
přidáno. Databáze vrátila chybu $chyba <BR>\n";
?>
Když i to skončí bez chyb, pustí se skript směle do zadávání písní.
U každé písně může nastat jedna ze dvou situací:
- Píseň v databázi ještě není, a program ji tedy zadá a zjistí její
číslo v tabulce písní
- Píseň v databázi již je, a program tedy zjistí její číslo v
tabulce písní
A konečně, pomocí čísla alba a čísla písně se již může založit řádek
v tabulce obsahyalb.
foreach
($pisne as $pisen)
{
$pisenid=pisenid($pisen);
if ($pisenid==0)
{
mysql_query ("insert into pisne
(nazev) values ('".$pisen."');", $GLOBALS["link"]);
$pisenid=mysql_insert_id();
}
mysql_query ("insert into obsahyalb
(album, pisen) values (".$albumid.",".$pisenid.");", $GLOBALS["link"]);
}
Závěr
Vidíme, že uvažovat jako uživatel někdy znamená, že si programátor
pořádně znepříjemní život. Nicméně, uživateli se taková aplikace bude
lépe ovládat a proto si bude programátora považovat. Rovněž jsme
viděli, že zadávat data do více tabulek znamená důsledněji kontrolovat
mezivýsledky.
Náš skript zapisoval do více tabulek najednou. To je přesně akce,
kdy bychom potřebovali jeden z následujících mechanizmů:
- aby databáze uměla převzít název alba a názvy písní, celé si to
odkontrolovat sama a uložit, co je potřeba
- aby databáze měla možnost BUĎ to celé provést NEBO to celé
neprovést, ale nic mezi tím
Tomu prvnímu se říká uložená procedura a MySQL je zatím bohužel
neumí. Tomu druhému se říká transsakce a MySQL je bohužel opět neumí. V
tomto bodě musíme dát za pravdu tvrzení, že například taková PostgreSQL
by se s uvedenou úlohou vypořádala mnohem snadněji. O PostgreSQL
píše na našem serveru MaReK
Olšavský, takže se o tom můžete něco dozvědět.
Příště se dozvíme něco o tom, jak tento skript ještě lépe vylepšit a
zabezpečit.
Změny na portálu
Na současný stav projektu se můžete na našem webu podívat
nebo si jej můžete stáhnout.
Pozn.: Aby Vám stažená verze
fungovala na lokálním stroji, upravte si hodnotu konstant SQL_HOST,
SQL_USERNAME, SQL_PASSWORD a SQL_DBNAME. Případně si je můžete včlenit
do konfiguračního souboru podobně, jako jsem to udělal v souboru
func.php.
Verze pro tisk
|
Příspívat do diskuze mohou pouze registrovaní uživatelé.
|
|
Vyhledávání software
Vyhledávání článků
28.11.2018 23:56 /František Kučera Prosincový sraz spolku OpenAlt se koná ve středu 5.12.2018 od 16:00 na adrese Zikova 1903/4, Praha 6. Tentokrát navštívíme organizaci CESNET. Na programu jsou dvě přednášky: Distribuované úložiště Ceph (Michal Strnad) a Plně šifrovaný disk na moderním systému (Ondřej Caletka). Následně se přesuneme do některé z nedalekých restaurací, kde budeme pokračovat v diskusi.
Komentářů: 1
12.11.2018 21:28 /Redakce Linuxsoft.cz 22. listopadu 2018 se koná v Praze na Karlově náměstí již pátý ročník konference s tématem Datová centra pro business, která nabídne odpovědi na aktuální a často řešené otázky: Jaké jsou aktuální trendy v oblasti datových center a jak je optimálně využít pro vlastní prospěch? Jak si zajistit odpovídající služby datových center? Podle jakých kritérií vybírat dodavatele služeb? Jak volit vhodné součásti infrastruktury při budování či rozšiřování vlastního datového centra? Jak efektivně datové centrum spravovat? Jak co nejlépe eliminovat možná rizika? apod. Příznivci LinuxSoftu mohou při registraci uplatnit kód LIN350, který jim přinese zvýhodněné vstupné s 50% slevou.
Přidat komentář
6.11.2018 2:04 /František Kučera Říjnový pražský sraz spolku OpenAlt se koná v listopadu – již tento čtvrtek – 8. 11. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma umění a technologie, IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
4.10.2018 21:30 /Ondřej Čečák LinuxDays 2018 již tento víkend, registrace je otevřená.
Přidat komentář
18.9.2018 23:30 /František Kučera Zářijový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 20. 9. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
9.9.2018 14:15 /Redakce Linuxsoft.cz 20.9.2018 proběhne v pražském Kongresovém centru Vavruška konference Mobilní řešení pro business.
Návštěvníci si vyslechnou mimo jiné přednášky na témata: Nejdůležitější aktuální trendy v oblasti mobilních technologií, správa a zabezpečení mobilních zařízení ve firmách, jak mobilně přistupovat k informačnímu systému firmy, kdy se vyplatí používat odolná mobilní zařízení nebo jak zabezpečit mobilní komunikaci.
Přidat komentář
12.8.2018 16:58 /František Kučera Srpnový pražský sraz spolku OpenAlt se koná ve čtvrtek – 16. 8. 2018 od 19:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát jsou tématem srazu databáze prezentaci svého projektu si pro nás připravil Standa Dzik. Dále bude prostor, abychom probrali nápady na využití IoT a sítě The Things Network, případně další témata.
Přidat komentář
16.7.2018 1:05 /František Kučera Červencový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 7. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát bude přednáška na téma: automatizační nástroj Ansible, kterou si připravil Martin Vicián.
Přidat komentář
Více ...
Přidat zprávičku
Poslední diskuze
31.7.2023 14:13 /
Linda Graham iPhone Services
30.11.2022 9:32 /
Kyle McDermott Hosting download unavailable
13.12.2018 10:57 /
Jan Mareš Re: zavináč
2.12.2018 23:56 /
František Kučera Sraz
5.10.2018 17:12 /
Jakub Kuljovsky Re: Jaký kurz a software by jste doporučili pro začínajcího kodéra?
Více ...
|