Na slovo zadarmo nemusí slyšet jen lidé pohybující se okolo Linuxu, ale také zarputilí „oknaři“. A ačkoliv technologie uvedené v nadpisu pocházejí převážně z linuxového světa, ukážeme si, že je můžeme naprosto bez problémů používat i ve Windows.
Nepůjde jen o práci jednotlivých prvků, ale o vzájemné propojení tak,
abychom mohli z webu přistupovat pomocí skriptu vytvořeného v PHP přímo k
datům uložených na databázovém stroji InterBase. Heslo zní zdarma a
kvalitně včetně zdrojových kódů. V textu jsou uvedeny adresy, odkud si
můžete stáhnout aktuální verze programů. Pokud nechcete nic stahovat, pak
se podívejte na přiložené CD, kde všechny produkty najdete a platí pro ně
uvedený postup. Jestliže budete mít jinou verzi některého z produktů, je
možné, že konfigurace bude probíhat trošku jinak, ale princip by měl
zůstat stejný.
Budu předpokládat, že znáte alespoň základy PHP a SQL a InterBase vám
také není zcela cizí. Server Apache znát není potřeba, pro náš účel
stačí to, co bude napsáno.
Apache
Apache (A PAtCHy sErver) je HTTP server založený na kódech kdysi velmi
oblíbeného serveru NCSA httpd 1.3. Od té doby (1995) byl kompletně přepsán
a patří mezi nejpoužívanější servery na Internetu. Tolik teorie, pojďme
si ale sednout k počítači a začít instalovat. Aktuální verzi Apache lze
stáhnout z adresy http://httpd.apache.org/dist/binaries/win32/.
Výsledkem dosavadního snažení je spustitelný soubor, který nainstaluje
Apache na váš počítač. Volitelně lze nainstalovat manuál a zdrojové
kódy. A to je vlastně vše. V nabídce Start/Programs/Apache Web Server
zvolte Start Apache as console app. Pokud vše proběhlo v pořádku,
mělo by se objevit konzolové okno s informací, že server běží. Nyní
spusťte prohlížeč a napište localhost případně 127.0.0.1 - měly by se
zobrazit stránky s informacemi o serveru včetně odkazu na manuál (byl-li
nainstalováni).
Jestliže se ale vyskytly problémy, ujistěte se, že v souboru hosts (ve
Windows 2000 umístěn v adresáři %SYSTEMROOT%\system32\drivers\etc,
kde %SYSTEMROOT% je proměnná systému určující adresář, ve kterém
je nainstalován operační systém) je následující řádek:
127.0.0.1 localhost
PHP
Skriptovací jazyk PHP (Personal Home Page) běžící na straně serveru si
napsal v roce 1994 pro svou potřebu Rasmus Lerdorf, protože se mu nelíbilo,
jak neustálé spouštění interpretu Perlu zatěžuje WWW server. Jenže se to
zalíbilo ostatním autorům, kteří chtěli další a další vylepšení, až
z toho vznikl systém, jak jej známe dnes.
Instalace PHP není o nic složitější než instalace Apache. Aktuální
verzi lze nalézt na českém zrcadle originálních stránek http://www.php.cz/downloads.php. Po
stažení binární podoby (opět lze na stejné stránce získat i zdrojové
kódy) ji rozbalte do libovolného adresáře (například C:\Program
Files\PHP) a tam naleznete soubor php.ini-dist. Ten přejmenujte na
php.ini a přesuňte do %SYSTEMROOT%. Nakonec je ještě potřeba tento
soubor otevřít a přepsat hodnotu direktivy extension_dir na
C:\Program Files\PHP. Tímto je instalace PHP hotova.
InterBase
InterBase je poměrně rychlý a kvalitní databázový server střední
třídy založen na architektuře client/server podporující databáze o
velikosti až několika gigabajtů. V loňském roce přešel pod hlavičku Open
Source, přesněji IPL licenci, takže i v tomto případě to máme zdarma.
Produkt si lze stáhnout na adrese http://www.borland.com/interbase/downloads/,
kde kromě vlastního serveru najdete i zdrojové kódy, IB Consoli pro správu
databáze, Interbase Express pro programátory v Delphi a C++ Builderu a další
software, který může být užitečný.
Po stažení souboru ib_server_6_0_1.zip (jedná se o klienta i
server) jej rozbalte a spusťte setup.exe, který vás v několika málo
krocích provede jednoduchou instalací. Proběhne-li vše v pořádku, server
po instalaci již běží a lze jej používat. V Control Panelu přibude nová
ikona s názvem Interbase Manager, kde můžete zvolit základní nastavení
serveru.
Instalace je tedy hotova, ale ještě u Interbase chvíli zůstaneme a
založíme si tabulku, abychom mohli odněkud získávat data. Předpokládám,
že dokážete vytvořit databázi. V ní založte tabulku PERSON podle
následujícího kódu a zadejte několik údajů:
CREATE TABLE PERSON
(
NAME VARCHAR (20) NOT NULL,
AGE SMALLINT CHECK (AGE IS NOT NULL AND AGE >= 0 AND AGE < 150)
)
Použijeme ji v závěrečném PHP skriptu.
Apache + PHP
Jednotlivé nástroje jsou nakonfigurovány a použitelné, pojďme je dát
dohromady. Budu předpokládat, že jste Apache nainstalovali standardně do
C:\Program Files\Apache a PHP je v C:\Program Files\PHP. Do
souboru httpd.conf, který se nachází v C:\Program
Files\Apache\conf\, je potřeba přidat následující tři řádky:
ScriptAlias /php/ "c:/program files/php/"
AddType application/x-httpd-php .php .phtml
Action application/x-httpd-php "/php/php.exe"
První zakládá alias /php/ a říká, kde je interpret tohoto jazyka
umístěn (lomítka jsou správně), přesněji hlavní adresář. Druhý
říká, které soubory s uvedenou příponou budou interpretu podstrkovány a
nakonec jaký program se má spustit.
Ještě než soubor uložíte a zavřete, podívejte se, jak máte nastavenou
direktivu DocumentRoot. Jedná se totiž o adresář, kde jsou umístěny
vaše dokumenty. Jestliže chcete, můžete zvolit jiný.
<?
PHPInfo();
?>
Do prohlížeče napište adresu localhost/první.php a je-li vše v
pořádku, zobrazí se relativně velké množství informací o PHP.
PHP + Interbase
Nakonec dáme dohromady PHP a Interbase, čímž budeme mít vzhledem k
předchozímu kroku zajištěn přistup z webu. V již jednou zmíněném
souboru %SYSTEMROOT%\php.ini je mimo jiné následující řádek:
;extension=php_interbase.dll
Středník znamená, že je zakomentovaný. Proto jej odstraňte a přidejte
cestu, kde jsou vaše rozšíření uložena, například takto:
extension=extensions/php_interbase.dll
(zde byly mezi některými verzemi PHP drobné změny v umístění, takže
je potřeba se řídit dle vaší verze). Soubor uložte a je hotovo. Abychom
vyzkoušeli, zda je vše v pořádku, vytvořte v adresáři, kde je již
první.php, soubor interbase.php a v něm tento kód:
<HTML>
<?PHP
$host = "localhost:c:/temp/pokus.gdb";
$username = "sysdba";
$password = "masterkey";
$dbh = ibase_pconnect ($host, $username, $password);
$stmt = 'SELECT AVG (AGE) FROM PERSON';
$sth = ibase_query ($dbh, $stmt);
$row = ibase_fetch_row ($sth);
print "Průměrný věk: ".$row[0];
ibase_close ($dbh);
?>
</HTML>
A to je vlastně vše. Do prohlížeče napište adresu http://localhost/interbase.php a je-li
vše v pořádku, dostanete průměrný věk osob ve vaší tabulce.
API: příklady použití
V minulém čísle jsme předvedli, jak lze spojit dohromady Apache, PHP a
Intebase. Dneska si představíme několik postupů jak s uvedenými informacemi
nakládat. Vše bude ukázáno na příkladu počítadla přístupů na webové
stránky. Podobně jako v úvodním čísle, i zde předpokládám, že SQL,
potažmo Interbase, a PHP vám není až tak úplně cizí.
Operace, kterou musíte provést vždy, chcete-li získat informace z
databáze, je napojení se na ní. K tomu slouží funkce
ibase_pconnect(), která potřebuje umístění databáze,
uživatelské jméno a heslo. Po ukončení práce s databázi je potřeba se od
databáze odpojit funkcí ibase_close():
$host = "localhost:c:/ibdatabases/pocitadlo.gdb";
$username = "sysdba";
$password = "masterkey";
$dbh = ibase_pconnect ($host, $username, $password);
if (!dbh)
{
echo "Spojení se nezdařilo.";
} else {
//zde pracujeme s daty...
ibase_close ($dbh);
}
Jak bylo uvedeno na začátku, ukážeme si, jak počítat přístupy k
našim stránkám. První, co je k tomu zapotřebí, je mít v databázi
odpovídající tabulky. Ty nám budou stačit dvě: v první budou uloženy
informace o stránkách a v druhé zaznamenány jednotlivé přístupy (viz
následující obrázek).
Vlastní tabulky vytvoříme následujícími příkazy (předpona PC je z
Page Counter):
CREATE TABLE PC_PAGE
(
IDPAGE INTEGER NOT NULL,
PAGENAME VARCHAR(40) NOT NULL,
FILENAME VARCHAR(100) NOT NULL,
CREATEDAT DATE NOT NULL,
PRIMARY KEY (IDPAGE)
)
;
CREATE TABLE PC_ACCESS (
IDACCESS INTEGER NOT NULL,
IDPAGE INTEGER NOT NULL,
ACCESSDAY SMALLINT NOT NULL,
ACCESSMONTH SMALLINT NOT NULL,
ACCESSYEAR SMALLINT NOT NULL,
ACCESSHOUR SMALLINT NOT NULL,
ACCESSMINUTE SMALLINT NOT NULL,
ACCESSSECOND SMALLINT NOT NULL,
PRIMARY KEY (IDACCESS)
)
;
ALTER TABLE PC_ACCESS ADD
FOREIGN KEY (IDPAGE) REFERENCES PC_PAGE (IDPAGE)
ON UPDATE CASCADE
ON DELETE CASCADE
;
CREATE GENERATOR G_PC_PAGE_ID;
CREATE GENERATOR G_PC_ACCESS_ID;
SET TERM ^;
CREATE TRIGGER T_INSERT_PC_PAGE FOR PC_PAGE
ACTIVE BEFORE INSERT POSITION 0
AS BEGIN
NEW.IDPAGE = GEN_ID (G_PC_PAGE_ID, 1);
NEW.CREATEDAT = "NOW";
END
^
CREATE TRIGGER T_INSERT_PC_ACCESS FOR PC_ACCESS
ACTIVE BEFORE INSERT POSITION 0
AS BEGIN
NEW.IDACCESS = GEN_ID (G_PC_ACCESS_ID, 1);
END
^
SET TERM ;^
Nyní bychom mohli ukázat, jak vypsat, které stránky jsou v databázi
zavedeny, případně počty přístupů na ně. Ovšem neuděláme to už jenom
z toho důvodu, že jsme tabulky právě vytvořili a nic v nich není. Nejprve
je naplníme z formuláře, který budeme moci spustit přímo z webu.
K tomu potřebujeme kód HTML souboru, který bude k zadávání nových dat
sloužit. (Protože je v časopise k dispozici relativně málo místa, budu
psát jen to nejnutnější, proto omluvte estetický dojem ze stránek. Stejně
tak nebudu ošetřovat všechny možné chyby v PHP skriptech.) Jediné, co je
potřeba zadat k identifikaci stránky, je její název a soubor, ve kterém se
stránka nachází:
<html>
<body>
<form action="insert.php" method=post>
<table frame=box rules=none border=1 cellpadding=5>
<tr>
<td>Název stránky:</td>
<td><input type=text name=pagename size=30></td>
</tr>
<tr>
<td>Soubor:</td>
<td><input type=text name=filename size=30></td>
</tr>
<tr>
<td><input type=submit value="Vlož"></td>
<td> </td>
</tr>
</table>
</form>
</body>
</html>
Jako test na správně zadaná data lze s výhodou použít JavaScript, ale
to teď není v našem zájmu. Po vyplnění dat a stisku tlačítka
Vlož se spustí skript insert.php, který nedělá nic jiného,
než že vloží zadané hodnoty do tabulky:
$host = "localhost:c:/temp/pocitadlo.gdb";
$username = "sysdba";
$password = "masterkey";
$dbh = ibase_connect ($host, $username, $password);
$dbq = ibase_query ($dbh, "INSERT INTO PC_PAGE (PAGENAME, FILENAME) ".
"VALUES ('$pagename', '$filename')");
ibase_close ($dbh);
echo "Data vložena.";
Jak k tomu vlastně došlo? Ve formuláři máme dvě vstupní pole
pojmenovaná pagename a filename. Po odeslání dat
jsou v PHP skriptu naplněné proměnné stejného jména hodnotami, které
uživatel zadal. Díky tomu je můžeme použít při vkládání do
tabulky.
Máme tedy hotovo vkládání informací o stránkách, takže můžeme bez
větších problémů přejít přímo k počítání přístupů. V podstatě
jde o stejný úkon, pouze se budou vkládat jiná data do jiné tabulky
(konkrétně PC_ACCESS). Je potřeba si uvědomit, že vložení
dat může proběhnout několika spůsoby. Nejjednodušší je takový, kdy
každá stránka při volání PHP skriptu zná své IDPAGE, které
získala při vložení do tabulky. V případě, že je nezná, je potřeba jej
zjistit z tabulky PC_PAGE. To je však poměrně velká režie (i v
případě existence indexu na sloupečku PAGENAME), proto zvolíme
první metodu. Funkce, kterou budeme volat, dostane číslo stránky a na
oplátku vloží odpovídající data do tabulky PC_ACCESS a
vypíše počet přístupů k dané stránce:
function WriteAccess ($ID)
{
$actdate = GetDate();
$host = "localhost:c:/temp/pokus.gdb";
$username = "sysdba";
$password = "masterkey";
$dbh = ibase_connect ($host, $username, $password);
$day = $actdate [mday];
$mon = $actdate [mon];
$year = $actdate [year];
$hour = $actdate [hours];
$min = $actdate [minutes];
$sec = $actdate [seconds];
$dbq = ibase_query ($dbh, "INSERT INTO PC_ACCESS ".
"(IDPAGE, ACCESSDAY, ACCESSMONTH, ACCESSYEAR, ".
"ACCESSHOUR, ACCESSMINUTE, ACCESSSECOND) ".
"VALUES ($ID, $day, $mon, $year, $hour, $min, $sec)");
$dbq = ibase_query ($dbh, "SELECT COUNT (*) FROM PC_ACCESS ".
"WHERE IDPAGE = $ID");
$row = ibase_fetch_row ($dbq);
print $row[0]; //vypiseme pocet
ibase_close ($dbh);
}
Jen tak mimochodem je v uvedené funkci ukázán způsob zjišťování dat.
Je vidět, že se nejedná o žádná velká kouzla. Každopádně se k tomu
ještě vrátíme.
Funkce je hotová, ještě si ale musíme ukázat způsob, jak ji zavolat.
Mějme proto v databázi uložené informace o nějaké stránce, jejíž
IDPAGE bude například 5. Zavolání uvnitř stránky může
vypadat například takto:
Jste naším jubilejním návštěvníkem číslo <?WriteAccess (5)?>.
Na řadu přichází slíbené zobrazování dat z databáze. Zřejmě
nejdůležitější pro majitele stránek bude seznam všech stránek a počet
přístupů na ně:
$host = "localhost:c:/temp/pokus.gdb";
$username = "sysdba";
$password = "masterkey";
$dbh = ibase_connect ($host, $username, $password);
$dbq = ibase_query ($dbh, "SELECT PAGENAME, COUNT (*) ".
"FROM PC_PAGE P, PC_ACCESS A ".
"WHERE P.IDPAGE = A.IDPAGE ".
"GROUP BY P.PAGENAME ");
print '<table border="1">';
print "<tr><td>Stránka</td><td>Přístupů</td></tr>";
while ($row = ibase_fetch_object ($dbq))
{
print "<tr><td>";
print $row->PAGENAME;
print "</td><td>";
print $row->COUNT;
print "</td></tr>";
}
print "</table>";
ibase_close ($dbh);
Závěr
Ukázali jsme si jednoduché ukázky použití PHP, jeho napojení na
databázi InterBase a následné zobrazování dat v prohlížeči. Podobně,
jako je provedeno vkládání do databáze, lze udělat úpravu dat
(UPDATE) či jejich mazání (DELETE). Pokud chcete
problematiku studovat více, než bylo uvedeno zde, doporučuji jednak
(manuálové) stránky PHP (http://www.php.net)
a jednak výbornou knihu Jirky Koska PHP - Tvorba interaktivních internetových
aplikací, podrobný průvodce. Naleznete zde velké množství informací nejen
o tvorbě databázových aplikací a formulářů.
V tabulce jsem uvedl všechny funkce, které lze při práci s InterBase
používat.
| Název funkce |
Popis |
| ibase_connect |
Otevře spojení s databází |
| ibase_pconnect |
Otevře perzistentní spojení s databází |
| ibase_close |
Ukončí spojení s databází |
| ibase_query |
Provede dotaz nad databází |
| ibase_fetch_row |
Vybere řádku z databáze |
| ibase_fetch_object |
Vybere objekt z databáze |
| ibase_field_info |
Vrátí infomace o poli |
| ibase_free_result |
Uvolní výslednou množinu |
| ibase_prepare |
Předpřipraví dotaz ke spouštění s parametry |
| ibase_execute |
Spustí předem připravený dotaz |
| ibase_trans |
Začátek transakce |
| ibase_commit |
Commit transakce |
| ibase_rollback |
Rollback transakce |
| ibase_free_query |
Uvolní paměť zabranou předpřipraveným dotazem |
| ibase_timefmt |
Nastaví formát typů timestamp, date a time které mohou být vráceny v
dotazu |
| ibase_num_fields |
Vrátí počet sloupečku ve výsledné množině |
| ibase_errmsg |
Vrátí popis chyby |
Tento článek byl napsán pro časopis Softwarové noviny 3 a 4/2001.
Upozornění: tento text neprošel redakční úpravou, takže je
tak, jak byl napsán včetně případných chyb. Žádná část tohoto
článku nesmí být použita bez předchozího souhlasu autora.
Seznam mých dalších článků je v tomto přehledu.