Forum und email
Používání PHP

Kapitola 55. 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 https://support.microsoft.com/kb/q160422/.

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"]").