» »

PHP problem z header() funkcijo

PHP problem z header() funkcijo

PrimozBo ::

Včeraj mi je skripta delala, danes pa brez da bi karkoli spreminjal dobim sledečo napako:

Warning: Cannot modify header information - headers already sent

Vem kaj pomeni ampak v datoteki ni nobenega html-ja, nimam nič echo ali print, preveril sem tudi da ni praznih vrtic pred in na koncu php tagov.

Zadeva se pojavlja dokaj pogosto in nevem kaj je vzrok, ko kodo skopiram v novo datoteko deluje brez napake.
Uporabljam win XP ter notepad++.

darkolord ::

Ja nekaj se definitivno pošlje preden probaš nastavit header. Poglej, če je datoteka morda v UTF8 formatu z BOM na začetku...

BigWhale ::

Poleg BOM pri UTF8 je php end tag najvecje zlo. Odstrani ga, v vecini primerov se tega taga itak ne rabi.

darkolord ::

Zakaj že?

PrimozBo ::

Kaj je BOM in kako to preverim ?

Sicer pa če je na strani določen charset=utf-8 potem verjetno mora biti stran shranjnena kot utf-8 da šumniki pravilno delujejo ?

darkolord ::

Ko odpreš fajl v Notepad++ ti spodaj desno piše encoding oz format. Morda ga tam lahko tudi spremeniš...

Zgodovina sprememb…

  • spremenilo: darkolord ()

EnSmotko ::

Mislim, da maš v notepad++ clo možnost izbire: utf8 with BOM in utf8 without BOM. Mal se probej poigrat s tem, mogoče v tem grmu tiči zajc. Drgač pa prever, če imaš slučajno kje še kak whitespace, na koncu datoteke pa, kot je tud že blo rečen, odstrani php end tag...

fiction ::

Kaj je BOM in kako to preverim ?
Byte Order Mark. Pac poglej kaj so prvi bajti v datoteki.

Zakaj je PHP end tag lahko problematicen?

Icematxyz ::

Zakaj je PHP end tag lahko problematicen?


Problematičen je če mu kaj sledi. Kakšen "whitespace" ki lahko povzroči težave. Kot so naprimer "headers already sent" type error" in še kaj drugega.

Nekateri programerji celotno kodo v eni datoteki pa naj bo PHP ali HTML napišejo med začetno < ? php in končno ?> značko. Drugi pa spet to mešajo na način da vsak odsek php kode "zaprejo" med ti dve znački.

In potem lahko dobiš nekaj takšnega:

?>

// konec datoteke

In kaj se pojavi med zaključno značko in koncem datoteke? Whitespace.
Tudi kakšna napaka začetnika ali po pomoti koga ki zadevo že pozna kot je kakšen carriage return, line feed, tab, space... povzroči isto težavo.

Če te značke ne napišeš bo pa php ob koncu datoteke tako sam uporabil auto close. In strahu za višje opisane primere ni več.

Je pa to tudi opisano v knjigi katero sem priporočil v temi o PHP literaturi.

fiction ::

Problematičen je če mu kaj sledi. Kakšen "whitespace" ki lahko povzroči težave. Kot so naprimer "headers already sent" type error" in še kaj drugega.
Ok, ampak problem s header() je samo v tem, da ne sme biti kaksnega outputa prej. Se pravi zakljucni tag je problem lahko le, ce includas nek PHP file pred tem (in ima ta ?> whitespace notri).

Če te značke ne napišeš bo pa php ob koncu datoteke tako sam uporabil auto close. In strahu za višje opisane primere ni več.
Hm autoclose. A pa to res deluje v vseh verzijah? Mene izgleda taka resitev grda. Kot npr. stil da napises if (42 == spremenljivka), tako da se ne mores zatipkati z =. Sej se cisto strinjam, da je to uporabno, ce se ti tak typo pogosto dogaja, ampak izgleda pa vseeno cudno in jaz tega ne prakticiram.

A se ne bi dalo nekako reci, da je neka datoteka "pure PHP" (brez HTML-ja) in potem ne bi rabil niti zacetne oznake, kar bi bilo bolj clean kot pa da imas en tag drugega pa ne?

BigWhale ::

Zakaj že?


Parser sam po sebi ne nuca end taga, ce ne mesas php in html kode (ce to pocnes je itak ze neki drucga narobe) in en tak end tag kateremu sledu whitespace v enem izmed include-ov lahko povzroci precej glavobola.

xyd1 ::

sam sem imel podoben problem,.... rešil sem tako....

<?php
$stran = $_GET['stran']; //dobimo ime strani (kero moremo prikazati)
switch ($stran)
{
	//Tukaj pridejo linki ffs!!! za vsako poglavje!
	default:
	$file = "podstrani/sredina.php";
	$glava = "";//nastaviš glavo
	$title = "naslov strani";//naslov strani
	break;
	

        case "zgodovina":
	$file = "podstrani/tam_neki_zgodovina.php";
	$glava = "";
	$title = "blabla";
	break;
.
.
.
.
.

};

if($glava != "")//preveri če je glava določena
{
	include $glava; //nastavimo "glavo"
};
?>

<title><? echo  $title; ?></title>


kodo sem malo spremenil pred objavo tako da je možna kaka napaka,... no bistvo vsega je, da v tem primeru lahko "naknadno" spreminjaš header... kljub temu da je že določena "od prej"... to je bila rešitev za moj problem,... nevem če bo delovala pri tebi

ps: slovnica ni moje področje :P

PrimozBo ::

Sem rešil problem z uporabo encodinga "utf-8 brez BOM". Muči me zakaj je zadeva recimo prvi dan delovala naslednji dan pa ne. Kdaj se je ta znak prikradel v datoteko.

Hvala vsem za pomoč.

BigWhale ::

Takrat, ko si Č napisal v datoteko. :)


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

PHP - header : javi napako

Oddelek: Izdelava spletišč
61271 (1226) Camel
»

Šumniki v php-ju

Oddelek: Izdelava spletišč
214718 (3221) JoSmo
»

Koda za prijavo

Oddelek: Izdelava spletišč
81205 (1060) alien01
»

Byte-Order Mark found in UTF-8 File.

Oddelek: Izdelava spletišč
51105 (1070) krho
»

PHP in forme

Oddelek: Izdelava spletišč
101111 (925) Japonski

Več podobnih tem