Avatar billede nbj1 Praktikant
22. juli 2008 - 11:43 Der er 26 kommentarer og
1 løsning

header forståelse

jeg fatter ik det med header, er der en der kan foklare det så selv jeg kan forstå det ?? kan måske være svært:)
1 header skal sendes før tekst
2 ved ny header kan man bruge ob_end_flush(); men kan ik lige se hvad og hvorfor ??
hvad sker der når man sender en header ? og er den tidsbestemt ?
har header noget med databasen at gøre eller kun selve siden man går ind på ??
hvorfor kan jeg ikke flushe en header ??
alt om er jeg lidt træt af at få Warning: Cannot modify header information - headers already sent
det sker ofte når man bruger nye moduler i php-fusion.
Avatar billede janpolsen Nybegynder
22. juli 2008 - 11:57 #1
Jeg synes man kan lære en hel del af PHP's egen "beskrivelse": http://dk.php.net/header

Headers fortæller bl.a. klienten hvordan klienten skal opfatte det resterende indhold af siden som er ved at blive loaded.

Det vil sige, at hvis man først angiver, at en side skal tolkes som f.eks. et PNG-billede, så kan man godt angive yderligere headers i form af størrelse, om billede skal vises eller klienten skal åbne en save-dialog-boks, eller noget i den dur.
Man kan dog ikke sende billedet og så ændre headers til f.eks. et BMP-billede og så sende sådan et i samme omgang.

Derfor skal alle headers sendes først, inden der bliver sendt noget decideret indhold/kode.

ob_* bruges til at opsamle alt hvad der bliver sendt til klienten, således at man kan vente med at sende information til klienten og derved manipulere med dataene.
Avatar billede nbj1 Praktikant
22. juli 2008 - 12:17 #2
ja de forklare en del om header som også jeg har læst om her på eksp. men stadig popper de fejl op igen igen i forskellige sammenhæng
eks pt har jeg denne fejl

header("Location: ".FUSION_SELF."?page=search&type=".$_POST['type']."&query=".stripinput($_POST['query']));

gi denne fejl
Warning: Cannot modify header information - headers already ..
hvordan ser man hvad er sendt og hvad ik ?
så har jeg prøvet med en header funktion som denne

<?PHP
function php_end($header)
{
ob_end_flush();
if($header) header("location: $header");
mysql_close();
exit;
}
?>
for ligesom lukke men niks virker ik, igen hvad er sendt udaf header det kan jeg ik se tror det har noget med dette at gøre men er ik sikker

if (isset($page) && !preg_match("/^[_0-9a-z]+$/i", $page)) header("Location: ".BASEDIR.'index.php');
Avatar billede nbj1 Praktikant
22. juli 2008 - 12:35 #3
hvis jeg bruger echo headers_sent(); skrives det 1
Avatar billede supersquirrel Nybegynder
22. juli 2008 - 12:52 #4
Hvis du har din header kode midt i din html fil ex., så kan du ikke bruge den.
Avatar billede nbj1 Praktikant
22. juli 2008 - 13:10 #5
nej header skal sendes før tekst sendes ud klart
Avatar billede jakobdo Ekspert
22. juli 2008 - 13:18 #6
Men det er netop det som fejlen siger.
Du har sendt info til browseren, inden du kalder header().
Avatar billede janpolsen Nybegynder
22. juli 2008 - 13:26 #7
Prøv evt. at se, om der er sneget sig et mellemrum/linjeskift ind øverst i din kode.

Har du to PHP-filer:
------------------------------
<?php
header("Location: blablabla");
?>
------------------------------

og så denne hvor der er sneget sig et mellemrum ind alle først:
------------------------------
<?php
header("Location: blablabla");
?>
------------------------------

... så vil du netop få en "Warning: Cannot modify header information - headers already .." i sidstnævnte.

Hvis du ikke selv har 100% styr over dine headers og blot skal lave et automatisk hop til en ny URL, så kan du evt. lave det med java script:
------------------------------
<?php
echo "blablabla..."<br/>;
?>
<script type="text/javascript">
location.href="<?= FUSION_SELF."?page=search&type=".$_POST['type']."&query=".stripinput($_POST['query']); ?>";
</script>
<?php
echo "this will never be shown...";
?>
------------------------------

