September
8
2007
18:12
Kategorie:
Post Meta:

Ich habe mich gerade volle 2 Stunden mit einem sowas von blödem Problem herumgeschlagen….

Will man eine PHP-Session mittels session_start(); öffnen, muss man sicherstellen, dass keine Header vor Aufruf des Befehls an den Browser gesendet werden. Das ist unlängst bekannt und die erste Anlaufstelle für das Debuggen folgender Fehlermeldung:

Warning: session_start(): Cannot send session cookie – headers already sent by (output started at /home/box/public_html/im/index.php:1) in /home/box/public_html/im/index.php on line 2

Warning: session_start(): Cannot send session cache limiter – headers already sent (output started at /home/box/public_html/im/index.php:1) in /home/box/public_html/im/index.php on line 2

Wenn aber selbst Dateien mit dem Inhalt

<?php session_start(); ?>

diesen Fehler liefern, wird man erst einmal stutzig! Um es kurz zu machen, UTF-8 und eingebettetes BOM sind die Schuldigen… UTF-8 Kodierung ist wirklich praktisch und die Markierung der Datei mittels BOM noch viel mehr. Doch dass Webserver das BOM ausgeben und somit die Datei per se schon ein Zeichen sendet, bevor der richtige Dateiinhalt kommt, kann doch keiner ahnen.

Hier also die Problemlösung:

Dateien als UTF-8 aber ohne BOM speichern und die UTF-8 Kodierung als header VOR dem session_start(); Aufruf schicken.

<?php
header('Content-Type: text/html; charset=UTF-8');
session_start();

?>

« akuma.de – Unabhängiger Online Musikdienst
Kohatred rockt die Bühnen! »
 
Dezember
28
2007
15:11

hallo! ich glaube diese problem liegt nicht unbedingt an der utf-8 codierung, sondern vielmehr daran, dass vor dem session_start() aufruf eben kein header gesendet werden darf, und somit auch kein leerzeichen oder zeilenumbruch stehen sollte. ich hatte das selbe problem auch einmal, und habe lange nach der ursache gesucht, bis ich draufgekommen bin, dass das öffnende php-tag in der zweiten zeile gestanden hat, und die erste zeile somit als „normales html“ interpretiert wurde. ich glaube dein problem dürfte ein ähnliches gewesen sein.

lg, fabian

Dezember
28
2007
17:38

Genau das ist es eben nicht. Die erste Zeile kommt durch das BOM zustande, was der Apache/PHP eigentlich interpretieren statt ausgeben müsste. Macht er aber nicht bzw erst ab PHP5.

April
25
2008
01:39

was für nachteile habe ich, wenn das ohne BOM abgespeichert wird? ich habe jetzt ebenfalls 2h unnötig zeit verplämpert um den fehler zu finden. habe die datein jetzt ersteinmal ohne BOM abgespeichert, denn es kommt trotz PHP5 noch zu dem „Headers Already Sent“-Fehler

April
25
2008
07:09

Der einzige Nachteil ist, dass die Datei in ihrem Header nicht mehr definiert, dass sie UTF-8 kodiert gespeichert wurde. Programme die den Inhalt also verwerten wollen, müssen dadurch entweder selbst herausfinden, ob die Datei UTF-8 kodiert ist oder aber der Benutzer gibt dem Programm die Info „hier kommt ein UTF-8 kodiertes File“. Letzteres macht man ja, indem man den Header durch „header(‚Content-Type: text/html; charset=UTF-8‘);“ an den Browser schickt. Dieser weiß dann „ok, ein HTML-File mit UTF-8 Kodierung“ und zeigt es entsprechend an. Andere Nachteile gibt es nicht, es fehlt der Datei lediglich eine Meta-Angabe zur Kodierung.

September
15
2009
19:45

GreenTurtle

DANKE!!! Du hast mir eben genau diese 2 Stunden Zeit gespart. Ich war nämlich genau wie du damals grade schon am Verzweifeln, hab dann aber rechtzeitig deinen Hinweis gefunden. Ohne BOM-Header funktioniert jetzt alles super. Nochmals vielen Dank!

Mai
5
2010
03:29

„Macht er aber nicht bzw erst ab PHP5.“

Ich hatte das Problem auch schon öfter und habe noch nie mit einer anderen Version als PHP5 gearbeitet.