Na Φtenß°e nejsou kladeny ₧ßdnΘ zvlßÜtnφ nßroky. StaΦφ, kdy₧ ovlßdß jazyk HTML a zßklady prßce se systΘmem PHP3. Znalost jazyka SQL nenφ v∙bec na Ükodu, ale nenφ nezbytn∞ nutnß.
Tato fßze v₧dy sestßvß z vytvo°enφ datovΘho modelu, kter² popisuje vztahy mezi jednotliv²mi entitami. Z tohoto modelu takΘ vyΦteme jakΘ tabulky budou v databßzi, jakΘ budou primßrnφ klφΦe v jednotliv²ch tabulkßch, jakΘ jsou vztahy mezi tabulkami, jakß platφ integritnφ omezenφ atd.
Na rozebφrßnφ datovΘho modelovßnφ zde nenφ prostor. My si vÜe ukß₧eme na jednoduchΘ ·loze, kde si bez n∞j vystaΦφme. Pro slo₧it∞jÜφ systΘmy je vÜak d∙kladnß anal²za nezbytnß. Pot°ebnΘ znalosti lze zφskat nap°. v kurzu IT_360 -- Databßze. Zde se mimo jinΘ i d∙kladn∞ seznßmφte s jazykem SQL.
MySQL umo₧≥uje na jednom poΦφtaΦi pracovat s vφce databßzemi. Ka₧dß databßze pak m∙₧e obsahovat n∞kolik tabulek, kterΘ mohou, ale nemusφ, b²t navzßjem provßzßny. V²pis vÜech databßzφ ulo₧en²ch v systΘmu zφskßme pomocφ p°φkazu:
mysqlshowKa₧d² mßte k dispozici databßzi, jejφ₧ jmΘno odpovφdß vaÜemu u₧ivatelskΘmu jmΘnu. Pokud se chceme podφvat, jakΘ tabulky databßze obsahuje, pou₧ijeme p°φkaz:
mysqlshow jmΘno_databßzeK samotnΘ prßci s databßzφ slou₧φ p°φkaz
mysql
. Po jeho
spuÜt∞nφ m∙₧eme pomocφ p°φkazovΘ °ßdky zadßvat SQL p°φkazy, kterΘ se
majφ provΘst. Jako parametr programu se zadßvß jmΘno databßze, se kterou
chceme pracovat. P°φkazovou °ßdku programu ukonΦφme pomocφ p°φkazu
quit
.
mysql xaaabnnxaaabnn je p°itom naÜe u₧ivatelskΘ jmΘno a tedy i jmΘno databßze. K vytvo°enφ novΘ tabulky v databßzi slou₧φ SQL p°φkaz
create table
. Jeho syntaxe je nßsledujφcφ:
create table jmΘno_tabulky (jmΘno_polo₧ky typ_polo₧ky, ... )P°ehled nejb∞₧n∞jÜφch datov²ch typ∙ p°inßÜφ tabulka.
Typ | Popis |
---|---|
int | celΘ Φφslo |
float | Φφslo s pohyblivou °ßdovou Φßrkou |
varchar(n) | textov² °et∞zec o maximßlnφ dΘlce n |
date | datum ve tvaru RRRR-MM-DD |
time | Φas ve tvaru HH:MM:SS |
My vytvo°φme tabulku adresar
se Φty°mi polo₧kami jmΘno,
p°φjmenφ, e-mail a datum narozenφ. Pro usnadn∞nφ dalÜφch operacφ p°idßme
do tabulky i pßtou polo₧ku, kterou bude jedineΦnΘ identifikaΦnφ Φφslo
zßznamu (primßrnφ klφΦ). Toto Φφslo deklarujeme tak, ₧e se bude u
ka₧dΘho novΘho zßznamu automaticky zvyÜovat -- MySQL pohlφdß, aby m∞l
ka₧d² zßznam toto Φφslo unikßtnφ.
create table adresar (id int auto_increment primary key, jmeno varchar(15), prijmeni varchar(15), email varchar(40), narozen date);D∙le₧it² je st°ednφk na konci, kter²m se odesφlajφ p°φkazy MySQL k provedenφ.
O tom, ₧e se tabulka skuteΦn∞ vytvo°ila, se m∙₧eme p°esv∞dΦit pomocφ
p°φkazu mysqldump xaaabnn
(p°φkaz musφ b²t zadßn na
p°φkazovou °ßdku shellu, ne v prost°edφ programu mysql
).
mysql
m∙₧eme do databßze p°idßvat i novΘ
zßznamy. K p°idßnφ novΘho zßznamu do tabulky s N polo₧kami
slou₧φ v SQL p°φkaz insert into
:
insert into jmΘno_tabulky values (hodnota1, ..., hodnotaN)My do tabulky p°idßme informace o panu Novßkovi:
insert into adresar values (0, 'Jan', 'Novßk', 'Jan.Novak@mail.cz', '1965-08-25');Nula na mφst∞
id
zp∙sobφ automatickΘ generovßnφ jedineΦnΘho
id
. Obdobn²m zp∙sbem m∙₧eme p°idat i dalÜφ zßznamy. Vidφme,
₧e tento zp∙sob nenφ zrovna dvakrßt u₧ivatelsky p°φjemn² -- dobrß
motivace pro vytvo°enφ snadno ovladatelnΘho WWW rozhranφ k tabulce.
select
.
Pokud chceme vypsat obsah celΘ tabulky, zadßme p°φkaz:
select * from jmΘno_tabulkyObsah naÜφ tabulky si tedy m∙₧eme ov∞°it pomocφ:
select * from adresar;Informace lze vybφrat i selektivn∞. Podmφnka, kterß musφ pro vybranΘ zßznamy platit, se uvßdφ za klφΦovΘ slovo
where
. P°φklady
selektivnφch dotaz∙:
select * from adresar where prijmeni like 'Novßk'; select * from adresar where email = 'jkj@sorry.vse.cz'; select * from adresar where prijmeni = 'Prochßzka' and jmeno = 'Karel'; select * from adresar where prijmeni like 'Pro%';Znak '%' mß ve vyhledßvacφm °et∞zci za operßtorem
like
specißlnφ v²znam -- nahrazuje libovolnou sekvenci znak∙.
delete from
.
Zßznamy, kterΘ chceme smazat, musφme urΦit podmφnkou v klauzuli
where
:
delete from jmΘno_tabulky where podmφnkaPraktickß ukßzka smazßnφ zßznamu, jeho₧ identifikaΦnφ Φφslo je t°i:
delete from adresar where id=3;
update
:
update jmΘno_tabulky set polo₧ka=hodnota, ... where podmφnkaTen modifikuje vÜechny zßznamy, kterΘ vyhovujφ podmφnce. Pokud chceme m∞nit pouze jeden zßznam -- to je ostatn∞ nejtypiΦt∞jÜφ p°φklad -- je vhodnΘ jako podmφnku uvΘst test primßrnφho klφΦe na jedineΦnou hodnotu:
update adresar set email="novak@ini.cz" where id=37;P°φkaz zm∞nφ mailovou adresu u₧ivatele, kter² je v adresß°i veden pod identifikaΦnφm Φφslem 37.
drop table jmΘno_tabulkyDejte si na tuto operaci pozor. Tabulka je smazßna nenßvratn∞.
mysql
. P°ed ka₧dou komunikacφ se serverem je pot°eba se
k n∞mu p°ipojit a po skonΦenφ prßce se zase odpojit. TypickΘ schΘma
prßce s MySQL v PHP3 tedy vypadß takto:
<? mysql_Connect("localhost")?> prßce s databßzφ <? mysql_Close()?>
select
. V PHP mßme k dispozici funkci
mysql(jmΘno_databßze, SQL_p°φkaz)
,
kterß jako v²sledek vracφ v²sledek SQL p°φkazu.
V p°φpad∞ p°φkazu select
je v²sledkem seznam zßznam∙.
Funkce v tomto p°φpad∞ vracφ ukazatel na seznam zßznam∙. Tyto zßznamy
jsou pak dßle p°φstupnΘ pomocφ dalÜφch funkcφ. P°φklad dotazu v PHP:
<? $result = mysql("xaaabnn", "select * from adresar"); ?>PoΦet zßznam∙, kterΘ jsou v²sledkem poslednφho dotazu, m∙₧eme zjistit pomocφ funkce
mysql_NumRows($result)
. Pon∞kud ucelen∞jÜφ
ukßzka:
<? mysql_Connect("localhost"); $result = mysql("xaaabnn", "select * from adresar"); $pocet = mysql_NumRows($result); echo "V tabulce adresar je $pocet zßznam∙."; mysql_Close(); ?>JednotlivΘ polo₧ky zßznam∙, kterΘ jsou v²sledkem dotazu, jsou p°φstupnΘ pomocφ funkce
mysql_Result()
. Ta mß t°i parametry:
mysql_Result($result, Φφslo_zßznamu, polo₧ka)Poznamenejme, ₧e zßznamy jsou Φφslovßny od 0. Pokud bychom tedy cht∞li vypsat obsah celΘ tabulky adresar, m∙₧eme na strßnku za°adit nßsledujφcφ k≤d:
<? mysql_Connect("localhost"); $result = mysql("xaaabnn", "select * from adresar"); $pocet = mysql_NumRows($result); echo "V tabulce adresar je $pocet zßznam∙."; echo "<P>"; $i = 0; while ($i<$POCET): EMAIL ) ENDWHILE; MYSQL_RESULT($RESULT, + , <BR>Ve smyΦce bychom mohli kolem dat z databßze umφstit nap°φklad HTML tagy pro vytvo°enφ tabulky a v²sledky tak prezentovat v p°ehlednΘ tabulce.
Pokud ji₧ nepot°ebujeme s v²sledkem dotazu dßle pracovat, je vhodnΘ
uvolnit pam∞¥, ve kterΘ je v²sledek ulo₧en. To provedeme volßnφm funkce
mysql_FreeResult($result)
.
Pokud v²sledkem volßnφ funkce mysql()
nenφ seznam
zßznam∙ (nap°. po SQL p°φkazech update
, delete
nebo insert
), vracφ funkce 0. Pokud p°i provßd∞nφ SQL
p°φkazu doÜlo k chyb∞, vratφ funkce hodnotu -1.
PoΦet zßznam∙, kter²ch se dotklo provedenφ operace
update
, delete
nebo insert
, vracφ
funkce mysql_Affected_Rows()
.
$jmeno
,
$prijmeni
, $email
a $narozen
mßme
ulo₧eny informace o Φlov∞ku, kterΘho chceme do adresß°e p°idat. Do
prom∞nn²ch se ·daje mohly dostat nap°φklad z formulß°e, kter² vyplnil
u₧ivatel. Strßnka, kterß tento formulß° obsluhuje, pak bude obsahovat
tento k≤d pro p°idßnφ novΘho zßznamu do tabulky:
<? mysql_Connect("localhost"); $result = mysql("xaaabnn", "insert into adresar values (0, '$jmeno', '$prijmeni', " + "'$email', '$narozen')"); if ($result==0): echo "Do adresß°e byl ·sp∞Ün∞ p°idßn nov² zßznam."; else: echo "A sakra! Nov² zßznam se do adresß°e nepoda°ilo p°idat."; endif; mysql_Close(); ?>
$id
. Vymazßnφ pak v PHP provedeme
takto:
<? mysql_Connect("localhost"); $result = mysql("xaaabnn", "delete from adresar where id=$id"); if ($result==0): echo "Zßznam se poda°ilo ·sp∞Ün∞ vymazat."; else: echo "Zßznam nelze vymazat, do povrchu pevnΘho disku je vyryt."; endif; mysql_Close(); ?>
$id
znßme, chceme
zm∞nit e-mailovou adresu na hodnotu prom∞nnΘ $email
:
<? mysql_Connect("localhost"); $result = mysql("xaaabnn", "update adresar set email='$email' where id=$id"); if ($result==0): echo "Zßznam se poda°ilo ·sp∞Ün∞ aktualizovat."; else: echo "Zßznam nelze aktualizovat, do povrchu pevnΘho disku je vyryt."; endif; mysql_Close(); ?>
.phtml
strßnek implementovat aplikaci pro prßci s
adresß°em.
index.phtml
.
Ve filtru m∙₧eme pou₧φvat hv∞zdiΦku pro nahrazenφ libovolnΘ sekvence znak∙. V PHP pak vÜechny hv∞zdiΦky p°evedeme na znak '%', kter² se pou₧φvß v SQL pro zastoupenφ libovolnΘ skupiny znak∙.
Kdy₧ generujeme v²pis adresß°e, p°idajφ se ke ka₧dΘmu zßznamu dva
odkazy, kterΘ vedou na strßnky zajiÜ¥ujφcφ zm∞nu a smazßnφ zßznamu.
Odkazy majφ v sob∞ rovnou zakomponovßno id
zßznamu, kterΘho
se operace t²kß.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> <HTML> <HEAD> <TITLE>Adresar - Uvodni stranka</TITLE> </HEAD> <BODY> <H1>Adresar - vyhledavani</H1> <H2>Zadejte filtr pro hledani v databazi:</H2> <? /* Pocatecni prihlaseni ke strance ? */ if ($jmeno=="" && $prijmeni=="" && $email=="" && $narozen=="") { $firsttime="true"; }; /* Inicializace filtru pro prazdna pole */ if ($jmeno=="") { $jmeno="*"; }; if ($prijmeni=="") { $prijmeni="*"; }; if ($email=="") { $email="*"; }; if ($narozen=="") { $narozen="*"; }; ?> <FORM ACTION=index.phtml METHOD=GET> <TABLE> <TR><TD>Jmeno: <TD><INPUT TYPE=TEXT NAME=jmeno VALUE="<?echo $jmeno?>" SIZE=40> <TR><TD>Prijmeni:<TD><INPUT TYPE=TEXT NAME=prijmeni VALUE="<?echo $prijmeni?>" SIZE=40> <TR><TD>E-mail: <TD><INPUT TYPE=TEXT NAME=email VALUE="<?echo $email?>" SIZE=40> <TR><TD>Narozen:<TD><INPUT TYPE=TEXT NAME=narozen VALUE="<?echo $narozen?>" SIZE=10> </TABLE> <BR><INPUT TYPE=SUBMIT VALUE="Prohledej adresar"> </FORM> <FORM ACTION=new.phtml METHOD=GET> <INPUT TYPE=SUBMIT VALUE="Pridej novou adresu"> </FORM> <? if ($firsttime!="true"): ?> <HR> <H2>Vysledky prohledavani</H2> <TABLE> <TR><TH>Jmeno<TH>Email<TH>Datum narozeni<TH>Uprava<TH>Smazani <? mysql_Connect("localhost"); /* prevod * na % pro operator like */ $_jmeno = ereg_replace("\*", "%", $jmeno); $_prijmeni = ereg_replace("\*", "%", $prijmeni); $_email = ereg_replace("\*", "%", $email); $_narozen = ereg_replace("\*", "%", $narozen); $result = mysql("jkj", "select * from adresar where " + "jmeno like '$_jmeno' and prijmeni like '$_prijmeni' and " + "email like '$_email' and narozen like '$_narozen'"); $num = mysql_NumRows($result); if ($num==0): echo "<TR><TH COLSPAN=5>Dotazu nevyhovuje zadna adresa!\n"; else: $i = 0; while ($i<$num): echo "<TR><TD>" + mysql_Result($result, $i, "jmeno") + " " + mysql_Result($result, $i, "prijmeni"); echo "<TD>" + mysql_Result($result, $i, "email"); echo "<TD>" + mysql_Result($result, $i, "narozen"); echo "<TD><A HREF='edit.phtml?id=" + mysql_Result($result, $i, "id") + "'>Uprav</A>"; echo "<TD><A HREF='delete.phtml?id=" + mysql_Result($result, $i, "id") + "'>Smaz</A>"; $i++; endwhile; endif; mysql_Close(); ?> </TABLE> <? endif; ?> </BODY> </HTML>
add.html
-- ten se postarß o samotnΘ p°idßnφ zßznamu do
tabulky.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> <HTML> <HEAD> <TITLE>Adresar - Pridani nove adresy</TITLE> </HEAD> <BODY> <H1>Adresar - pridani nove adresy</H1> <H2>Zadejte novou adresu:</H2> <FORM ACTION=add.phtml METHOD=GET> <TABLE> <TR><TD>Jmeno: <TD><INPUT TYPE=TEXT NAME=jmeno SIZE=40> <TR><TD>Prijmeni:<TD><INPUT TYPE=TEXT NAME=prijmeni SIZE=40> <TR><TD>E-mail: <TD><INPUT TYPE=TEXT NAME=email SIZE=40> <TR><TD>Narozen:<TD><INPUT TYPE=TEXT NAME=narozen SIZE=10> </TABLE> <BR><INPUT TYPE=SUBMIT VALUE="Pridej adresu"> </FORM> <FORM ACTION=index.phtml METHOD=GET> <INPUT TYPE=SUBMIT VALUE="Zpet"> </FORM> </BODY> </HTML>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> <HTML> <HEAD> <TITLE>Adresar - Vysledek pridani adresy</TITLE> </HEAD> <BODY> <? mysql_Connect("localhost"); $result = mysql("jkj", "insert into adresar values (0, '$jmeno'," + "'$prijmeni', '$email', '$narozen')"); if ($result==0): echo "<H1>Nova adresa byla uspesne pridana</H1>"; else: echo "<H1>Novou adresu se nepodarilo pridat</H1>"; endif; mysql_Close(); ?> <A HREF=index.phtml>Adresar</A> </BODY> </HTML>
id
:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> <HTML> <HEAD> <TITLE>Adresar - Vysledek smazani adresy</TITLE> </HEAD> <BODY> <? mysql_Connect("localhost"); $result = mysql("jkj", "delete from adresar where id=$id"); if ($result==0): echo "<H1>Adresa byla uspesne smazana.</H1>"; else: echo "<H1>Adresu se nepodarilo smazat.</H1>"; endif; mysql_Close(); ?> <A HREF=index.phtml>Adresar</A> </BODY> </HTML>
id
. Po ·pravßch se obsah formulß°e odeÜle skriptu
update.phtml
, kter² se postarß o zm∞nu zßznamu v tabulce.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> <HTML> <HEAD> <TITLE>Adresar - Zmena adresy</TITLE> </HEAD> <BODY> <H1>Adresar - Zmena adresy</H1> <H2>Opravte udaje v adrese:</H2> <? mysql_Connect("localhost"); $result = mysql("jkj", "select * from adresar where id='$id'"); $jmeno = mysql_Result($result, 0, "jmeno"); $prijmeni = mysql_Result($result, 0, "prijmeni"); $email = mysql_Result($result, 0, "email"); $narozen = mysql_Result($result, 0, "narozen"); mysql_Close(); ?> <FORM ACTION=update.phtml METHOD=GET> <TABLE> <TR><TD>Jmeno: <TD><INPUT TYPE=TEXT NAME=jmeno VALUE="<?echo $jmeno>" SIZE=40> <TR><TD>Prijmeni:<TD><INPUT TYPE=TEXT NAME=prijmeni VALUE="<?echo $prijmeni>" SIZE=40> <TR><TD>E-mail: <TD><INPUT TYPE=TEXT NAME=email VALUE="<?echo $email>" SIZE=40> <TR><TD>Narozen:<TD><INPUT TYPE=TEXT NAME=narozen VALUE="<?echo $narozen>" SIZE=10> </TABLE> <BR><INPUT TYPE=HIDDEN NAME=id VALUE=<?echo $id>> <INPUT TYPE=SUBMIT VALUE="Proved zmenu udaju"> </FORM> <FORM ACTION=index.phtml METHOD=GET> <INPUT TYPE=SUBMIT VALUE="Zpet"> </FORM> </BODY> </HTML>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> <HTML> <HEAD> <TITLE>Adresar - Vysledek zmeny adresy</TITLE> </HEAD> <BODY> <? mysql_Connect("localhost"); $result = mysql("jkj", "update adresar set jmeno='$jmeno', " + "prijmeni='$prijmeni', email='$email', narozen='$narozen' " + "where id=$id"); if ($result==0): echo "<H1>Adresa byla uspesne zmenena.</H1>"; else: echo "<H1>Adresu se nepodarilo zmenit.</H1>"; endif; mysql_Close(); ?> <A HREF=index.phtml>Adresar</A> </BODY> </HTML>