PHP -- Professional Home Pages

Jiří Kosek ml.

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.

Instalace

Před instalací si musíme samozřejmě stáhnout PHP ze sítě. Pro unixovou instalaci je potřeba stáhnout zdrojové texty, pro Windows si musíme stáhnout již zkompilovanou binární podobu systému.

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 .phtml
Nyní 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.exe
a 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.

Kombinování PHP skriptů s HTML

Skriptovací jazyk použitý v PHP čerpá především z jazyků C, Java a Perl. Jeho použití je však jednoduché a intuitivní. Příkazy PHP se od ostatního HTML kódu oddělují znaky '<?' 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ů.

Základy PHP

K výpisu hodnot výrazů slouží příkaz 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.

Obr. 1: Výsledek skriptu

PHP a formuláře

Spolupráce PHP s formuláři je velmi jednoduchá. Předpokládejme náš známý formulář:
<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>

Užitečná aplikace

Funkci 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.

Tab. 1: Parametry formátovacího řetězce Date()
YRok jako čtyřčíslí (např. 1998)
yRok jako dvojčíslí (např. 98)
MAnglická zkratka jména měsíce (např. Jan)
mČíslo měsíce (1-12)
FAnglické jméno měsíce (např. January)
DAnglická zkratka dne v týdnu (např. Fri)
lAnglická jméno dne v týdnu (např. Friday)
dČíslo dne v měsíci (1-31)
MČíslo dne v roce (1-365)
HHodina (0-23)
hHodina (1-12)
iMinuta (0-59)
sSekunda (0-59)
UPočet sekund od začátku času
AIndikátor dopoledne/odpoledne (AM/PM)
aIndiká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.

Obr. 2: Skript s českým datem

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.

© Jiří Kosek 1999