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.