Jak pracují databáze na Webu
Zpřístupnění databáze přes webové rozhraní

Jiří Kosek ml.

V minulém díle jsme si ukázali, jak přistupovat k databázi pomocí nativního ovladače v PHP. Rovněž jsme nakousli způsob připojení databáze přes rozhraní ODBC v ASP. Dnes dokončíme práci s ODBC v ASP a pak si ukážeme, jak využívat rozhraní ODBC v PHP. Předtím se ještě seznámíme s některými důvody, které hovoří pro používání ODBC při přístupu k databázím.

V ASP se již umíme připojit k databázi a provést v ní dotaz. Výsledek dotazu je nyní přístupný pomocí objektu vysledek. Při práci s databázemi přes ODBC nemůžeme přistupovat náhodně k libovolnému záznamu výsledku, ale musíme je procházet postupně. K pohybu na další záznam výsledku slouží metoda MoveNext. Pomocí metody EOF můžeme zjistit, zda výsledek obsahuje ještě nějaké nezpracované záznamy. K jednotlivým položkám aktuálního záznamu se dostaneme pomocí volání vysledek.fields("jméno_položky"). Skript pro vypsání obsahu tabulky vypadá v ASP následovně:

<HTML>
<HEAD>
<TITLE>Výpis všech zaměstnanců</TITLE>
</HEAD>
<BODY>
<H1>Výpis všech zaměstnanců</H1>
<TABLE BORDER=1 CELLPADDING=2>
<TR><TH>Osobní číslo</TH>
    <TH>Jméno</TH>
    <TH>Rodné číslo</TH>
    <TH>Adresa</TH>
    <TH>Plat</TH>
</TR>    
<%
Set spojeni = Server.CreateObject("ADODB.Connection")
spojeni.Open "DSN=test"
Set vysledek = Server.CreateObject("ADODB.Recordset")
vysledek.Open "SELECT * FROM Zamestnanci", spojeni
Do Until vysledek.EOF   
  Response.Write "<TR>" & vbNewLine 
  Response.Write "<TD ALIGN=CENTER>" 
  Response.Write vysledek.fields("OsobniCislo")
  Response.Write "</TD>" & vbNewLine 
  Response.Write "<TD>" & vysledek.fields("Jmeno")
  Response.Write "</TD>" & vbNewLine 
  Response.Write "<TD>" & vysledek.fields("RC")
  Response.Write "</TD>" & vbNewLine 
  Response.Write "<TD>" & vysledek.fields("Adresa")
  Response.Write "</TD>" & vbNewLine 
  Response.Write "<TD ALIGN=RIGHT>" 
  Response.Write vysledek.fields("Plat")
  Response.Write "</TD>" & vbNewLine 
  Response.Write "</TR>" & vbNewLine
  vysledek.MoveNext
Loop
%>
</TABLE>
</BODY>
</HTML>

Velkou výhodou ODBC je, že stejným způsobem můžeme přistupovat k libovolné databázi. Pokud se tedy z nějakého důvodu změní SQL-server, na kterém běží naše aplikace, nemusíme měnit v PHP-skriptech žádný kód. Stačí upravit mapování datových zdrojů na databáze v konfiguračním programu ODBC.

Počáteční nevýhodou, která mluvila proti použití ODBC, byl nižší výkon oproti nativním ovladačům. Staré ODBC ovladače sloužily pouze jako mezistupeň mezi aplikací a nativním protokolem databáze. Novější ODBC ovladač jsou však optimalizovány a k databázovému serveru přistupují přímo -- jejich výkon je srovnatelný s použitím nativních ovladačů.

Poslední otázka, která se nabízí, se týká využitelnosti ODBC na jiných platformách než jsou Windows. ODBC bylo původně vyvinuto pro platformu Windows, ale dnes jeho implementace existuje i pro všechny významnější verze operačního systému Unix.

Podívejme se nyní, jak se rozhraní ODBC používá v systému PHP. Názvy všechny funkcí pro práci s ODBC až neuvěřitelně začínají písmeny ODBC. Nejprve se musíme připojit k datovému zdroji pomocí funkce ODBC_Connect(). Ta má tři parametry -- jméno datového zdroje, jméno a heslo uživatele, pod kterým se ke zdroji připojujeme. Funkce vrací identifikátor spojení. Pokud se ke zdroji nelze připojit, vrací funkce hodnotu false.

Vrácení této hodnoty bychom měli vždy ošetřit, protože se může stát, že se nepodaří k databázovému serveru připojit. V našich skriptech bychom měli vždy testovat a ošetřit všechny možné chybové stavy -- jen tak se pozná dobře napsaná aplikace.

K provádění SQL-dotazů slouží funkce ODBC_Exec(). Jejími parametry jsou identifikátor spojení a SQL-dotaz. Funkce vrací výsledek dotazu. Pokud při provádění SQL-dotazu došlo k chybě, vrací funkce false -- další místo v našem skriptu, kde bychom měli testovat chyby.

K získání jedné řádky výsledku slouží funkce ODBC_Fetch_Row(vysledek). Funkce vrací true, pokud se podařilo získat další záznam. Pro přístup k položkám aktuálního záznamu slouží funkce ODBC_Result(vysledek, položka).