Headers har intet med database at gøre, som du spørger om, men som du ikke har fået svar på. Headers er udelukkende noget information som bliver sendt til den browser du sidder med.
Avatar billede janpolsen Nybegynder
22. juli 2008 - 13:27 #8
Hmm... Dette system har "fjernet" det mellemrum jeg satte ind i ovenstående eksempel... Det skulle se sådan ud (en _ angiver et mellemrum):
------------------------------
_<?php
header("Location: blablabla");
?>
------------------------------
Avatar billede jakobdo Ekspert
22. juli 2008 - 13:37 #9
Du kunne lave:

<?php
$url = FUSION_SELF."?page=search&type=".$_POST['type']."&query=".stripinput($_POST['query']);

// If no headers are sent, send one
if (!headers_sent()) {
    header('Location: ' . $url);
    exit;
}else{
echo '<script type="text/javascript">';
echo 'location.href="'.FUSION_SELF.'?page=search&type='.$_POST['type'].'&query='.stripinput($_POST['query']);';
echo '</script>';
}
?>
Avatar billede nbj1 Praktikant
22. juli 2008 - 14:03 #10
hvis jeg nu kun bruger nedestående skulle det vel i princippet virke ik ?
jeg får nemmelig ingen fejl, men der andet galdt da der kommer ingen søge resultat frem, så jeg tror vi stopper her da jeg først skal have fundet udaf hvorfor der ikke kommer nogen søge resultat frem.
tak til alle tror jakobdo kom med noget der kunne bruges så hvis vi kan blive enige om det så lukker jeg  efter svar
$url = FUSION_SELF."?page=search&type=".$_POST['type']."&query=".stripinput($_POST['query']);
Avatar billede jakobdo Ekspert
22. juli 2008 - 14:08 #11
Svar!
Avatar billede jakobdo Ekspert
22. juli 2008 - 14:23 #12
Takker for point.
Avatar billede janpolsen Nybegynder
22. juli 2008 - 15:02 #13
Du vil helt klart miste din header-warning, hvis du begynder at bruge javascript til at redirecte, frem for PHPs header(), men det hjælper desværre ikke så meget på din forståelse af håndteringen af headers.

Med andre ord, så omgår du dit problem frem for at finde "synderen" til dine warnings.
Avatar billede nbj1 Praktikant
22. juli 2008 - 15:10 #14
nej der har du ret jan, og jeg egenligt ligevidt des angående desvære, men jeg kan ik genneskue fejlen, så det er temmeligt umuligt for jer at gætte sig frem til hvor fejlen er. det som jakobdo kom med undgår jeg header som er lidt trals at arbejde med når man ikke kan gennemskue eller gætte mig til hvor den sender den header fra.
men der ik andet ¨får jeg læsser om det ffra bunden en dag.
Avatar billede jakobdo Ekspert
22. juli 2008 - 15:21 #15
nbj1: Jeg vil kraftigt anbefale du finder fejlen.
For sådan en fejl er skidt at efterlade i dit system.
Avatar billede nbj1 Praktikant
22. juli 2008 - 15:33 #16
jep du har ret jakobdo men har en anelse om, ok er ikke sikker men fejlen ikke kun er header relateret, da det du skrev 22/07-2008 13:37:19 bruger jeg det med $URL... giver så ikke fejl, da den jo får en header anden sted fra, script delen giver fejl med ala.. endeløs $end ved ik lige hvad det er den mener, nok noget med den mangler en } klamme.
Avatar billede nbj1 Praktikant
22. juli 2008 - 16:28 #17
men jakobdo det kan v;re du lige kan fortælle mig hvor når jeg bruger det script fra dig at den skriver
Parse error: syntax error, unexpected $end
Avatar billede nbj1 Praktikant
22. juli 2008 - 16:42 #18
jan er lidt ked af det hvis du vil have point opretter jeg et nyt spørgsmål da det faktisk er dit script der virker og der ingen fejl i søge funktionen.
ok som du selv siger så omgår jeg jo bare header fejlen.
Avatar billede nbj1 Praktikant
22. juli 2008 - 16:55 #19
men det ånde er jo så man flytter fejlen til et andet sted i php.filen
header("Location: blog.php?page=types&type=e&id=$id"); øv
Avatar billede janpolsen Nybegynder
22. juli 2008 - 21:19 #20
Ja, det var måske billige point til jakobdo, men det vil jeg ikke hænge mig i. Jeg er her for at hjælpe, ikke for at score point ;).

