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.