Autor Zpráva
HGD
Profil
Mam problém, mam ve scriptu napsáno:

if ($addnew) {
header("Location: ./guestbook.php");
}

je to po odeslání příspěvku a správném zapsání do DB, by se to mělo přesměrovat, ale nevim čim to je, ale vypisuje to chybu:
Warning: Cannot modify header information - headers already sent by (output started at c:program fileseasyphp1-8wwwphprsguestbook.php:308) in c:program fileseasyphp1-8wwwphprsguestbook.php on line 184
ps.: testuju na localhostu
Limit
Profil *
To znamená že před použitím header vypisuješ do stránky nějaký text:
header musíš použíš před jakýmkoliv výstupem
HGD
Profil
to já vim, a nikde tam žádnej výstup "snad" nejni, tady je kousek:
	// ak je vsetko v poriadku zapise do DB

if (empty($commentGB)) {

if ($p_emailGB === "@") {$p_emailGB = "";}
if ($p_homepageGB === "http://") {$p_homepageGB = "";}

$addnew = $GLOBALS['guestbook']->zapis();

if ($GLOBALS['prmyctenar']->ctenarstav == 1) {
setcookie("phprs_gbk_web","".$p_homepageGB."", time()+864000);
}

// ak sa zapisalo do DB presmeruje na hlavnu stranku kvoli zamedzeniu ulozenia v cache
if ($addnew) {
header("Location: guestbook.php");
}
else{
echo 'nejde asi to';
}
}
Limit
Profil *
stačí i mezera před <? začátkem skriptu
one
Profil
tak dej na začátek: ob_start();
anode
Profil
stačí i špatný BOM, pokud to máš třeba v UTF-8
HGD
Profil
2 Limit: mezera před začátkem scriptu, hm... tomu moc nevěřim že by to dělalo chybu, když script může začínat kdekoliv...

2 anode: BOM ani newim co znamená...

2 one: na ob_start(); už to běhá, ale nemusí se to nějak zavírat? sem něco čet v php manualu, ale nepobral sem to
Limit
Profil *
skript může začínat kdekoliv, ale header nemůžeš odesílat kdekoliv, takže i mezera před začátečním tagem skriptu, nebo echo před headerem ti to zbourá
World
Profil
ukončuje se: ob_end_flush();

BOM - mezera, kterou nějaké editory vkládají. Pokud používáš PSPad, tak Nastavení->Nastavení programu->Program chování->Vkládat iden. byty na začátek <-VYPNOUT
nightfish
Profil
ještě že tu máme FAQ, které všichni před položením dotazu do sekce PHP čteme...
HGD
Profil
a to zakončení ob_end_flush(); tam musí bejt? a jestli jo, tak stačí to bejt hned za headerem nebo až nakonec???
Díky
bukaj
Profil
HGD
a to zakončení ob_end_flush(); tam musí bejt?
nemusí. ale pokud ho tam nedáš, tak se nic nepošle a prohlížeč obdrží prázdnou stránku ;)

a jestli jo, tak stačí to bejt hned za headerem nebo až nakonec???
stačí za tím headerem. ale nejjistější je to dát nakonec. co kdyby jsi ještě nějaký header (nebo manipulaci s cookie) doplnil. pak by jsi tu byl s tím úplně samým, pokud by tě nenapadlo dát to až za to další.
HGD
Profil
ale zajmaví je, že sem dal jenom na začátek scriptu ob_start(); a ob_end_flush(); tam nemam a funguje to bezvadně...tak newim no, třeba sem se naučil koutlit :-D
Limit
Profil *
třeba se to na konci skriptu odešle samo protože to nenašlo ob_end...
one
Profil
Limit
Nejspíše ano, jelikož já to mám stejně jako zde uvedl HGD a funguje mi to také bez problémů, ale raději to tam hodim, přece to zakončení není jen pro srandu králíkům, nebo se pletu? :)
Pavel Strejček
Profil
HGD

Nebylo by lepší najít ten výstup, který se odesílá před headers než tam dávat ob funkci která třeba není zapotřebí a bude zbytečně zatěžovat server?
one
Profil
Pavel Strejček
Ta funkce může zatěžovat server? já se stejně bez této funkce neobejdu, jelikož ten výstup předtím nemůžu nikam jinam posunout, takže mi stejně nic jiného nezbývá, ale zajímalo by mě to o té zátěži. Je o tom popř. i nějaký článek?
HGD
Profil
to by mi docela tyky zajímalo jak to může zatěžovat, i když tomu nerozumim...
nicméně tu funkci sem tam nechal celou, tzn. i s "koncem"
Pavel Strejček
Profil
Myslel jsem to tak, že proč komplikovat kód další funkcí, která má nějakou režii, když to jde bez ní, ale jestli by to vyžadovalo velké úpravy aplikace tak to chápu.

OB funkce mají své výhody i nevýhody. Mohou zvýšit rychlost vykonávání skriptu (typicky když je výstup rozkouskován na mnoho použití echo), ale také zvyšují nároky na pamět - výstup se ukládá do bufferu a pak se odešle najednou .

Tím že se výstup zachytává a neodesílá postupně je nevýhoda pro návštěvníka webu - musí déle čekat na data.

http://atomized.org/2005/04/php-performance-best-practices/

Porovnání rychlosti output bufferingu oproti spojování řetězců:
http://www.undefinedfire.com/indetail/view/strings-vs-output-buffering .html
one
Profil
Pavel Strejček
Díky, to jsem potřeboval vedět, no jelikož někde to můžu předělat, sice to bude fuška, ale když to zvýší výkon aplikace (pro uživatele) tak do toho klidně ten čas vložím ;-)

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: