831 Stimmen

Wie behebt man den Fehler "Headers already sent" in PHP

Wenn ich mein Skript ausführe, erhalte ich mehrere Fehler wie diesen:

Warnung: Cannot modify header information - headers already sent by ( Die Ausgabe begann bei /some/file.php:12 ) in /some/file.php auf Zeile 23

Die in den Fehlermeldungen genannten Zeilen enthalten header() y setcookie() Anrufe.

Was könnte der Grund dafür sein? Und wie lässt es sich beheben?

38voto

Jorn Punkte 457

ALLGEMEINE PROBLEME:

(kopiert aus: source )

\====================

1) sollte es keine Ausgabe geben (d.h. echo.. oder HTML-Codes), bevor die header(.......); Befehl.

2) entfernen Sie alle Weißraum (oder Zeilenumbruch ) vor <?php und nach ?> Tags.

3) GOLDENE REGEL! - prüfen Sie, ob diese php-Datei (und auch, wenn Sie include andere Dateien) haben UTF8 ohne BOM Kodierung (und nicht nur UTF-8 ). Das ist in vielen Fällen ein Problem (weil UTF8 kodierte Datei hat ein spezielles Zeichen am Anfang der php-Datei, das Ihr Texteditor nicht anzeigt)!!!!!!!!!!!

4) Nach header(...); müssen Sie exit;

5) Verwenden Sie immer 301- oder 302-Verweise:

header("location: http://example.com",  true,  301 );  exit;

6) Schalten Sie die Fehlerberichterstattung ein, und suchen Sie den Fehler. Ihr Fehler kann durch eine Funktion verursacht werden, die nicht funktioniert. Wenn Sie die Fehlerberichterstattung einschalten, sollten Sie immer zuerst den obersten Fehler beheben. Er könnte zum Beispiel lauten: "Warning: date_default_timezone_get(): Es ist nicht sicher, sich auf die Zeitzoneneinstellungen des Systems zu verlassen". - weiter unten wird dann möglicherweise der Fehler "Header nicht gesendet" angezeigt. Nachdem Sie den obersten (1.) Fehler behoben haben, laden Sie Ihre Seite erneut. Wenn Sie immer noch Fehler haben, beheben Sie erneut den obersten Fehler.

7) Wenn nichts von dem oben genannten hilft, verwenden Sie JAVSCRIPT Umleitung (jedoch stark nicht empfohlene Methode), kann die letzte Chance in benutzerdefinierten Fällen sein...:

echo "<script type='text/javascript'>window.top.location='http://website.com/';</script>"; exit;

34voto

Sarfraz Punkte 366217

Das liegt an dieser Linie:

printf ("Hi %s,</br />", $name);

Sie sollten nicht Druck/Echo bevor die Kopfzeilen gesendet werden.

27voto

Sliq Punkte 14661

Ein einfacher Tipp: Ein einfaches Leerzeichen (oder ein unsichtbares Sonderzeichen) in Ihrem Skript, direkt vor dem allerersten <?php Tag, kann dies verursachen! Vor allem, wenn man in einem Team arbeitet und jemand eine "schwache" IDE benutzt oder mit fremden Texteditoren in den Dateien herumgespielt hat.

Ich habe diese Dinge gesehen ;)

23voto

Eine andere schlechte Praxis kann dieses Problem hervorrufen, die noch nicht genannt wurde.

Siehe dieses Codeschnipsel:

<?php
include('a_important_file.php'); //really really really bad practise
header("Location:A location");
?>

Es ist doch alles in Ordnung, oder?

Was ist, wenn "a_important_file.php" dies ist:

<?php
//some php code 
//another line of php code
//no line above is generating any output
?>

 ----------This is the end of the an_important_file-------------------

Das wird nicht funktionieren? Weil bereits eine neue Zeile erzeugt wird.

Nun, obwohl dies nicht ein gemeinsames Szenario, was, wenn Sie mit einem MVC-Framework, das eine Menge von Datei vor der Übergabe Dinge zu Ihrem Controller lädt sind? Dies ist kein ungewöhnliches Szenario. Seien Sie darauf vorbereitet.

から PSR-2 2.2 :


  • Alle PHP-Dateien MÜSSEN die Unix LF (linefeed) line ending .
  • Alle PHP-Dateien MÜSSEN mit einem single blank line .
  • Der abschließende ?>-Tag MUSS sein omitted aus Dateien mit only php

Glauben Sie mir, wenn Sie diese Standards befolgen, können Sie eine Menge Stunden in Ihrem Leben sparen :)

16voto

Lupin Punkte 1215

Wenn der Entwicklungsprozess sowohl auf WIN-Arbeitsplätzen als auch auf LINUX-Systemen (Hosting) stattfindet und im Code keine Ausgabe vor der entsprechenden Zeile zu sehen ist, kann dies an der Formatierung der Datei und dem Fehlen von Unix LF (Zeilenvorschub) Zeilenende.

Was wir normalerweise tun, um dieses Problem schnell zu beheben, ist, die Datei umzubenennen und auf dem LINUX-System eine neue Datei anstelle der umbenannten Datei zu erstellen und dann den Inhalt in diese Datei zu kopieren. In vielen Fällen löst dies das Problem, da einige der Dateien, die in WIN erstellt wurden, nachdem sie auf das Hosting-System verschoben wurden, dieses Problem verursachen.

Dies ist eine einfache Lösung für Websites, die wir per FTP verwalten, und kann unseren neuen Teammitgliedern manchmal etwas Zeit sparen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X