PHP FAQ

Jiří Kosek


V následujících odstavcích se pokusím zodpovědět na nejčastější dotazy a problémy, se kterými se setkávají především začínající uživatelé systému PHP. Vycházím přitom ze skutečných dotazů, se kterými jsem setkal během výuky PHP a v různých diskusních skupinách.

1. Obecné dotazy
1.1. Nainstaloval jsem si úspěšně PHP4, ale skriptům se nepředávají proměnné z formulářů.
1.2. Ani předchozí krok nepomohl, stále se mi některé proměnné z formulářů nepředávají.
1.3. Ve skriptu potřebuji použít funkci blabla(), ale PHP mi při jejím použití ohlásí: Fatal error: Call to undefined function: blabla() in název skriptu on line řádka
1.4. Lze nějak zařídit, aby se obsah proměnných zachoval i při přechodech uživatele mezi stránkami?
2. Hosting podporující PHP, dokumentace, kde hledat pomoc
2.1. Rád bych své skripty umístil na Internetu, nechci za to však nic platit žádné web-hostingové firmě.
2.2. Kde mohu najít nějaké informace o PHP v češtině nebo slovenštině, angličtina totiž není moje silná stránka?
2.3. Existují nějaká diskusní fóra, kde mohu konzultovat své problémy s ostatními vývojáři používajícími PHP?
3. Dotazy týkající se knihy „PHP – tvorba interaktivních internetových aplikací“
3.1. Připravuje se aktualizace knihy pro PHP4?
3.2. Jak mohou vygenerovat indexový soubor pro vlastní soubor se vtipy či jinými texty?
3.3. Jak mohu obsah formuláře odeslat e-mailem?
3.4. Proč mi nefunguje skript mailbox.php?
4.1. Přečetl jsem všechny manuály a prošel všechna diskusní fóra, ale řešení problému jsem nezjistil.

1. Obecné dotazy

1.1.

Nainstaloval jsem si úspěšně PHP4, ale skriptům se nepředávají proměnné z formulářů.

Tento problém jste si způsobili sami snahou o co nejvýkonnější server. Distribuce PHP4 pro Windows obsahuje dva předpřipravené konfigurační soubory php.iniphp.ini-dist a php.ini-optimized. Většina uživatelů slepě sáhne po druhém konfiguračním souboru. Ten však vypíná mnoho funkcí interpretu PHP, aby maximálně urychlil jeho běh. Vypnuté je v něm i načtení parametrů z formulářů do proměnných. Pro jeho zapnutí stačí v php.ini správně nastavit hodnotu direktivy register_globals:

register_globals = On

Od verze PHP 4.2 je direktiva register_globals standardně vypnutá. Je to z toho důvodu, že automatické předávání formulářových polí do proměnných může vést k snadnějšímu vytvoření skriptu s bezpečnostní chybou. Direktivu samozřejmě můžete zapnout, ale z dlouhodobého pohledu je lepší používat novou metodu pro přístup k obsahu formulářových polí.

K dispozici je několik tzv. superglobálních proměnných, které jsou dostupné kdekoliv ve skriptu (i uvnitř funkcí). Data odeslaná metodou post jsou dostupná pomocí $_POST["jméno_pole"] a ta odeslaná metodou GET pak pomocí $_GET["jméno_pole"].

1.2.

Ani předchozí krok nepomohl, stále se mi některé proměnné z formulářů nepředávají.

Nejpravděpodobnější je varianta, že někdy v minulosti jste si v prohlížeči uložili cookie se stejným názvem jaký má proměnná. Při předávání proměnných skriptům mají cookies standardně vyšší prioritu než proměnné z formulářů. Řešením je buď přejmenovat proměnné, nebo si nepotřebné cookies z prohlížeče vymazat.

Pokud vaše aplikace používá cookies, vyplatí se používat prohlížeč, který umožňuje snadné prohlížení a odstraňování cookies. Takovým prohlížečem je například Mozilla, která získala ocenění produkt roku. Zkuste v ní příkaz Tasks->Privacy and Security->Cookie Manager->View Stored Cookies.

1.3.

