"Varför funkar inte header()?" -vad du gör för fel

PHPportalen Forum Index » PHP Mjukstart
Lägg ett bokmärke på hela tråden
Skapa nytt inlägg   Svara på inlägget Gå till sida 1, 2  Nästa
Visa föregående ämne :: Visa nästa ämne  
Startad av: Meddelande
HannesP



Medlem i: 4968 dagar

Status: Offline



#443496
Inlägg Skrivet: 2006-12-12 23:53      Ämne: "Varför funkar inte header()?" -vad du gör för fel Citera

De senaste dagarna har PHP-avdelningen dominerats av frågor rörande problem i samband med sessioner och header()-funktionen. Hittills har alla gjort precis samma fel. Jag ska förklara vilket fel du gör, och hur du åtgärdar det. Men för att du ska kunna förstå, måste du först veta hur webbläsaren kommunicerar med webbservern:

Hur utbyts data mellan servern och klienten?
Webbläsaren kopplar upp sig mot och skickar ett anrop till servern från vilken den vill ha en sida. Anropet kan se ut såhär: GET /index.html HTTP/1.1
Om servern får HTTP-anropet och det är rätt formulerat, skickar den tillbaks ett svar (response). Ett sådant HTTP-svar består av två delar, header och body, avdelade med en blankrad.
Headern är i sig uppbyggd av två delar, översta raden beskriver typen av svar, d.v.s "hur bra det gick" att hämta den efterfrågade sidan. Efter det följer en rad av värden, uttryckta i formen "Key: value".
Bodyn är själva huvuddatan i dokumentet, t.ex. HTML-koden i ett HTML-dokument, eller bilddatan i en bild.

Varför blir det fel?
Det funktionen header() gör, är att - som man av namnet kan gissa - ändra en sådan header. Du kan t.ex. ändra Location-headern för att dirigera webbläsaren till en annan sida.
När PHP-tolken tolkar en sida som efterfrågas, börjar den skicka ut data till klienten allteftersom den blir tolkad.
När du stöter på dina header()-problem, är det för att du modifierar en header efter att du har börjat skriva ut data i body-segmentet. Eftersom header-segmentet kommer före body-segmentet, är det omöjligt att ändra något där, eftersom det redan är skickat. Du kan inte starta ett nytt header-segment för att skicka nya header-värden: ett HTTP-svar har bara ett, och det finns på sitt bestämda ställe överst i svaret.
Det är också ofta detta dina problem med sessions beror på. Sessions fungerar genom cookies, och cookies som i en respons ska sättas hos klienten är en header. Därför kan du inte modifiera cookies eller sessions efter att du har skickat ut body-data.

Hur ska jag lösa detta?
Många föreslår ob_start() och besläktade funktioner. Den funktionen fungerar genom att samla ihop all body-data tills dokumentet är färdigtolkat, och därefter skicka ut det. Du inser själv att detta leder till en prestandaförlust, eftersom det tar tid att tolka färdigt hela sidan. Därför anser jag att det är en väldigt dåligt metod, och att det inte ska användas. Du ska istället skriva kod för att undvika att hamna i den här situationen.
Det vanligaste och mest moderna sättet att se på program (och t.ex. HTML) är att logiken (d.v.s. det som styr hur programmet fungerar) ska separeras från pesentationen (d.v.s. det som styr hur programmet och dess output ser ut).
Mitt råd är att koda enligt den här principen: blanda inte ihop databas-anrop och header- och session-modifikationer med html-kod. Räkna fram all data du behöver använda dig av på sidan, innan du börjar skriva ut den och det som ska presentera den.


(eftersom det som nämnt är en hel del problem med detta, vore det kanske bra om någon klistrade tråden eller nåt...?
ge förresten gärna kritik på det jag har skrivit! det finns ingen mening med den här typen av information om den är svår att ta till sig av någon anledning.)


Senast ändrad av HannesP den 2006-12-13 21:05, ändrad totalt 1 gång
 

_________________
Without chemicals, he points.
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
lunner



Medlem i: 5433 dagar
Från: Ronneby
Status: Offline



#443503
Inlägg Skrivet: 2006-12-13 00:45      Ämne: Citera

glasklart
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Matti4s



Medlem i: 4488 dagar
Från: 127.0.0.1
Status: Offline



