Minule jsme si ukßzali, jak vypsat obsah tabulky a jak vytvo°it formulß° a skript pro p°idßvßnφ ·daj∙ do tabulky. Ka₧dß aplikace, kterß to s daty myslφ vß₧n∞, musφ nabφzet mnohem vφce -- mo₧nost data mazat, modifikovat Φi selektivn∞ prohledßvat. O tom vÜem bude dneÜnφ pokraΦovßnφ serißlu.
Kdy₧ umφme zßznamy p°idßvat, nebyla by na Ükodu mo₧nost i nepot°ebnΘ zßznamy mazat. Smazßnφ zßznamu je v SQL jednoduchß v∞c -- staΦφ znßt hodnotu primßrnφho klφΦe zßznamu, kter² chceme smazat, a vÜe vy°eÜφ p°φkaz ve tvaru:
DELETE FROM Zamestnanci WHERE OsobniCislo = hodnotaP°ed nßmi stojφ ·kol, jak od u₧ivatele zφskat osobnφ Φφslo zam∞stnance, kterΘho chce smazat. Jednou z mo₧nostφ, kterß je pom∞rn∞ u₧ivatelsky p°φtulnß, je dopln∞nφ naÜeho v²pisu obsahu tabulky o tlaΦφtka vyvolßvajφcφ smazßnφ jednotliv²ch zßznam∙ (viz obr. 1).
TlaΦφtka doplnφme jednoduÜe tak, ₧e do ka₧dΘho °ßdku tabulky p°idßme bu≥ku s mal²m formulß°em. Formulß° bude obsahovat pouze dv∞ pole -- tlaΦφtko pro odeslßnφ a skrytΘ pole, kterΘ bude slou₧it k p°enosu osobnφho Φφsla zam∞stnance, kterΘho chceme smazat. Do skriptu pro v²pis zam∞stnanc∙ z minulΘho dφlu p°idßme nßsledujφcφ p°φkaz:
echo "<TD><FORM ACTION=16-01.php3> <INPUT TYPE=HIDDEN NAME=OsobniCislo VALUE=". ODBC_Result($vysledek, "OsobniCislo")."> <INPUT TYPE=Submit VALUE=\"Smazat\"></TD></FORM>";Tak₧e pro prvnφ zßznam tabulky bude skriptem vygenerovßn formulß°φk:
<TD><FORM ACTION=16-01.php3> <INPUT TYPE=HIDDEN NAME=OsobniCislo VALUE=1023> <INPUT TYPE=Submit VALUE="Smazat"></TD></FORM>Pozorn² Φtenß° nynφ mo₧nß objevil malou nesrovnalost v HTML zßpisu -- k°φ₧φ se nßm elementy
TD
a FORM
. Pokud vÜak
ukonΦovacφ tagy uvedeme ve sprßvnΘm po°adφ
</FORM></TD>
, bude bu≥ka tabulky zv∞tÜena o
neesteticky velkΘ prßzdnΘ mφsto. Je to zp∙sobeno tφm, ₧e za konec
ka₧dΘho formulß°e se vklßdß kousek prßzdnΘho mφsta. P°ek°φ₧enφ element∙
tento neduh odstranφ. NeΦistΘ, leΦ o to ·Φinn∞jÜφ °eÜenφ.
Elegantn∞jÜφ °eÜenφ, kterΘ vÜak funguje jen v prohlφ₧eΦφch s dobrou
podporou kaskßdov²ch styl∙ (testovßno v MSIE 4.0), vyu₧φvß vlastnost
margin
, kterß ovliv≥uje velikost okraj∙:
<TD><FORM ACTION=16-01.php3 STYLE="margin: 0px"> <INPUT TYPE=HIDDEN NAME=OsobniCislo VALUE=1023> <INPUT TYPE=Submit VALUE="Smazat"></FORM></TD>Pokud naleznete elegantn∞jÜφ a vÜeobecn∞ pou₧itelnΘ °eÜenφ tohoto problΘmu, dejte mi v∞d∞t. Rßd se o n∞ pod∞lφm s ostatnφmi Φtenß°i.
Samotn² skript pro smazßnφ zßznamu je obdobou skriptu pro p°idßnφ novΘho
zßznamu. Pouze se liÜφ provßd∞n² SQL-p°φkaz. Skript obdr₧φ osobnφ Φφslo
zam∞stnance urΦenΘho k v²mazu v prom∞nnΘ $OsobniCislo
.
<HTML> <HEAD> <TITLE>Smazßnφ zßznamu</TITLE> </HEAD> <BODY> <? @$spojeni = ODBC_Connect("test", "", ""); if (!$spojeni): echo "<H1>Nepoda°ilo se p°ipojit k databßzi!</H1>"; else: @$vysledek = ODBC_Exec($spojeni, "DELETE FROM Zamestnanci WHERE OsobniCislo = $OsobniCislo"); if (!$vysledek): echo "<H1>Zßznam se nepoda°ilo smazat!</H1>"; else: ?> <H1>Zßznam byl ·sp∞Ün∞ smazßn</H1> <FORM ACTION=15-04.php3> <INPUT TYPE=Submit VALUE="Prohlφ₧enφ seznamu zam∞stnanc∙"> </FORM> <? endif; ODBC_Close($spojeni); endif; ?> </BODY> </HTML>Nynφ nßs Φekß ·kol na prvnφ pohled nejnßroΦn∞jÜφ -- umo₧nit u₧ivateli m∞nit stßvajφcφ ·daje o zam∞stnancφch. Prvnφm krokem bude vytvo°enφ tlaΦφtka, kterΘ vyvolß modifikaci urΦitΘho zßznamu. TlaΦφtko p°idßme k tabulce s v²pisem stejn²m zp∙sobem jako jsme p°idali tlaΦφtko pro mazßnφ. Stisk tlaΦφtka vÜak nynφ vyvolß formulß° (
16-
02.php3
), kter² bude slou₧it pro modifikaci zßznamu. Jak takov²
formulß° m∙₧e vypadat? Velice podobn∞ jako formulß° pro zadßnφ novΘho
zßznamu -- jen se v n∞m zobrazφ ·daje z aktußln∞ vybranΘho zßznamu a
bude umo₧n∞na jejich editace. U₧ivateli umo₧nφme editovat vÜechny ·daje
krom∞ primßrnφho klφΦe (osobnφho Φφsla). Pokud bychom umo₧nili i zm∞nu
primßrnφho klφΦe, museli bychom oÜet°it spoustu v∞cφ: zda ji₧ takov²
primßrnφ klφΦ neexistuje, zda se zm∞nou klφΦe neporuÜφ vazby na jinΘ
tabulky, kde je primßrnφ klφΦ v roli cizφho klφΦe apod.
<HTML> <HEAD> <TITLE>Modifikace zßznamu v tabulce Zamestnanci</TITLE> </HEAD> <BODY> <? @$spojeni = ODBC_Connect("test", "", ""); if (!$spojeni): echo "<H1>Nepoda°ilo se p°ipojit k databßzi!</H1>"; else: @$vysledek = ODBC_Exec($spojeni, "SELECT * FROM Zamestnanci WHERE OsobniCislo = $OsobniCislo"); if (!$vysledek || !ODBC_Fetch_Row($vysledek)): echo "<H1>Zßznam se nepoda°ilo najφt!</H1>"; else: $Jmeno = ODBC_Result($vysledek, "Jmeno"); $RC = ODBC_Result($vysledek, "RC"); $Adresa = ODBC_Result($vysledek, "Adresa"); $Plat = ODBC_Result($vysledek, "Plat"); ?> <H1>Modifikace zßznamu v tabulce Zamestnanci</H1> <STRONG>Opravte ·daje o zam∞stnanci:</STRONG> <FORM ACTION=16-03.php3> <TABLE> <TR><TD>Osobnφ Φφslo: <TD><?echo $OsobniCislo?> <INPUT TYPE=HIDDEN NAME=OsobniCislo VALUE=<?echo $OsobniCislo?>> <TR><TD>JmΘno: <TD><INPUT NAME=Jmeno VALUE="<?echo $Jmeno?>"> <TR><TD>RodnΘ Φφslo: <TD><INPUT NAME=RC VALUE="<?echo $RC?>"> <TR><TD>Adresa: <TD><INPUT NAME=Adresa VALUE="<?echo $Adresa?>"> <TR><TD>Plat: <TD><INPUT NAME=Plat VALUE="<?echo $Plat?>"> <TR><TH COLSPAN=2> <INPUT TYPE=Submit VALUE="Zapsßnφ zm∞n"> </TABLE> </FORM> <? endif; ODBC_Close($spojeni); endif; ?> </BODY> </HTML>V²sledek naÜeho sna₧enφ p°inßÜφ obrßzek 2. U₧ivatel m∙₧e ·daje zm∞nit a odeslat je. My tedy jeÜt∞ musφme vytvo°it skript, kter² zm∞nu ·daj∙ promφtne do tabulky. S v²hodou k tomu vyu₧ijeme SQL-p°φkaz
UPDATE
.
<HTML> <HEAD> <TITLE>Zm∞na zßznamu v tabulce Zamestnanci</TITLE> </HEAD> <BODY> <? @$spojeni = ODBC_Connect("test", "", ""); if (!$spojeni): echo "<H1>Nepoda°ilo se p°ipojit k databßzi!</H1>"; else: @$vysledek = ODBC_Exec($spojeni, "UPDATE Zamestnanci SET Jmeno = '$Jmeno', RC = '$RC', Adresa = '$Adresa', Plat = $Plat WHERE OsobniCislo = $OsobniCislo"); if (!$vysledek): echo "<H1>Zßznam se nepoda°ilo zm∞nit!</H1>"; else: ?> <H1>Zßznam byl ·sp∞Ün∞ zm∞n∞n</H1> <FORM ACTION=15-04.php3> <INPUT TYPE=Submit VALUE="Prohlφ₧enφ seznamu zam∞stnanc∙"> </FORM> <? endif; ODBC_Close($spojeni); endif; ?> </BODY> </HTML>Poslednφ v∞cφ, o kterΘ se zmφnφme v souvislosti s databßzemi, je mo₧nost vyhledßvßnφ. P°edstavme si, ₧e v naÜφ tabulce o zam∞stnancφch je n∞kolik stovek Φi tisφc∙ zßznam∙. Pokud si tabulku nechßme jen tak vypsat celou v prohlφ₧eΦi, zφskßme nep°ehledn² dlouh² seznam, kter² se navφc bude natahovat nep°im∞°en∞ dlouho. ╪eÜenφm je vytvo°enφ jednoduchΘho formulß°e, kter² u₧ivateli umo₧nφ zadat prvnφch pßr pφsmen ze jmΘna zam∞stnance a skript pak zobrazφ pouze vyhovujφcφ zßznamy:
<HTML> <HEAD> <TITLE>Prohledßvßnφ seznamu zam∞stnanc∙</TITLE> </HEAD> <BODY> <H1>Prohledßvßnφ seznamu zam∞stnanc∙</H1> <FORM ACTION="16-04.php3"> Zadejte zaΦßtek jmΘna zam∞stnance: <INPUT NAME=Jmeno VALUE="<?echo $Jmeno?>"> <INPUT TYPE=Submit VALUE="Hledej"> </FORM> <HR> <? if ($Jmeno!=""): @$spojeni = ODBC_Connect("test", "", ""); if (!$spojeni): echo "Nepoda°ilo se p°ipojit k databßzi."; else: @$vysledek = ODBC_Exec($spojeni, "SELECT * FROM Zamestnanci WHERE Jmeno like '$Jmeno%'"); if (!$vysledek): echo "Chyba p°i provßd∞nφ dotazu v databßzi"; else: echo "PoΦet nalezen²ch zam∞stnanc∙: ". ODBC_Num_Rows($vysledek)."<BR>\n"; ...Vypsßnφ v²sledk∙ dotazu, to u₧ umφme... endif; ODBC_Close($spojeni); endif; endif; ?> </BODY> </HTML>Zajφmavostφ m∙₧e b²t pou₧itφ operßtoru
LIKE
v p°φkazu
SELECT
. V parametru LIKE
, kter² urΦuje °et∞zec
k porovnßnφ m∙₧eme pou₧φt znak `%
', kter² zastupuje
libovoln² poΦet libovoln²ch znak∙. Tφm dosßhneme toho, ₧e v²sledkem
dotazu budou pouze ty zßznamy, jejich₧ atribut Jmeno
zaΦφnß
na °et∞zec ulo₧en² v prom∞nnΘ $Jmeno
.
Poslednφ skripty, kterΘ pracovaly s databßzemi, jsou u₧ p°ece jen delÜφ. Ne v₧dy jsme je tedy mohli na strßnkßch Computerworldu uvΘst celΘ. Proto jsem pro vßs na Web umφstil kompletnφ zdrojovΘ texty poslednφho p°φkladu pro prßci s tabulkou zam∞stnanci. Naleznete je na strßnkßch serißlu http://www.kosek.cz/clanky/iweb/.
P°φÜt∞ naÜe povφdßnφ o skriptech ukonΦφme. Ale nebojte se, neΦekß nßs strßnka plnß sentimentu, ale mnoho u₧iteΦn²ch informacφ a praktick²ch ukßzek.