Poslední úprava: Zmena kodovani cestiny

Výstup z Postgres95/PostgreSQL na WWW

Tato stránka se zabývá způsoby, jak získat data z Postgresovské databáze a následně je zobrazit na WWW, případně jak data do datadabáze prostřednictvím webu vložit. Pokusím se shrnout možnosti jak lze toto udělat.

Možné způsoby (pokud vím) jsou:

Druhý přístup rozeberu podrobněji a budu ho prezentovat formou příkladů na tabulce pg_user, která je v každé instalaci Postgresu.

U každého příkladu PHP/FI dokumentu vždy naleznete odkaz na stránku, která obsahuje stejné řádky jako příklad. Tím se můžete podívat na výsledek zpracovaného dokumentu. Samozřejmě bude následovat stručný popis příkladu.

Přístup pomocí CGI skriptů

Tato metoda spočívá v tom, že si napíšete vlastní CGI skripty, které využijí možnosti, že program psql umí provádět výstup do jazyka HTML. (Pozor! Tato možnost je k dispozici pouze v PostgreSQL).
Vyzkoušejte příkaz:
psql -H -c "select * from pg_user"
Pokud umíte psát CGI skripty a formuláře v HTML můžete začít pracovat.

Přístup pomocí PHP/FI

PHP/FI (Personal Home Page/Form Interpreter) je rozšíření jazyka HTML o nástroje, kterými se snáze vytvářejí HTML dokumenty. Důležitou vlastností je podpora pro zpracování formulářů. Navíc PHP/FI poskytuje podporu pro přístup k rozličným batabázím z nichž jedna je Postgres95/PostgreSQL. Podrobné informace naleznete na domovské stránce PHP/FI nebo v manuálu k PHP/FI na Aise.

Já se budu věnovat jen nejzákladnějším věcem, které je potřeba udělat, abyste se mohli připojit na Postgres a uvedu jednoduchou aplikaci, která předvede základní operace s databází.

PHP/FI rozšiřuje HTML o značky typu:

<? příkazy PHP/FI oddělené středníkem>

To znamená, že před zobrazením PHP/FI dokumentu se musí spustit nějaký program, který tyto značky zpracuje. Tímto programem může být

První možnost má tu výhodu, že se zpracováním nezatěžuje www server. Druhý zase tu výhodu, že se v PHP/FI napsaný soubor doručí klientovi jako čistý HTML dokument. Což znamená, že se klient nemůže dozvědět, jak původní PHP/FI stránka vypadala (vypadá). Ovšem mnohem silnější argument pro použití druhého způsobu je, co jiného, než bezpečnost. CGI verze PHP/FI nečte soubor .htaccess ve vašem adresáři. To znamená, že pokud máte nějaké soubory chráněné pomocí mechanismu .htaccess, lze toto obejít tak, že dotyčné soubory natáhnete přes PHP/FI.

PHP/FI na vašem systému instalováno, stačí vědět jestli jako CGI sript nebo jako modul. Při prvním způsobu je nutné uvádět odkazy na PHP/FI dokumenty nasledujícím způsobem:
http://vaše.doména/cgi-bin/php.cgi/cesta/soubor.html
Při druhém stačí dát takovémuto souboru příponu .phtml a www server se o něj postará.
Na Fakultě informatiky je zatím k dispozici pouze první způsob, ale na druhém se už pracuje.

Příklady PHP/FI dokumentů pro přístup k Postgres95/PostgreSQL

Před tím, než začnete procházet následující příklady, bych vám chtěl doporučit, abyste se seznámili s jazykem PHP/FI. Programové konstrukce jsou však hodně podobné jazyku C, proto si myslím, že pokud znáte trochu jazyk C, můžete následující ukázky pochopit i bez studia PHP/FI. Pouze je dobré vědět, že proměnné musí začínat znakem $.

Příklad 1: Jak navázat spojení s Postgresem a zase ho zrušit?
Vytvořte HTML dokument:

   <HTML>
   <BODY>
1. <?setshowinfo(0)>
2. <?seterrorreporting(0)>

   <h2>Zkouška spojení z Postgresem</h2>

   <?
3.   $con = pg_Connect("localhost", "5432", "", "", "pam");
4.   if (!$con) 
       {
       echo "<b>Navázání spojení selhalo!</b><br>\n";
5.     echo pg_errorMessage($con);
6.     exit;
       }
     echo "<b>Spojení bylo úspěšné.</b><br>\n";
     echo "Nyní jsi připojen:<br>\n";