#443521
Inlägg Skrivet: 2006-12-13 08:59      Ämne: Citera

Något exempel skulle vara nice så det blir med glasklart
:D

själv så sitter jag i "ob_start()"-träsket och det ska jag få bort någon gång då jag har tid...

klistra denna tråd!! :D
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Azreal
Administratör



Medlem i: 4915 dagar
Från: Uppsala, bor i Göteborg
Status: Offline



#443526
Inlägg Skrivet: 2006-12-13 09:10      Ämne: Citera

Här finns 4 exempel, TRE som är FEL och ETT som är korrekt.

FEL: Du gör en utskrift med echo dvs, du skickar data till webbläsaren.
PHP:
1:
<?php
2:
session_start();
3:
 echo ' har får du inte göra en utskrift ';
4:
 
5:
if (!isset($_SESSION['sess_id'])){
6:
header("Location:index.php");
7:
exit;
8:
}


FEL: "Vanlig" html-kod räknas också som en utskrift detta kommer bli ett header fel.
PHP:
1:
 
2:
<html>
3:
<title></title>
4:
<head></head>
5:
<?php 
6:
session_start();
7:
 
8:
if (!isset($_SESSION['sess_id'])){
9:
header("Location:index.php");
10:
exit;
11:
}


FEL: Du har en include högst upp som innehåller utskrift, det kan vara ren
html, eller till och med bara ett mellanslag efter den sista phptaggen ?>

PHP:
1:
<?php 
2:
session_start();
3:
include "/fil_med_utskrift_i.php" ;
4:
 
5:
if (!isset($_SESSION['sess_id'])){
6:
header("Location:index.php");
7:
exit;
8:
}
9:
 

Korrekt: Här körs endast phpkod utan utskrifter
PHP:
1:
<?php
2:
session_start();
3:
// här sker ingen utkskrift till webbläsaren alls. vilket gör att headern sätts.
4:
if (!isset($_SESSION['sess_id'])){
5:
header("Location:index.php");
6:
exit;
7:
}



Om du fortfarande får problem läs detta. (lite mer avancerat)


Ett annat problem som är mera sällsynt med kan förekomma är i vilket
format du spar självaste filen i.
Vanligt att använda idag är iso-8859-1/iso-8859-15 eller uft-8.
Om du ska byta teckenuppsättningar på en redan fungerande fil så kan
märkliga fel förekomma, header problemet ett av dem.

Jag hade ett problem vilket va att byta uppsättning på mina filer från
iso-8859-1 till utf-8.
Då fick jag märkliga fel när jag jobbade under windows, gick jag in via
min linux server och sparade om filerna till utf-8 fungerade det bra.
Från windows gick det mindre bra, från att ha spart dem i ASCII-encoding
och till att spara dem i UTF-8 så fick jag genast header problem i mina script.

Min lösning va att spara filerna i "UTF-8 "with BOM"" annars så fick jag
inte det att fungera.

Detta kan bero på att olika teckenuppsättningar lägger "skräptecken" som
kan vara osynliga och där med generera header-fel då det tolkas som utskrift.

Edit; ändringar i kod, rättat felstavning, lagt till ytliggare information.
 

_________________
Konsultation via PM, inte gratis.
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
HannesP



Medlem i: 4968 dagar

Status: Offline



#444040
Inlägg Skrivet: 2006-12-14 21:35      Ämne: Citera

Kan det inte vara idé att spika upp den här tråden, eftersom många uppenbarligen har problem med detta?
 

_________________
Without chemicals, he points.
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
anonym
Inaktiverad



Medlem i: 4611 dagar
Från: Köping
Status: Offline



#444055
Inlägg Skrivet: 2006-12-14 22:46      Ämne: Citera

*Bokmärkt*
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande MSN Messenger
koppom



Medlem i: 4678 dagar

Status: Offline



#444162
Inlägg Skrivet: 2006-12-15 13:40      Ämne: Citera

Inte haft några problem med Headern, då det varit glasklart från början(för mig). Men bra skrivet.
Hjälper säkert många, Röster för klistring av denna Smile
 

_________________
<3 php
Till toppen på sidan
Visa användarprofil Skicka privat meddelande MSN Messenger
spuun



Medlem i: 5634 dagar
Från: Linköping
Status: Offline