Hvis du bare vil omgå problemet alle steder, så kan du evt. lave en lille hjælpefunktion:
------------------
function jsredirect($url) {
    echo "<script type='text/javascript'>\n";
    echo "location.href='".addslashes($url)."';\n";
    echo "</script>\n";
}
------------------

Så kalder du den i stedet for header og angiver udelukkende en url, f.eks.:
------------------
jsredirect("blog.php?page=types&type=e&id={$id}");
------------------

Anyways... Har du mulighed for at sende den fil du har problemer med, eller er det integreret i PHP-fusion?

Eventuelt et link til en URL hvor jeg kan se det, så kan jeg i hvert fald se hvad der bliver sendt og som trigger dine warnings.
Avatar billede nbj1 Praktikant
22. juli 2008 - 22:11 #21
fint med den indstilling siten er http://esbnyt.dk og er modulet Blogs men kræver tilmelding for at se. problemet er en del af de moduler man kan finde rundt omkring kører med deres egne header som så giver et problem
Avatar billede janpolsen Nybegynder
22. juli 2008 - 22:50 #22
Weee... Esbjerg :)

Jeg er ked af at sige det, men jeg kan ikke forestille mig, at der er problemer i diverse moduler "rundt omkring". Måske taler vi lidt forbi hinanden eller jeg misforstår dig.

Der er absolut ikke noget i vejen med headers som sådan. Samtlige website sender dem afsted enten direkte eller indirekte (hvis man kan sige det). Hvad jeg mener er, at selv om du ikke angiver nogle headers på en hjemmeside, så bliver der stadig sendt nogen afsted.

Warnigen: "headers already sent" betyder ikke nødvendigvis, at DU har sendt nogle headers afsted. Det er mere fordi du har noget "indhold" afsted og inden indholdet bliver vist i en browser, så har browseren modtaget nogle headers behind-the-scene. Når du så efterfølgende prøver at lave en "header('Location: ..');", så får du warningen om, at der allerede er sent headers.

Kort og godt: Du må ikke have noget output i et script, INDEN der kommer et (eller flere) header('...')-kald. Dvs. ingen HTML-tags/tekst eller PHP-echo/print.
Avatar billede nbj1 Praktikant
23. juli 2008 - 06:54 #23
hehe hvorfor wee.. er du herfra ?
vi er stort set enige i den fremlægning, det er jo bare sådan at selve hovedmodulet har sin egen header mange moduler har også deres egen header, og har prøvet en del moduler der har haft problemer, om det så er sammenkøringen, eller dem der har lavet dem som ikke kan finde udaf af det skal være usagt, derudover har der været en del jeg helt eller delvis skulle ændre i ligefra sql delen til simple tekst eller mindre programering men det er en anden sag, men primært header.
Avatar billede janpolsen Nybegynder
23. juli 2008 - 11:21 #24
Born and raised... :)

Det som lyder mærkeligt er, at de små moduler/add-ons/extension/tilføjelser også prøver at skrive til headeren, men det kan selvfølgelig bare være min manglende indsigt i php-fusion.
Avatar billede nbj1 Praktikant
23. juli 2008 - 11:32 #25
okay ser man det, verden er lille hehe, det kode jeg har skrevet tidlige er fra et modul og jeg ser ofte ved header brug at de sættes ind længere nede i koden, ok jeg er bestemt ikke ekspert i php men love at rode med det heheh ok altid bedst når jeg får det til at virke, men kanon at man har noget der hedder eksperten kan jeg kun igen og igen sige.
Avatar billede jakobdo Ekspert
23. juli 2008 - 11:37 #26
header() kan jo sagtens stå længere nede i koden.

Dette vil fejle...
<?php
echo 'Noget';
header('Noget...');
?>

Men
<?php
$noget = 'Noget';
header('Noget...');
?>

Vil jo virke fint.

Ligeledes kan man bruge header() efter output, hvis ob_start(); benyttes, kan dog ikke anbefales.
Avatar billede nbj1 Praktikant
23. juli 2008 - 12:03 #27
nej har prøvet at lege lidt med ob_start(); men syntes ik det har virket, og ja der må ik være nogen echo før header output, men der kommer så fejlen tror jeg at i en fil har man en echo som så er kædet sammmen med næste fil evt med include eller anden måde og så går det galdt
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester