Jak se neztratit při vývoji rozsáhlejšího PHP projektu - databáze a fundované psaní kódu.
27.10.2004 15:00 | Petr Zajíc | přečteno 35093×
V předchozím díle našeho seriálu jsme nakousli téma vývoje
rozsáhlejších projektů. Dnes budeme pokračovat; řekneme si něco o
přípravě struktury databáze a o členění programu. Tyto věci je potřeba
udělat již v poměrně rané fázi vývoje, abyste měli jasno, kam se bude
Vaše aplikace ubírat.
Pokud aplikace má (a ona má skoro vždycky) nějaký vztah k databázi,
bývá dobrým zvykem navrhnout si, jak bude taková databáze vypadat. To
je velmi důležitá část přípravy. Není nic horšího než dodělávání
struktury databáze "za chodu", a to zejména mají-li se měnit relační
vztahy mezi tabulkami. Obecné pravidlo, jak to udělat "napoprvé a
dobře" pravděpodobně neexistuje. Ale jako příklad naznačíme, jak by se
mohla ubírat naše představivost při sestavování (dejme tomu) protálu
pro ON-LINE evidenci půjčování knížek z knihovny.
Pozn.: Musíte uznat, že to je daleko
méně otřepaný příklad než ON-LINE obchod.
Důležité je si uvědomit, že každá tabulka by měla shromažďovat data o jedné "entitě". Tento hrozný výraz zkrátka znamená, že budeme mít tabulku "knih", tabulku "čtenářů" a tabulku "výpůjček". V MySQL by návrh mohl vypadat nějak takto:
CREATE TABLE ctenari (
id int(11) NOT NULL auto_increment,
prijmeni varchar(20) NOT NULL default '',
jmeno varchar(10) default NULL,
PRIMARY KEY (id)
)
CREATE TABLE knihy (
id int(11) NOT NULL auto_increment,
nazev varchar(50) NOT NULL default '',
popis varchar(255) default NULL,
PRIMARY KEY (id)
)
CREATE TABLE vypujcky (
id int(11) NOT NULL auto_increment,
ctenar int(11) NOT NULL ,
kniha int(11) NOT NULL ,
datum_od date NOT NULL ,
PRIMARY KEY (id)
)
Bude to stačit? V případě, že budeme půjčovat jen jednu knihu, zcela
určitě to jako kostra stačit bude; pokud bychom najednou půjčovali více
knih, stojí za zvážení zřízení další tabulky, aby se nám udaj "půjčeno
od" neopakoval zbytečně v mnoha řádcích. Níže uveďme některé technické
zásady, které byste měli mít při tvorbě tabulek k dispozici:
Dobře napsanou funkci můžete použít vícekrát. A to i v mnoha projektech a v tom je kouzlo opakovaného používání kódu. Zvažme, například, následující kód pro ověření hesla, který bychom chěli využít v několika projektech:
<?
function overheslo
($uzivatel, $heslo)
{
mysql_connect("localhost", "root", "");
mysql_select_db("lsoft");
$vysledek=mysql_query("select * from hesla
where uzivatel=$uzivatel");
$radku=mysql_num_rows($vysledek);
if ($radku==0) return false;
else
{
$zaznam = MySQL_Fetch_Array($vysledek);
if ($zaznam["heslo"]==$heslo) return true; else return false;
}
}
?>
Poctivě řečeno, tato funkce moc dobře napsána není. V reálné aplikaci by pravděpodobně stačilo použít existující připojení k databázi, spíše než uvnitř těla funkce vytvářet nové (důvodem je to, že pravděpodobně už nějaké to připojení k databázi bude existovat, nebo by zanedlouho stejně vzniklo). Další problém je logický - nejprve zjišťujeme zda existuje uživatel a potom, zda má správně heslo. To by se dalo spojit do jednoho kroku. Třetí důvod proč to nepůjde použít je ten, že k funkci není žádná dokumentace. Po úpravě by to mohlo vypadat mnohem nadějněji (třeba takto):
<?
function overheslo
($link, $uzivatel, $heslo)
{
/*
funkce ověří heslo proti datům v tabulce hesel
vyžaduje:
$link - existující spojení na databázi
$uzivatel - id ověřovaného uživatele
$heslo - nešifrovaná podoba hesla
vrací:
TRUE v případě, že daný uživatel má dané heslo,
FALSE ve všech ostatních případech
*/
$vysledek=mysql_query("select * from hesla
where uzivatel=$uzivatel and heslo='".$heslo."'", $link);
return (boolean) mysql_num_rows($vysledek);
}
?>
Všimněte si (vím, že se opakuji), že kvalitní kód obsahuje komentáře. To proto, abyste se v něm vyznali, když jej budete za nějakou dobu chtít opravit - nebo znovupoužít. Toto téma je tak důležité, že mu věnujeme i část následujícího dílu.