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