Kapitola 49. Pou╛φvßnφ PHP

Tato Φßst shrnuje nejΦast∞j╣φ chyby, se kter²mi se m∙╛ete setkat p°i psanφ PHP skript∙.

1. Cht∞l bych napsat generick² PHP skript, kter² by um∞l zpracovat data z jakΘhokoli formulß°e. Jak se dozvφm, kterΘ prom∞nnΘ metody POST jsou k dispozici?
2. Pot°ebuji p°evΘst v╣echny apostrofy (') na zp∞tnß lomφtka nßsledovanß apostrofy. Jak se to dß ud∞lat pomocφ regulßrnφho v²razu?
3. Kdy╛ napφ╣u nßsledujφcφ k≤d, v²stup se tiskne v nesprßvnΘm po°adφ:
function myfunc($argument)
{
    echo $argument + 10;
}
$variable = 10;
echo "myfunc($variable) = " . myfunc($variable);
what's going on?
4. Hej, co se stalo s m²mi konci °ßdk∙?
<pre>
<?php echo "Tohle by m∞l b²t prvnφ °ßdek."; ?>
<?php echo "Tohle by se m∞lo ukßzat na novΘm °ßdku."; ?>
</pre>
5. Zobrazila se mi zprßva 'Warning: Cannot send session cookie - headers already sent...' nebo 'Cannot add header information - headers already sent...'.
6. Pot°ebuji p°φmo p°istupovat k hlaviΦce po╛adavku. Jak to ud∞lat?
7. Kdy╛ zkusφm autentikaci s IIS, dostanu 'No Input file specified'.
8. M∙j PHP skript pracuje na IE a Lynxu, ale v Netscapu Φßst v²stupu mizφ. Kdy╛ si zapnu "Zobrazit zdrojov² k≤d", v IE vidφm obsah, v Netscapu nikoliv.
9. JakΘ jsou p°edpoklady mφchßnφ XML a PHP? St∞╛uje si to na moje <?xml> tagy!
10. Jak mohu pou╛φt PHP s FrontPagem nebo jin²m HTML editorem, kter² trvß na odsunutφ mΘho k≤du?
11. Kde najdi ·pln² seznam dostupn²ch p°ednastaven²ch prom∞nn²ch, a proΦ to nenφ zdokumentovßno v dokumentaci PHP?
12. Zkou╣φm p°istupovat k jednΘ ze standardnφch CGI prom∞nn²ch (jako je $DOCUMENT_ROOT nebo $HTTP_REFERER) v u╛ivatelsky definovanΘ funkci, a nem∙╛e ji to najφt. Co je ╣patn∞?

1. Cht∞l bych napsat generick² PHP skript, kter² by um∞l zpracovat data z jakΘhokoli formulß°e. Jak se dozvφm, kterΘ prom∞nnΘ metody POST jsou k dispozici?

Ujist∞te se, ╛e mßte v souboru php.ini zapnuto track_vars Od PHP 4.0.3 je tato mo╛nost v╛dy zapnuta. Pokud tomu tak je, vytvo°φ se n∞jakß asociativnφ pole, z nich╛ nejd∙le╛it∞j╣φ je $HTTP_POST_VARS. Tak╛e pro psanφ generickΘho skriptu pro obsluhu prom∞nn²ch metody POST budete pot°ebovat p°ibli╛n∞ toto:
foreach ($HTTP_POST_VARS as $var => $value) {
    echo "$var = $value<br>\n";
}

2. Pot°ebuji p°evΘst v╣echny apostrofy (') na zp∞tnß lomφtka nßsledovanß apostrofy. Jak se to dß ud∞lat pomocφ regulßrnφho v²razu?

Nejd°φve se podφvejte na funkci addslashes(). D∞lß p°esn∞ to, co pot°ebujete. M∞li byste se takΘ podφvat na direktivu magic_quotes_gpc v souboru php.ini.

3. Kdy╛ napφ╣u nßsledujφcφ k≤d, v²stup se tiskne v nesprßvnΘm po°adφ:
function myfunc($argument)
{
    echo $argument + 10;
}
$variable = 10;
echo "myfunc($variable) = " . myfunc($variable);
what's going on?

Pro pou╛itφ v²sledk∙ va╣φ funkce ve v²razu (jako je spojenφ s jin²m °et∞zcem v p°φkladu v²╣e), musφte hodnotu vracet (pomocφ vracet), ne tisknout() (pomocφ echo()).

4. Hej, co se stalo s m²mi konci °ßdk∙?
<pre>
<?php echo "Tohle by m∞l b²t prvnφ °ßdek."; ?>
<?php echo "Tohle by se m∞lo ukßzat na novΘm °ßdku."; ?>
</pre>

V PHP se blok k≤du zakonΦuje bu∩ "?>", nebo "?>\n" (kde \n znamenß nov² °ßdek). Tak╛e ve v²╣e uvedenΘm p°φkladu budou vypsanΘ v∞ty na jedinΘm °ßdku, proto╛e PHP vynechßvß konce °ßdk∙ za koncem bloku. To znamenß, ╛e musφte p°idßvat zvlß╣tnφ konce °ßdk∙ za ka╛d² blok PHP k≤du, aby se vytisklo od°ßdkovßnφ jedinΘ.

ProΦ to PHP d∞lß? P°i formßtovßnφ normßlnφho HTML to obvykle zjednodu╣uje ╛ivot, proto╛e nechcete konce °ßdk∙, n²br╛ chcete vytvo°it extrΘmn∞ dlouhΘ °ßdky nebo jinak zneΦitelnit zdrojov² k≤d.

5. Zobrazila se mi zprßva 'Warning: Cannot send session cookie - headers already sent...' nebo 'Cannot add header information - headers already sent...'.

Funkce header(), set_cookie() a funkce session musφ do v²stupu p°idat hlaviΦky. HlaviΦky je mo╛no posφlat pouze p°ed vlastnφm obsahem. Funkce to ud∞lajφ, pokud PHP b∞╛φ jako modul Apache. Nßsledujφcφ kus k≤du zobrazφ v╣echny hlaviΦky v po╛adavku:
$headers = getallheaders();
foreach ($headers as $name => $content) {
    echo "headers[$name] = $content<br>\n";
}

6. Pot°ebuji p°φmo p°istupovat k hlaviΦce po╛adavku. Jak to ud∞lat?

Funkce getallheaders() to ud∞lß, pokud PHP b∞╛φ jako modul do Apache. Nßsledujφcφ kus k≤du zobrazφ v╣echny hlaviΦky v po╛adavku:
$headers = getallheaders();
foreach ($headers as $name => $content) {
    echo "headers[$name] = $content<br>\n";
}

7. Kdy╛ zkusφm autentikaci s IIS, dostanu 'No Input file specified'.

BezpeΦnostnφ model IIS je s tφm na ╣tφru. Je to problΘm spoleΦn² v╣em CGI program∙m b∞╛φcφm pod IIS. ╪e╣enφm je vytvo°it obyΦejn² HTML soubor (neparsovan² PHP) jako vstupnφ strßnku do autentikovanΘho adresß°e. Potom se pou╛ije META tag k p°esm∞rovßnφ na PHP strßnku nebo odkaz k ruΦnφmu p°echodu. PHP pak autentikaci zpracuje sprßvn∞. S modulem ISAPI toto nenφ problΘmem. Jin²ch NT webovsk²ch server∙ se problΘm net²kß. Vφce informacφ - viz http://support.microsoft.com/support/kb/articles/q160/4/22.asp.

8. M∙j PHP skript pracuje na IE a Lynxu, ale v Netscapu Φßst v²stupu mizφ. Kdy╛ si zapnu "Zobrazit zdrojov² k≤d", v IE vidφm obsah, v Netscapu nikoliv.

Netscape je striktn∞j╣φ ohledn∞ HTML tag∙ (nap°. tabulek) n∞╛ IE. Kontrola HTML v²stupu pomocφ HTML validßtoru, jako je validator.w3.org, m∙╛e b²t nßpomocna. Nap°φklad chyb∞jφcφ </table> zp∙sobuje v²╣e uveden² problΘm.

IE i Lynx takΘ ignorujφ jakΘkoliv nulovΘ (\0) znaky v HTML proudu, Netscape nikoli. Nejlep╣φ cestou k ov∞°enφ je zkompilovat verzi PHP pro p°φkazovou °ßdku (znßmou jako CGI verze) a spustit skript z p°φkazovΘ °ßdky. Na *NIXech to p°esm∞rujte do od -c a hledejte znaky \0. Pod Windows musφte najφt editor nebo jin² program, kter² umo╛≥uje prohlφ╛enφ binßrnφch soubor∙. Kdy╛ Netscape uvidφ v souboru nulov² znak, typicky nic dal╣φho nezobrazφ, aΦkoli IE i Lynx ano.

9. JakΘ jsou p°edpoklady mφchßnφ XML a PHP? St∞╛uje si to na moje <?xml> tagy!

Musφte vypnout krßtkΘ tagy v souboru php.ini nastavenφm short_tags na 0 nebo pou╛itφm odpovφdajφcφ direktivy Apache. M∙╛ete takΘ pou╛φt sekci <File> k selektivnφmu nastavenφ.

10. Jak mohu pou╛φt PHP s FrontPagem nebo jin²m HTML editorem, kter² trvß na odsunutφ mΘho k≤du?

Jednφm z nejjednodu╣╣φch zp∙sob∙ je povolit pou╛itφ ASP tag∙ v PHP k≤du. To umo╛nφ pou╛φvat odd∞lovaΦe v ASP stylu (<% a %>). N∞kterΘ populßrnφ HTML editory s pracujφ (v tuto chvφli) inteligentn∞ji. K zapnutφ ASP tag∙ musφte v souboru php.ini nastavit prom∞nnou asp_tags nebo pou╛φt p°φslu╣nou direktivu Apache.

11. Kde najdi ·pln² seznam dostupn²ch p°ednastaven²ch prom∞nn²ch, a proΦ to nenφ zdokumentovßno v dokumentaci PHP?

Nejlep╣φ metodou je vlo╛it do strßnky <?php phpinfo(); ?> a naΦφst to do prohlφ╛eΦe. Zobrazφ se informace v╣eho druhu o nainstalovanΘm PHP, vΦetn∞ seznamu prom∞nn²ch prost°edφ i specißlnφch prom∞nn²ch nastavovan²ch HTTP serverem. Tento seznam opravdu nem∙╛e b²t zdokumentovßn v dokumentaci k PHP, prot╛e se li╣φ server od serveru.

12. Zkou╣φm p°istupovat k jednΘ ze standardnφch CGI prom∞nn²ch (jako je $DOCUMENT_ROOT nebo $HTTP_REFERER) v u╛ivatelsky definovanΘ funkci, a nem∙╛e ji to najφt. Co je ╣patn∞?

Prom∞nnΘ prost°edφ jsou normßlnφ globßlnφ prom∞nnΘ, tak╛e je musφte bu∩ deklarovat ve funkci jako globßlnφ prom∞nnΘ (nap°φklad pou╛itφm "global $DOCUMENT_ROOT;") nebo pou╛φt pole globßlnφch prom∞nn²ch (nap°. "$GLOBALS["DOCUMENT_ROOT"]").