PHP (Professional Home Pages) je dalším skriptovacím jazykem, který se přímo začleňuje do textu HTML stránky. Jeho použití má několik předností. Předně je celý systém šířen bezplatně -- podobně jako např. operační systém Linux nebo server Apache. Druhá výhoda spočívá v podpoře více platforem. PHP je dodáváno v podobě zdrojových textů pro platformu Unix (včetně Linuxu) a jako binární soubor použitelný ve Windows 95 a NT. Aplikace tak můžeme vyvíjet třeba ve Windows a pak je zpřístupnit na výkonném unixovém serveru. Vidíme tedy velkou výhodu oproti ASP, které nás svazují s platformou Windows. I tady se však možná situace zlepší, protože se pracuje na produktu Chilli!ASP, který má být kompatibilní s ASP a má běžet i na Unixu.
Dnes aktuální verze PHP je 3.0. Předtím používaná verze 2.0 měla poněkud odlišný název PHP/FI, který byl dán historickým vývojem celého systému. PHP si můžeme stáhnout na adrese http://www.php.net/. K dispozici je i české zrcadlo s peeringem do NIXu na adrese http://www.php.cz/.
Na PHP je zajímavé, že může být spouštěno několika způsoby. Nejlepší způsob je, když PHP spustíme jako modul serveru Apache. Tuto vlastnost můžeme použít pouze na Unixu. Na všech ostatních serverech může běžet PHP jako CGI-skript, který se postará o interpretaci příkazů na stránkách. Ve Windows máme možnost PHP provozovat jako ISAPI modul. ISAPI je standardní rozhraní pro spolupráci WWW serverů s různými dalšími aplikacemi. PHP proto může běžet i jako modul většiny serverů pracujících pod Windows.
My se teď podíváme, jak si podporu PHP přidat do instalace Apache z prvního
dílu našeho seriálu. Pro instalaci si musíme stáhnout Windows distribuci PHP. Ta
má podobu jednoho zip-souboru. Ten rozbalíme do nějakého adresáře -- např.
e:\php3. Při rozbalení nám vznikne podadresář system.
Jeho obsah musíme zkopírovat do systémového adresáře Windows (nejčastěji
c:\windows nebo c:\winnt). Do tohoto adresáře
přesuneme i souboru php3.ini. V souboru php3.ini
musíme upravit obsah proměnných doc_root a user_dir
tak, aby ukazovaly na kořenový adresář našeho Web-serveru resp. obsahovaly jméno
adresáře vyhrazeného pro HTML dokumenty jednotlivých uživatelů. (Pozn. V
době odevzdávání článku se na Internetu objevila nová distribuce PHP, kde
všechny výše uvedené kroky provede instalační program.)
Nyní musíme ještě nastavit server Apache tak, aby na stránky obsahující PHP
spustil příslušný interpret. Úpravy se budou týkat souboru
srm.conf.
PHP v našem případě bude fungovat jako CGI-skript. Musíme tedy povolit provádění skriptů v adresáři, kde je nainstalováno PHP. Do konfiguračního souboru přidáme řádku
ScriptAlias /php3/ "e:/php3/"Nyní musíme přidat nový typ dat, který bude svázaný s určitou příponou. Pro PHP skripty se obvykle používá přípona
.phtml nebo
.php3. My se přikloníme k první variantě a odkomentujeme příslušnou
řádku konfiguračního souboru tak, abychom dostali AddType application/x-httpd-php3 .phtmlNyní zbývá serveru říci, že všechny soubory nové vytvořeného typu se mají předat CGI-skriptu PHP k vyhodnocení. Do
srm.conf přidáme
následující řádku: Action application/x-httpd-php3 /php3/php.exea konfigurační soubor uložíme. Po restartu Apache bychom měli mít vše připraveno pro naši práci. V případě problémů můžeme konzultovat dokumentaci PHP a Apache.
<?' a
'?>'. Vidíme, že PHP používá jako oddělovač znak standardně
vymezený pro tyto účely a tak jsou všechny PHP skripty kompatibilní s nástroji
pro automatické zpracování SGML a XML dokumentů.
echo: <? echo "Hello World!" ?>V PHP můžeme samozřejmě používat proměnné. Název proměnné musí začínat znakem '$' (dolar). Přiřazení hodnoty do proměnné provedeme pomocí operátoru '='. Proměnnou pak můžeme využívat v dalších výrazech:
<? $pozdrav = "Ahoj Karle!"; ... echo $pozdrav; ?>Z ukázky rovněž vidíme, že jednotlivé příkazy se oddělují pomocí středníku.
Program můžeme podle potřeby větvit pomocí příkazu if. Jeho
použití si ukážeme na funkční obdobě ukázky z minulého dílu seriálu. Vytvoříme
stránku, která bude zdravit uživatele v závislosti na tom, zda je dopoledne či
odpoledne:
<? if (date("A")=="AM"): ?>
Dobré ráno!
<? else: ?>
Dobré odpoledne!
<? endif ?>
K zjištění času používáme funkci Date(). Jejím parametrem je
formátovací řetězec, který určuje výsledný tvar informace o čase. Pokud ve
formátovacím řetězci použijeme 'A', vrátí funkce dopoledne řetězec
'AM' a odpoledne 'PM' -- podle toho snadno určíme, zda
je dopoledne či odpoledne.
Všimněme si ještě, že za podmínkou u if a za nepovinným
else je potřeba psát dvojtečku. Kromě této syntaxe můžeme používat
i syntaxi podmínek převzatou z jazyka C. V tomto případě je však přehlednější,
když neprolínáme kód PHP s HTML:
<? if (date("A")=="AM") {
echo "Dobré ráno!";
} else {
echo "Dobré odpoledne!";
}
?>
Nyní se podíváme na použití cyklů. Mezi nejjednodušší cykly patří
for. Použití si ukážeme na jednoduchém příkladu, který na obrazovku
vypíše text a použije přitom všech sedm velikostí písma. <? for($i=0; $i<=7; $i++): ?> <P><FONT SIZE="<?echo $i?>">Ukázkový text</FONT> <? endfor ?>Abychom si ukázali sílu PHP, upravíme ukázku tak, aby vypisovala texty i v různých barvách. Pro tyto účely vytvoříme pole, které bude obsahovat jména barev, které se použijí pro jednotlivé velikosti písma.
<? $barvy = array(1=>"red", "green", "cyan", "yellow",
"navy", "silver", "blue" ) ?>
<? for ($i=1; $i<=7; $i++): ?>
<P><FONT SIZE="<?echo $i?>" COLOR="<?echo $barvy[$i]?>">
Pokusný text o velikosti <?echo $i?></FONT>
<? endfor ?>
První dvě řádky vytvoří pole $barvy, které je inicializováno
jmény barev. Pole jsou v PHP normálně indexována od nuly, pomocí zápisu
'1=>' uložíme hodnoty do pole až od indexu 1. Tím bude index v
poli barev odpovídat velikosti písma. Jednotlivé položky pole jsou nyní
přístupné pomocí zápisu $barvy[index].
Do prohlížeče dorazí tento výsledný HTML kód:
<P><FONT SIZE="1" COLOR="red"> Pokusný text o velikosti 1</FONT> <P><FONT SIZE="2" COLOR="green"> Pokusný text o velikosti 2</FONT> <P><FONT SIZE="3" COLOR="cyan"> Pokusný text o velikosti 3</FONT> <P><FONT SIZE="4" COLOR="yellow"> Pokusný text o velikosti 4</FONT> <P><FONT SIZE="5" COLOR="navy"> Pokusný text o velikosti 5</FONT> <P><FONT SIZE="6" COLOR="silver"> Pokusný text o velikosti 6</FONT> <P><FONT SIZE="7" COLOR="blue"> Pokusný text o velikosti 7</FONT>Výsledek v prohlížeči přináší obrázek 1.
![]() |
<FORM ACTION=obsluha.phtml METHOD=GET> Jméno: <INPUT TYPE=TEXT NAME=jmeno><BR> Věk: <INPUT TYPE=TEXT NAME=vek><BR> <INPUT TYPE=SUBMIT VALUE="Odeslání formuláře"> </FORM>Ve skriptu
obsluha.phtml nyní můžeme používat proměnné
$jmeno a $vek, které obsahují hodnotu vyplněnou
uživatelem do příslušného pole formuláře. Skript obsluha.phtml pak
může vypadat třeba takto: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<TITLE>Obsluha formuláře</TITLE>
</HEAD>
<BODY>
<H1>Výsledek obsluhy formuláře</H1>
<? echo $jmeno ?> je
<? if ($vek < 10):
echo "pěknej mlíčnák";
elseif ($vek < 20):
echo "teenager";
elseif ($vek < 60):
echo "v nejlepších letech";
elseif ($vek < 100):
echo "je pravděpodobně prarodič";
else:
echo "je někde mezi stovkou a smrtí";
endif
?>.
</BODY>
</HTML>
Date() můžeme s výhodou použít pro
vypsání aktuálního data a času serveru do stránky tak, jak to dělá mnoho
zpravodajských serverů. My si ukážeme, jak tohoto efektu dosáhnout pomocí PHP.
Pro náš skript bude především důležitá znalost významu jednotlivých znaků ve
formátovacím řetězci funkce Date(). Potřebné informace nalezneme v
tabulce 1.
Y
| Rok jako čtyřčíslí (např. 1998) |
y
| Rok jako dvojčíslí (např. 98) |
M
| Anglická zkratka jména měsíce (např. Jan) |
m
| Číslo měsíce (1-12) |
F
| Anglické jméno měsíce (např. January) |
D
| Anglická zkratka dne v týdnu (např. Fri) |
l
| Anglická jméno dne v týdnu (např. Friday) |
d
| Číslo dne v měsíci (1-31) |
M
| Číslo dne v roce (1-365) |
H
| Hodina (0-23) |
h
| Hodina (1-12) |
i
| Minuta (0-59) |
s
| Sekunda (0-59) |
U
| Počet sekund od začátku času |
A
| Indikátor dopoledne/odpoledne (AM/PM) |
a
| Indikátor dopoledne/odpoledne (am/pm) |
Vidíme, že v tabulce nám schází česká jména měsíců a dnů v týdnu. To však
můžeme obejít. Pro dny v týdnu vytvoříme asociativní pole, které poslouží k
převodu anglických zkratek dne na český název. Asociativní pole je
pole, kde se jako index používá znakový řetězec. Pro měsíce můžeme vytvořit
normální pole, protože funkce Date() vrací přímo pořadové číslo
měsíce.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<TITLE>Zpravodajství</TITLE>
</HEAD>
<BODY>
<H1 ALIGN=CENTER>Vítejte na našem zpravodajském serveru</H1>
<P ALIGN=CENTER>
<FONT SIZE=5 COLOR=RED>
<?
$dny["Mon"] = "Pondělí";
$dny["Tue"] = "Úterý";
$dny["Wed"] = "Středa";
$dny["Thu"] = "Čtvrtek";
$dny["Fri"] = "Pátek";
$dny["Sat"] = "Sobota";
$dny["Sun"] = "Neděle";
$mesice = array(1=>"ledna", "února", "března",
"dubna", "května", "června",
"července", "srpna", "září",
"října", "listopadu", "prosince");
$dnes = $dny[Date("D")] . Date(" d. ") .
$mesice[(int)Date("m")] . Date(" Y - H:i:s");
echo $dnes;
?>
</FONT>
</BODY>
</HTML>
Výsledný zápis datumu skládáme z jednotlivých částí do proměnné
$dnes. Pro spojování řetězců musíme použít operátor
'.' a ne obvyklé '+'. Obyčejné znaky použité ve
formátovacím řetězci funkce Date() se vrátí společně s výsledkem.
Toho využíváme pro doplnění mezer a teček na správná místa.
Protože funkce Date() vrací jako výsledek řetězec, musíme v
případě převodu čísla měsíce na jméno přetypovat výsledek na číselnou hodnotu
pomocí předřazení (int).
Ufffff! Máme mi to v srdci Evropy trápení. Pro angličtinu by stačil celý
skript zkrátit na jeden příkaz echo Date("l F d, Y - H:i:s").
Pokochejme se však výsledkem našeho skriptu na obrázku 2.
![]() |
Tím naši krátkou exkurzi do světa PHP pro dnešek ukončíme. Příště se podíváme na protokol HTTP, jehož základní znalost je nezbytná pro pochopení principů CGI-skriptů. K PHP se však ještě vrátíme a ukážeme si jeho další možnosti včetně spolupráce s databázemi.