Výsledný skript je o něco delší než předchozí, protože jsme do něj přidali nezbytné ošetření chyb -- znovu opakuji, že by nemělo chybět v žádném skriptu.

<HTML>
<HEAD>
<TITLE>Výpis všech zaměstnanců</TITLE>
</HEAD>
<BODY>
<H1>Výpis všech zaměstnanců</H1>
<TABLE BORDER=1 CELLPADDING=2>
<TR><TH>Osobní číslo</TH>
    <TH>Jméno</TH>
    <TH>Rodné číslo</TH>
    <TH>Adresa</TH>
    <TH>Plat</TH>
</TR>    
<?
@$spojeni = ODBC_Connect("test", "", "");
if (!$spojeni):
  echo "<TR><TH COLSPAN=5>Nepodařilo se připojit
  		k databázi!</TH></TR>";
else:
  @$vysledek = ODBC_Exec($spojeni, 
                  "SELECT * FROM Zamestnanci");
  if (!$vysledek):                
    echo "<TR><TH COLSPAN=5>Chyba při provádění
    	  SQL-dotazu!</TH></TR>";
  else:
    while(ODBC_Fetch_Row($vysledek)):
      echo "<TR>\n";
      echo "<TD ALIGN=CENTER>". 
           ODBC_Result($vysledek, "OsobniCislo").
           "</TD>\n";
      echo "<TD>".ODBC_Result($vysledek, "Jmeno").
           "</TD>\n";
      echo "<TD>".ODBC_Result($vysledek, "RC").
            "</TD>\n";
      echo "<TD>".ODBC_Result($vysledek, "Adresa").
           "</TD>\n";
      echo "<TD ALIGN=RIGHT>".
           ODBC_Result($vysledek, "Plat").
           "</TD>\n";        
      echo "</TR>\n";
    endwhile;
  endif;  
  ODBC_Close($spojeni);
endif;
?>
</TABLE>
</BODY>
</HTML>
Zajímavostí je použití zavináče (@) před příkazy, které nemusí být vždy provedeny úspěšně. Zavináč potlačí vypsání chybového hlášení PHP, které může běžného uživatele zděsit. Lepší je chybu ošetřit po svém a uživatele informovat nějakým srozumitelným způsobem. Na obrázku 1 si můžete prohlédnout, jak stránka dopadne, když dojde k chybě a nepoužijeme zavináč.

Obr. 1: Standardní chybové hlášky by se nikdy neměly dostat k běžnému uživateli
Standardní chybové hlášky by se nikdy neměly dostat k běžnému uživateli

Do skriptu lze vložit libovolný SQL-příkaz a tak můžeme pomocí skriptů provádět s tabulkami v databázi libovolné operace. Nyní si ukážeme, jak můžeme přes webové rozhraní jednoduše přidávat nové záznamy do tabulky Zamestnanci. Nejprve vytvoříme formulář, který bude sloužit k zadání údajů o novém zaměstnanci uživatelem. Uložíme jej např. do souboru 15-02.php3:

<HTML>
<HEAD>
<TITLE>Přidání nového záznamu do tabulky Zamestnanci</TITLE>
</HEAD>
<BODY>
<H1>Přidání nového záznamu do tabulky Zamestnanci</H1>
<STRONG>Zadejte údaje o novém zaměstnanci:</STRONG>
<FORM ACTION=15-03.php3>
<TABLE>
<TR><TD>Osobní číslo:<TD><INPUT NAME=OsobniCislo>
<TR><TD>Jméno:<TD><INPUT NAME=Jmeno>
<TR><TD>Rodné číslo:<TD><INPUT NAME=RC>
<TR><TD>Adresa:<TD><INPUT NAME=Adresa>
<TR><TD>Plat:<TD><INPUT NAME=Plat>
<TR><TH COLSPAN=2><INPUT TYPE=Submit VALUE="Přidání zaměstnance">
</TABLE>
</FORM>
</BODY>
</HTML>
K obsluze formuláře slouží skript 15-03.php3, který obstará samotné vložení údajů z formuláře do tabulky:
<HTML>
<HEAD>
<TITLE>Přidání nového záznamu do tabulky 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,
    	        "INSERT INTO Zamestnanci VALUES(
       	          $OsobniCislo, '$Jmeno', '$RC',
       	          '$Adresa', $Plat)");
  if (!$vysledek):
    echo "<H1>Nový záznam se 
              nepodařilo přidat!</H1>";
  else: ?>
    <H1>Nový záznam byl úspěšně přidán</H1>
    <FORM ACTION=15-01.php3>
    <INPUT TYPE=Submit 
           VALUE="Prohlížení seznamu zaměstnanců">
    </FORM>
    <FORM ACTION=15-01.php3>
    <INPUT TYPE=Submit 
           VALUE="Přidání nového zaměstnance">
    </FORM>
<?
  endif;
  ODBC_Close($spojeni);
endif;
?>
</BODY>
</HTML>
Do stránky jsme navíc pomocí formulářů vložili dvě tlačítka, která slouží k vyvolání skriptu pro výpis obsahu naší tabulky resp. pro přidání dalšího zaměstnance.

Obr. 2: Formulář pro přidání nového záznamu
Formulář pro přidání nového záznamu

Obr. 3: Výstup skriptu pro přidání záznamu
Výstup skriptu pro přidání záznamu
© Jiří Kosek 1999