Tråd: PHP Include
View Single Post
Limited edition
Moff's Avatar
Når jeg skrev "plassere denne koden helt i starten av den første PHP-filen som kjøres", så mente jeg at du skulle plassere koden helt i starten av den første PHP-filen som kjøres. Det har du ikke gjort i noen av filene dine, det er annen kode foran.

Det er et par feil jeg kan se med en gang her; session_start() og header() vil ikke fungere fordi du har output før koden kjøres. Dette er et veldig vanlig problem man møter som fersk PHP-utvikler. For å forstå hva som er galt så må vi se på hvordan nettsider virker. Du har to ulike "soner" du jobber i; server-siden og klient-siden. PHP er kode som kjøres på server-siden, mens HTML, CSS, JavaScript og et par andre ting kjøres på klient-siden. Alt som skjer på server-siden foregår i det skjulte, før nettsiden lastes inn i nettleseren. Det betyr at database-kode, passord og alle sånne ting som du sikkert har i PHP-koden din holdes skjult for publikum som besøker deg. Alt av klient-side-kode er imidlertid helt åpent, og publikum kan se alt som foregår der i nettleseren sin.

For å transportere data fra server til klient så bruker vi HTTP-protokollen. Kommunikasjonen starter hos klienten, typisk med en såkalt HTTP GET - en etterspørsel etter en side. Serveren svarer da med en annen HTTP-respons som inneholder det klienten har spurt etter, altså nettsiden. Fullstendig med HTML, CSS og JavaScript. Hver HTTP-respons er inndelt i to deler, en head og en body. Dette konseptet kjenner du sikkert igjen fra HTML, hvor HTML-kode er separert på nøyaktig samme måte. Dette fungerer også på samme vis i HTTP, ved at head-delen inneholder metadata som kan gi ulik informasjon og til og med kommandere klienten til å utføre oppgaver. En sentral oppgave serveren kan gi er å sette såkalte cookies og utføre navigering (redirects). Dette gjør at nettleseren din vil opprette en tekstfil på din PC med informasjon som serveren har angitt.

Og her er problemet; head kommer alltid før body. Både i HTML og i HTTP. Sessions i PHP er avhengig av cookies for å fungere, og header()-funksjonen er også avhengig av å plassere en kommando i head. Derav funksjonsnavnet, header(). Hvis du har noe HTML-kode, eller rettere sagt noe som ikke er PHP-kode, før header(), setcookie(), session_start() eller tilsvarende - da går det galt. I din kode har du doctype i toppen, og det er HTML-kode. Du må starte rett på <?php i starten av filen, du kan ikke ha et eneste mellomrom eller noe sånt først.

Et problem som kan dukke opp i denne sammenhengen, som er verdt å nevne, er Byte Order Mark (BOM). Hvis du skriver kode i en fornuftig editor så har du mulighet til å endre hva slags encoding du skriver med. Kontroller at du bruker UTF-8 uten BOM. Hvis du encoder med BOM, så teller dette som et symbol helt i starten av hver fil, og dette vil da føre til den velkjente feilmeldingen "cannot modify header information, headers already sent...".