|
|
 |
Kapitola 50. 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"]").
User Contributed Notes Používání PHP |
 |
| There are no user contributed notes for this page. |
| |