Ve skriptu potřebuji použít funkci blabla(), ale PHP mi při jejím použití ohlásí:

Fatal error: Call to undefined function: blabla() in název skriptu on line řádka

Ve skriptu jste použili funkci, kterou vaše PHP nezná. Ze všeho nejdřív je dobré zkontrolovat, zda v názvu funkce není překlep. Pokud funkce stále nepracuje, jedná se o funkci, která je součástí nějakého modulu PHP – těchto modulů lze v PHP použít několik, umožňují například spolupráci s různými databázemi, vytváření obrázků apod. Je možné, že funkce patří do modulu, který nemáte v PHP načtený. Přehled modulů, které vaše PHP podporuje zjistíte velice jednoduše pomocí funkce phpinfo(), která vypíše kompletní informaci o konfiguraci interpretu PHP. V novějších verzích PHP je k dispozici speciální funkce, která vrací pole s názvy všech aktivních modulů:

print_r (get_loaded_extensions());

Pokud vaše funkce patří do modulu, který není načtený, musíte modul do PHP přidat. Nejjednodušší situace je asi ve Windows. Zde stačí do souboru php.ini přidat řádku

extension = php_název_modulu.dll

Dostupné moduly jsou přitom nejčastěji uloženy v adresáři extensions v adresáři s PHP. Některé moduly závisí na dalších DLL knihovnách v adresáři dlls, ty je potřeba nakopírovat do nějakého adresáře, kde je Windows najdou. Například c:\winnt\system32.

Na unixových systémech je několik možností, jak modul přidat, a podstatně závisí na tom, jak je PHP zkompilováno. Mnoho uživatelů používá nové distribuce Linuxu a má Apache i PHP nainstalováno z nějakých distribučních balíčků jako RPM. Mohou zde být připraveny i balíčky s dalšími PHP moduly. Většinou je stačí nainstalovat a pak v php.ini přidat další direktivu extension, podobně jako na Windows. Přípona modulu je obvykle .so místo .dll.

Pokud jste si PHP sami sestavili ze zdrojových kódů, musíte znovu provést kompilaci. Před ní je potřeba spustit příkaz ./configure s odpovídajícími parametry. Pro většinu modulů má patametr tvar --with-název_modulu. Kompilaci se zde bohužel nemůžeme věnovat nijak detailně, podrobnější informace naleznete v dokumentaci k PHP.

1.4.

Lze nějak zařídit, aby se obsah proměnných zachoval i při přechodech uživatele mezi stránkami?

Možností je několik. V jednoduchých případech lze všechny proměnné předávat jako parametry v URL adresách odkazů a ve skrytých formulářových polích. Tento postup je však dost pracný, není moc bezpečný a zbytečně zvyšuje objem dat přenášených mezi klientem a serverem.

Existuje mechanismus tzv. session proměnných, jejichž hodnota se pro jednotlivé uživatele aplikace automaticky přenáší mezi stránkami. V PHP4 jsou session proměnné standardní součástí jazyka, v PHP3 můžete použít nějakou rozšiřující knihovnu, např. PHPLIB. Podrobnější informace naleznete na stránkách http://www.kosek.cz/clanky/php4/session.html a http://www.kosek.cz/clanky/phplib/session.html.

2. Hosting podporující PHP, dokumentace, kde hledat pomoc

2.1.

Rád bych své skripty umístil na Internetu, nechci za to však nic platit žádné web-hostingové firmě.

Existují i „free-weby“, které podporují PHP a někdy i databázi MySQL. Jejich použití je však vhodné pouze pro malé projekty – díky velkému zájmu uživatelů mají velmi často problémy s výkonem. Nejlépe, když je sami vyzkoušíte – http://www.kgb.cz, http://www.fbi.cz, http://www.miesto.sk, http://www.yo.cz, http://www.egarden.cz, http://www.oceany.cz, http://www.host.sk, http://www.crolink.cz a http://www.webzdarma.cz. Nic není samozřejmě úplně zadarmo. Na většině serverů musíte na své stránky umístit reklamní banner.

2.2.

Kde mohu najít nějaké informace o PHP v češtině nebo slovenštině, angličtina totiž není moje silná stránka?

