Avatar
Jeff
Člen
Avatar
Jeff:

Zdravím, učím se zde PHP a v díle 9."Vylepšení kontaktního formuláře v PHP", jsem se dočetl, že funkce header funguje pouze v případě, že jsem ještě nevypsal žádný text, tak jsem zkusil tento případ

soubor index.php

<html>
        <body>
            <p>HTML text</p>
                <?php
                        echo('PHP text');
                        header('Location: test.php');
                        exit;
                ?>
        </body>
</html>

soubor test.php

<?php
echo('test v jiném souboru');
?>

A žádnou chybu mi to nevyhodilo viz. online verze http://reenergyhowebprojekty.4fan.cz/
Možná, jsem to špatně pochopil (hledal jsem i na internetu). Mohl by mi prosím někdo poradit proč mi to nevyhodí chybu "Headers already sent" popřípadě opravit můj omyl Díky :)

P.S: Druhý soubor jsem nedával do HTML těla, čistě z úsporných důvodů (chybu to nevyhazuje ani když tam tělo je).

 
Odpovědět 15.7.2015 0:41
Avatar
Michal Vašíček
Tým ITnetwork
Avatar
Odpovídá na Jeff
Michal Vašíček:

Chybu by ti to opravdu vyhodit mělo, protože HTTP hlavičky prohlížeč zpracovává ještě před samotným obsahem stránky. Deklaruje se pomocí nich například také typ obsahu (i když se jedná o .php soubor, pomocí hlavičky můžeš prohlížeči říct, že mu předáváš JSON, který pak vygeneruješ v tom PHP, on se podle toho bude chovat). Zkoušel jsem to i u sebe na serveru, též se redirect provede. Pokud se tu nedočkáš reakce, doporučuju kontaktovat Jakuba Vránu, který se na PHP podílí.

Jinak, k tomu PSku - HTML tělo tam vůbec být nemusí, stačí, když před posláním hlavičky vypíšeš jediný znak včetně mezer. Teda, mělo by to stačit podle dokumentace PHP. Ale očividně nestačí.

Nahoru Odpovědět  +1 15.7.2015 1:01
Příspěvek může obsahovat stopy arašídů, sarkasmu a sóji.
Avatar
Richard
Člen
Avatar
Richard:

Chybu to nemusí vyhodit, záleží na nastavení PHP.
Více se dočteš když zagooglíš output buffering .

Každopádně hlavičky by jsi měl mít na začátku z toho důvodu co psal Michal Vašíček

Nahoru Odpovědět 15.7.2015 1:05
$action = $_GET['Life']; | Když dáš mínus, napiš proč!
Avatar
Michal Vašíček
Tým ITnetwork
Avatar
Odpovídá na Richard
Michal Vašíček:

Output buffering na mém serveru asi zaplý není (díval jsem se na defaultní hodnoty a měl by být vyplý, já ho určitě nezapínal), a i přesto mě to redirectne. Buď nějaká záhadně se objevující vlastnost v PHP nebo činnost vyšší moci. :D

Nahoru Odpovědět 15.7.2015 1:09
Příspěvek může obsahovat stopy arašídů, sarkasmu a sóji.
Avatar
Michal Vašíček
Tým ITnetwork
Avatar
Michal Vašíček:

Ještě bych tě teoreticky trochu víc uvést do situace. Když header pošleš po odeslání nějakého textu, je to jako kdybys kamarádovi dal napít metanolu, a až po tom, co vypije smrtelnou dávku (smrtelná dávka = 1 jediný znak na začátku souboru před hlavičkami) bys mu řekl, že metanol je jedovaný a že z toho oslepne. S tím už toho ale kamarád moc nenadělá.
Stejně pracuje prohlížeč či robot. Ty mu naservíruješ nějaká data, on je v průběhu servírování už vykresluje a pak mu řekneš, že po tobě měl chtít nějaké jméno a heslo. Prohlížeč už ti ale stránku vykreslil a tak s tím toho taky moc nenadělá. Je to jako kdyby sis pustil do domu vědomě zloděje, on ti dům vybílil a ty na něj pak řval přes celou ulici, že sis to rozmyslel a že ty věci chceš zpátky. Když ale pošleš header o autorizaci, zloděj nemá klíč a tak se do domu nedostane. :)

Editováno 15.7.2015 1:19
Nahoru Odpovědět  +1 15.7.2015 1:17
Příspěvek může obsahovat stopy arašídů, sarkasmu a sóji.
Avatar
Richard
Člen
Avatar
Odpovídá na Michal Vašíček
Richard:

V phpinfo() máš u hodnoty output_buffering co?

Dovolím si drobek techničtější vyvětlení ob.

Pokud je vypnutý, tak se každý výpis hned posílá prohlížeči, takže když je stránka co byla uvedená v příkladu a ob je vypnutý, tak prohlížeč dostane text a potom hlavičky, což je průser a vyskočí chyba.

Pokud je zapnutý, php odesílá výsup až po dokončení skriptu, veškerý výstup zatím čeká v bufferu, tím pádem může php nejdříve odeslat hlavičky i když jsou v těle dokumentu.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +5 15.7.2015 1:26
$action = $_GET['Life']; | Když dáš mínus, napiš proč!
Avatar
Michal Vašíček
Tým ITnetwork
Avatar
Michal Vašíček:

Určitě ne defaultní hodnotu. 4096
Víme v čem je problém, jdu to vypnout.

Editováno 15.7.2015 10:38
Nahoru Odpovědět 15.7.2015 10:38
Příspěvek může obsahovat stopy arašídů, sarkasmu a sóji.
Avatar
Jeff
Člen
Avatar
Jeff:

Děkuju moc vám oboum, hned v tom mám víc jasno :)

 
Nahoru Odpovědět 15.7.2015 11:18
Avatar
mkub
Redaktor
Avatar
Odpovídá na Jeff
mkub:

doporucuje sa davat na uplny zaciatok skriptu funkcie, co posiela hlavicky, lebo aj samotny html kod ti posle hlavicku a podla nastavenia PHP sa ti moze zobrazit chyba pri funkcii header(), ze uz bola raz poslata hlavicka...
a takisto sa nedoporucuje ani ukoncovat skript ?>, kedze skript sa automaticky dokonci pri natrafeni znaku EOF

 
Nahoru Odpovědět  +1 16.7.2015 1:04
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.