7.   echo "k databázi: <b>", pg_DBname($con), "</b><br>\n";
8.   echo "na stroji: <b>", pg_Host($con), "</b><br>\n";
9.   echo "přes port: <b>", pg_Port($con), "</b><br>\n";
10.  pg_Close($con);
   >

   </HTML>
   </BODY>
Příkazy PHP/FI v tomto příkladu postupně provedou:
  1. Vypnutí výpisu počtu přístupů ke stránce,
  2. Potlačení výpisu chybových hlášení,
  3. Pokus o spojení s počítačem localhost na portu 5432 na kterém běží postmaster. A napojení na databázi pam. Číslo spojení se uloží do proměnné $con
  4. Pokud hodnota proměnné $con je nulová, došlo k chybě, jinak je vše v pořádku.
  5. Vypsání chybového hlášení, proč se nepodařilo navázat spojení.
  6. Ukončení vykonávání PHP/FI.
  7. Vypsání jména databáze, která patří ke spojení $con.
  8. Na jakém počítači běží Postgres95/PosgreSQL,
  9. a na jakém portu.
  10. Nakonec se zruší spojení $con.

Příklad 2: Jak provést dotaz na databázi Postgres95/PosgreSQL?
Nejprve se musíme spojit s databází. Viz. Příklad 1. Provedení dotazu si ukážeme na SQL dotazu

select * from pg_user where usename like 'p%'
Který z tabulky uživatelů vybere ty, kteří začínají na písmeno p. Náš předchozí soubor priklad1.phtml rozšíříme o následující řádky (vložením mezi řádek 9. a 10.)
   echo "<hr>\n";
   echo "K Postgresu na stroji <b>";
   echo pg_Host($con);
   echo "</b>\nmají přístup tito uživatelé začínající na písmeno p:<br>\n";
1. $result = pg_Exec($con, "select * from pg_user where usename like 'p%'");
2. if (!$result) 
     {
     echo "Došlo k chybě.<br>\n";
     echo pg_errorMessage($con);
     exit;
     }

3. $num = pg_NumRows($result);
   $i = 0;

   while ($i < $num)
     {
4.   echo pg_Result($result, $i, "usename"), "<br>\n";
     $i++;
     }

5. pg_FreeResult($result);
Opět se pokusím okomentovat jednotlivé příkazy z PHP/FI. Podrobný popis všech příkazů naleznete ve výše zmíněném manuálu PHP/FI.
  1. Funkce pg_Exec pošle SQL dotaz Postgresovské databázi určené proměnnou $con.
  2. Pokud je $result rovno 0, došlo k chybě.
  3. Zjistí počet řádků ve výsledku $result. Při chybě vrací -1.
  4. Z výsledku $result vypreparuje z řádku $i (řádky se počítají od 0) položku s jménem "usename" (místo jména položky lze zadat číslo položky). PHP/FI podporuje jen některé typy Postgresu. Integer, boolean, oid vrací jako integer. Float a real vrací jako double. Všechny ostatní typy (array, string, ...) vrátí jako řetězec ve stejném formátu jako by ho zobrazil program psql.
  5. Uvolní místo v paměti zabrané proměnnou $result. Toto se děje automaticky při ukončení skriptu.

Příklad 3: Jak získat data pro Postgres95/PostgreSQL z webu?
Jako pro cokoli jiného, tedy přes formuláře. Návod pro psaní formulářů je dostupný na fakultních stránkách. Já jen upozorním na to, že PHP/FI poskytuje podporu pro psaní formulářů, kterou ilustruje následující příklad.

Soubor priklad3.html obsahuje tyto řádky:

<HTML>
<BODY>

<h2>Ukázka práce s formuláři přes PHP/FI</h2>

Zadej prosím svoje jméno a věk.
<FORM ACTION="display.phtml"
METHOD=POST>
Jméno: <INPUT TYPE="text" name="name">
Věk: <INPUT TYPE="text" name="age">
<INPUT TYPE="submit" VALUE="Odeslat">
</FORM>

</BODY>
</HTML>
Tedy nic jiného, než velmi jednoduchý formulář. Skript display.phtml, který ho zpracuje (napsaný v PHP/FI) může vypadat například takto:
<HTML>
<BODY>
<?setshowinfo(0)>
<?echo "$name o sobě tvrdí, že je mu $age.<p>">
</BODY>
</HTML>

Teď už jen uvedu odkaz na aplikaci napsanou v PHP/FI nad Postgresem.


Obsah Pavel Matula