Dnes už je situace poměrně příznivá. O PHP vydalo původní českou knihu nakladatelství Grada, Computer Press v brzké době vydá překlad knihy od nakladatelství Wrox. Vzniká i český překlad originálního manuálu, který je dostupný na adrese http://www.php.net/manual/cs/. České servery zaměřené na vývojáře přinášejí samozřejmě i informace o PHP. Zkuste servery jako http://www.builder.cz, http://www.root.cz, http://www.interval.cz, http://www.php.sk nebo http://www.developer.sk.

2.3.

Existují nějaká diskusní fóra, kde mohu konzultovat své problémy s ostatními vývojáři používajícími PHP?

Začal bych asi diskusní skupinou cz.comp.lang.php. Pokud nevíte, jak s diskusní skupinou pracovat, zkuste do prohlížeče napsat adresu news://csnews.vslib.cz/cz.comp.lang.php.

Existují i diskusní fóra přístupná přímo z prohlížeče. Mezi nejnavštěvovanější patrně patří klub PHP na Průvodci a diskusní fórum PHP na serveru Builder.cz.

3. Dotazy týkající se knihy „PHP – tvorba interaktivních internetových aplikací“

3.1.

Připravuje se aktualizace knihy pro PHP4?

Připravuje, ale nebude hotová dříve než během roku 2003 – je to zkrátka hodně práce a den má jen 24 hodin. PHP4 přidává oproti předchozí verzi několik nových rysů, ale z hlediska psaní skriptů nijak zásadních. Kniha je tedy stále aktuální, největší rozdíly mezi PHP3 a PHP4 jsou popsány na stránce http://www.kosek.cz/clanky/php4/. Podrobnější informace jsou v originální dokumentaci.

3.2.

Jak mohou vygenerovat indexový soubor pro vlastní soubor se vtipy či jinými texty?

Lze k tomu použít program strfile, který je standardní součástí mnoha unixových distribucí. Máte-li Windows, stáhněte si zkompilovanou verzi. Program vyžaduje, abyste v systému měli nainstalovánu knihovnu cygwin1.dll. Pro vygenerování datového souboru vtipy.dat pro soubor vtipů vtipy.txt slouží příkaz:

strfile vtipy.txt vtipy.dat
3.3.

Jak mohu obsah formuláře odeslat e-mailem?

Obsluha formuláře je popsána ve skriptu na straně 107. Pokud chcete data získaná ve formuláře odeslat na nějakou e-mailovou adresu, přidejte za řádek

// Zde se mohou získané informace libovolně zpracovat

následující kód:

if (@Mail("prijemce@nekde.cz", "Formular ze stranky", 
          "Jmeno: $Jmeno\n" .
          "Prijmeni: $Prijmeni\n" .
          "Pohlavi: $Pohlavi\n" .
          "E-mail: $Email\n" .
          "WWW: $Web\n\n" .
          "Datum a cas odeslani formulare: " . Date("d.m.Y H:i:s")))
  echo "<p>Formulář byl úspěšně odeslán.</p>\n";
else
  echo "<p>Při odesílání formuláře došlo k chybě.</p>\n";
3.4.

Proč mi nefunguje skript mailbox.php?

Problém je zapříčiněn nekompatibilitou mezi PHP3 a PHP4. Na řádce 11 skriptu je použito následující volání funkce:

$spojeni = @IMAP_Open("{$server/pop3}INBOX", $jmeno, $heslo);

Obsah proměnné $server se má přitom vložit do složených závorek tak, jak to očekává funkce IMAP_Open(). V PHP4 se však zápis {$ používá pro odkaz na neskalární proměnné jako pole a objekty. Dojde proto k syntaktické chybě. Chybu lze poměrně snadno opravit např.:

$spojeni = @IMAP_Open("{" . "$server/pop3}INBOX", $jmeno, $heslo);
4.1.

Přečetl jsem všechny manuály a prošel všechna diskusní fóra, ale řešení problému jsem nezjistil.

Prostudujte všechnu dokumentaci pečlivě ještě jednou a hlavně NEPROPADEJTE PANICE.

© Jiří Kosek 2000-2002