Dvě nepříjemné chyby v PHP, které se obtížně hledají

Pokud začínáte s tvorbou dynamických webových stránek, není ojedinělým jevem, že se během programování dopustíte nepřesností v syntaxi. Jazyk vás pochopitelně na tento fakt upozorní a vám jen stačí sjednat nápravu. Mezi častou chybu v PHP například patří chybějící středník. Ten se projeví hlášením obsahujícím Parse error: syntax error, unexpected T_ECHO, expecting ‚,‘ or ‚;‘, přičemž následuje cesta k souboru a číslo řádku. Právě tento numerický údaj může být matoucí, protože odkazuje na řádek nacházející se až za problémem. Stačí však vědět, že je vhodné zkontrolovat i oblast okolo chyby. Pojďme se však nyní zaměřit na slibované nedostatky s hůře objevitelnou příčinou.

Výpis před přesměrováním

Zpracováváte skript a chcete, aby se v případě zavolání libovolné podmínky uživateli načetla jiná stránka? V tom případě provede přesměrování s použitím funkce header. Ovšem co dělat, když vás zaskočí následující varování Warning: Cannot modify header information – headers already sent? Odpověď je vcelku jednoduchá. Funkci header nelze použít po provedení výpisu. Ve skriptech se proto nachází na horních pozicích před samotným HTML. Toto použití neobstojí:

echo „Výpis“; //Nejprve provedu výpis
header(„Location: index.php“); //A poté chci přesměrovat

Ovšem pozor, za výpis se považuje i prázdný řádek. Přidejme si proto k našemu příkladu i pomocné číselné označení:

  1. <?php
  2. header(„Location: index.php“);
  3. ?>

Právě první řádek způsobuje potíže. Po malé úpravě již vše pracuje tak, jak má.

  1. <?php
  2. header(„Location: index.php“);
  3. ?>

Pokračování skriptu po použití funkce header

Podívejte se na následující kód:

<?php
$nahodneCislo = rand(0,1);
if($nahodneCislo == 0)
{
header(„Location: index.php“);
}
fopen(„pokusnySoubor.txt“,“a+“);
echo „Náhodné číslo je „.$nahodneCislo;
?>

Jak je možné, že se soubor vytvoří i v případě, kdy se proměnná $nahodneCislo rovná nule a dojde tedy k přesměrování? Jako zřejmé chování se zdá, že skript provede funkci header a tím svoji činnost ukončuje a další řádky již nevykonává. Tak tomu však není. Chceme-li skutečně zabránit spuštění zbývající části souboru, musíme se spolehnout na exit;. Neexistuje přitom rozdíl mezi exit; a exit(); Přidat lze i parametr udávající kód příčiny odchodu – např. exit(1);.

<?php
$nahodneCislo = rand(0,1);
if($nahodneCislo == 0)
{
header(„Location: index.php“);
exit;
}
fopen(„pokusnySoubor.txt“,“a+“);
echo „Náhodné číslo je „.$nahodneCislo;
?>

Tagy: , ,

O Ondřej Směták

Student, který se intenzivně zajímá o oblast IT a to především z pohledu webmastera a programátora GUI aplikací.