Autor Zpráva
dis
Profil
Dobrý den,
snažím se pochopit cizí kód a narazila jsem na situaci, kdy se v případě odeslání formuláře, což testuje pomocí isset($_POST['odeslano']), má stránka přesměrovat jinam odesláním hlavičky příkazem header("location:stranka.php"). Přesměrování proběhne správně, ale zároveň se ještě "stihne" provést akce, dejme tomu zápis do databáze, která je v témže skriptu za touto podmínkou (nikoli v části else, prostě jen chronologicky dále). Příkaz header() je použit bez exit, break či die().

Sama jsem to takhle nikdy nepoužila a trochu mě to nejdřív zaskočilo. Čekala bych, že po přesměrování se automaticky provádění skriptu ukončí a na žádnou z dalších akcí nemůže dojít. Takhle se to ovšem samozřejmě chová, pokud do podmínky za header přidám exit.

Stávající skript vypadá zhruba takto:
<?php
if (isset($_POST['odeslano'])) {
  header("location:stranka.php");
}
... // tady je potřebné připojení k databázi - mysql_connect(), mysql_select_db()... atd.
$sql = mysql_query("INSERT INTO table (pole1, pole2) VALUES (value1, value2);");
?>

Můj dotaz zní, jestli je tohle standardní chování, na které se dá spolehnout a používat ho tak vždy, nebo jestli to je jen shoda okolností, třeba nastavení PHP na serveru atd.

Děkuju za odpovědi.
Nox
Profil
http://php.net/function.header
Záleží na aktuálním stavu output bufferingu, který lze nastavit i pro server. Každopádně pokud chceš v daném místě hned přesměrovat, tak určitě použij i exit/die a nespoléhej na to, jestli zrovna na tomhle serveru a na tomhle místě se bufferuje nebo ne. Ono taky v header() nemusí být jen přesměrování, ale třeba jen přenastavení cachování, content-typu apod.
dis
Profil
Nox:
Moc díky za reakci, to jsem potřebovala vědět :-)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: