Jak pracujφ databßze na Webu
NßroΦn∞jÜφ manipulace s daty

Ji°φ Kosek ml.

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 = hodnota
P°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).

Obr. 1: Pohodln² zp∙sob, jak si vybrat zßznam urΦen² ke smazßnφ
Pohodln² zp∙sob, jak si vybrat zßznam urΦen² ke smazßnφ

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.

Obr. 2: Formulß° pro modifikaci zßznamu
Formulß° pro modifikaci zßznamu
Skript pro samotnΘ zapsßnφ zm∞n do tabulky m∙₧e vypadat t°eba takto:
<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.

© Ji°φ Kosek 1999