#444169
Inlägg Skrivet: 2006-12-15 13:52      Ämne: Citera

Iofs finns http://www.phpportalen.net/wiki/index.php?page=Jag+f%E5r+felmeddelande+%22Cannot+add+header+information...%22 i wikin. Editera den istället. Folk verkar ju inte läsa klistrade trådar och heller inte wikin. Istället för att då fylla forumet med postits så kan man ju lägga det i wikin och sen länka dit när folk frågar.
 

_________________
:] :] :] *kjamizzar* :] :] :]

Varför inkludera allt i indexfilen?
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
miii



Medlem i: 3794 dagar
Från: Gävle
Status: Offline



#679733
Inlägg Skrivet: 2010-05-04 19:33      Ämne: Citera

Förlåt om jag drar upp den här tråden igen men jag tycker absolut att den borde klistras i PHP Mjukstart, då väldigt många frågar efter detta.

Att det redan finns i wikin fick vi ju höra ifrån spuun men jag tror inte så många läser wikin, här aldrig gjort det själv (förutom spuun's länk). Hade nog dragit ner antal trådar om det här problemet, dessutom kanske folk slipper sitta i timmar och försöka få bort meddelandet utan att de vet dess orsak.

Så, även om jag själv fick reda på detta tidigt, så tycker jag det vore bra om denna klistrades.

Mycket bra skrivet HannesP, dock hade en förklaring inte suttit fel med det fyllde ju Azreal på med! Smile
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida MSN Messenger
Walkman
Ex-Moderator



Medlem i: 4730 dagar
Från: Vaxholm (bor i Göteborg)
Status: Offline



#679749
Inlägg Skrivet: 2010-05-04 23:24      Ämne: Citera

miii skrev:
Förlåt om jag drar upp den här tråden igen men jag tycker absolut att den borde klistras i PHP Mjukstart, då väldigt många frågar efter detta.

Tycker jag låter som en bra idé, men eftersom jag inte har veto så får den dangla lite löst tills det har diskuterats bland de andra. Anledningen till varför jag tycker att det passar bra i dagsläget är att det här forumet är rent och inte tar skada av en till klistrad tråd (till skillnad från PHP-forumet).

*slickar på tråden och slappar på den i mjukstart*
 

_________________
Koda alltid som om nästa person som till slut ska läsa din kod är en våldsam psykopat och vet var du bor.

Förstå kod innan du använder den.
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
nia



Medlem i: 3920 dagar
Från: Göteborg
Status: Offline



#682136
Inlägg Skrivet: 2010-06-10 11:41      Ämne: Citera

Förlåt att jag drar upp den här tråden igen, men jag har ett problem med min header.

Fungerar header bra med den nya versionen av IE 8? För i min hemsida så vill den inte skicka mig till min "inloggad.php" sida när den ligger uppe på mitt webhotell. Men den fungerar i safari, firefox och dem andra webbläsarna.

Men när jag gör det på min wampserver som ligger lokalt på min dator och kör den via "localhost" så skickar den mig vidare i IE8.

Har ni några idéer om varför det blir så här?

Om ni vill så kan jag skapa en ny tråd om det inte passar in i den här topicen.
 

_________________
Njuub In Action
Till toppen på sidan
Visa användarprofil Skicka privat meddelande MSN Messenger
csmannen



Medlem i: 3263 dagar

Status: Offline



#709725
Inlägg Skrivet: 2011-07-03 14:53      Ämne: Citera

Borde väl tilläggas att man kan få problem med headers/sessions om man kodar i UTF-8 med BOM. Jag har iaf löst ett problem med att koda i BOM utan BOM. Eller det kanske var tvärt om. Kan detta vara en lösning för vissa problem?
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
marabou
Administratör



Medlem i: 5279 dagar
Från: Sveriges framsida
Status: Offline



#709768
Inlägg Skrivet: 2011-07-04 08:28      Ämne: Citera

Om du kodar i UTF-8 skall du alltid göra det utan BOM. BOM är två eller tre bytes med information som läggs till i början av filerna, och PHP tolkar det som output och skickar till webbläsaren. Därför funkar inte headers, och det kan leda till andra problem också (extra konstiga tecken i html-koden bl.a.)

Kodar du i utf-8, koda alltid utan BOM.
 

_________________
"Never argue with stupid people. They will bring you down to their level and beat you with experience."
- Mark Twain
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
Larsson_p90



Medlem i: 4348 dagar

Status: Offline



#712314
Inlägg Skrivet: 2011-08-27 01:53      Ämne: Citera

Azreal skrev:
Här finns 4 exempel, TRE som är FEL och ETT som är korrekt.

FEL: Du gör en utskrift med echo dvs, du skickar data till webbläsaren.
PHP:
1:
<?php
2:
session_start();
3:
 echo ' har får du inte göra en utskrift ';
4:
 
5:
if (!isset($_SESSION['sess_id'])){
6:
header("Location:index.php");
7:
exit;
8:
}


FEL: "Vanlig" html-kod räknas också som en utskrift detta kommer bli ett header fel.
PHP:
1:
 
2:
<html>
3:
<title></title>
4:
<head></head>
5:
<?php 
6:
session_start();
7:
 
8:
if (!isset($_SESSION['sess_id'])){
9:
header("Location:index.php");
10:
exit;
11:
}


FEL: Du har en include högst upp som innehåller utskrift, det kan vara ren
html, eller till och med bara ett mellanslag efter den sista phptaggen ?>

PHP:
1:
<?php 
2:
session_start();
3:
include "/fil_med_utskrift_i.php" ;
4:
 
5:
if (!isset($_SESSION['sess_id'])){
6:
header("Location:index.php");
7:
exit;
8:
}
9:
 

Korrekt: Här körs endast phpkod utan utskrifter
PHP:
1:
<?php
2:
session_start();
3:
// här sker ingen utkskrift till webbläsaren alls. vilket gör att headern sätts.
4:
if (!isset($_SESSION['sess_id'])){
5:
header("Location:index.php");
6:
exit;
7:
}



Om du fortfarande får problem läs detta. (lite mer avancerat)


Ett annat problem som är mera sällsynt med kan förekomma är i vilket
format du spar självaste filen i.
Vanligt att använda idag är iso-8859-1/iso-8859-15 eller uft-8.
Om du ska byta teckenuppsättningar på en redan fungerande fil så kan
märkliga fel förekomma, header problemet ett av dem.

Jag hade ett problem vilket va att byta uppsättning på mina filer från
iso-8859-1 till utf-8.
Då fick jag märkliga fel när jag jobbade under windows, gick jag in via
min linux server och sparade om filerna till utf-8 fungerade det bra.
Från windows gick det mindre bra, från att ha spart dem i ASCII-encoding
och till att spara dem i UTF-8 så fick jag genast header problem i mina script.

Min lösning va att spara filerna i "UTF-8 "with BOM"" annars så fick jag
inte det att fungera.

Detta kan bero på att olika teckenuppsättningar lägger "skräptecken" som
kan vara osynliga och där med generera header-fel då det tolkas som utskrift.

Edit; ändringar i kod, rättat felstavning, lagt till ytliggare information.


Alla dessa kan göras "rätt" om man lägger till <?php ob_start(); ?> i toppen. Dock är det onödigt att skicka ut data som ändå inte kommer visas (om man är inloggad).
 

_________________
http://www.edgesystems.se
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
Wedge
Administratör



Medlem i: 6049 dagar
Från: Järfälla
Status: Offline



#712320
Inlägg Skrivet: 2011-08-27 09:54      Ämne: Citera

BOM-problemet kan inte lösas med ob_start().
 

_________________
I am Groot
Till toppen på sidan
Visa användarprofil Skicka privat meddelande MSN Messenger
Visa tidigare inlägg:   
Skapa nytt inlägg   Svara på inlägget Gå till sida 1, 2  Nästa
PHPportalen Forum Index » PHP Mjukstart
Hoppa till:  
Du kan inte skapa nya inlägg i det här forumet
Du kan inte svara på inlägg i det här forumet
Du kan inte ändra dina inlägg i det här forumet
Du kan inte ta bort dina inlägg i det här forumet
Du kan inte rösta i det här forumet
Du kan inte bifoga filer i detta forum
Du kan inte ladda ner filer från detta forum
Kontakta oss på adressen: info@phpportalen.net
Webbplatsen bygger i grunden på phpBB © 2001, 2002 phpBB Group

Modifieringar har senare gjorts i systemet av PHPportalen
Sid och logotypdesign skapad av Daren Jularic