Lukas.: header location will nicht...

Hi,

bei mir funktioniert lokal etwas, was online nicht funktioniert. Und zwar eine Weiterleitung per header location.

Der Errorlog der Onlinepräsenz sagt mir, dass er bereits den Header gesendet hat: headers already sent by (output started at /htdocs/zgzgk/ldrtj/guzgu/hnjnk/bilder.php:253)

bilder.php ist eine Klasse, die ich programmiert habe, um per imagick dem bild ein Wasserzeichen hinzuzufügen, es zu verkleinern und abzuspeichern.

In Zeile 253 ist das Script bereits zuende.

Was tun? Wie gesagt, lokal läufts...

akzeptierte Antworten

  1. Tach!

    headers already sent by (output started at /htdocs/zgzgk/ldrtj/guzgu/hnjnk/bilder.php:253)

    In Zeile 253 ist das Script bereits zuende.

    Was tun?

    Den Zeilenumbruch am Ende entfernen? Oder am besten das ?> weglassen, das braucht man am Dateiende nicht und dann kann sich da auch kein Whitespace dahinterschleichen.

    dedlfix.

    1. Hi dedlfix,

      Den Zeilenumbruch am Ende entfernen? Oder am besten das ?> weglassen, das braucht man am Dateiende nicht und dann kann sich da auch kein Whitespace dahinterschleichen.

      Oh. Ich wußte, dass header location wählerisch ist. Aber so wählerisch - das wußte ich nicht. Prima, jetzt läufts wunderbar. Danke für Deine Hilfe.

      Lukas

      1. Hallo,

        Den Zeilenumbruch am Ende entfernen? Oder am besten das ?> weglassen, das braucht man am Dateiende nicht und dann kann sich da auch kein Whitespace dahinterschleichen.

        Oh. Ich wußte, dass header location wählerisch ist.

        das ist grundsätzlich so: Sobald das erste Zeichen der Nutzdaten an den Client gesendet wird (dazu gehören auch Leerzeilen oder Blanks am Scriptanfang, sogar eine BOM am Dateianfang), sendet PHP auch die HTTP-Header. Danach können keine weiteren Header mehr gesendet werden, entsprechende Versuche werden mit einer Notice quittiert, aber ansonsten ignoriert.

        Das betrifft auch nicht nur den Location-Header - es betrifft alle Funktionen, die direkt oder indirekt einen HTTP-Header erzeugen. Also außer der Funktion header() beispielsweise auch setcookie() oder session_start().

        Wenn man meint, man müsse dieses Prinzip unbedingt aushebeln, kann man Output Buffering verwenden. Dann wird die Ausgabe zurückgehalten, bis sie vollständig ist, und man kann jederzeit im Script noch weitere HTTP-Header erzeugen.
        Ich halte das aber nicht für ein sauberes Vorgehen und würde es nicht empfehlen.

        So long,
         Martin

        1. Tach!

          [...] entsprechende Versuche werden mit einer Notice quittiert, aber ansonsten ignoriert.

          Wenn du damit eine Meldung vom Typ E_NOTICE meinst, so ist das nicht richtig. Diese werden nur bei ganz einfachen Fehlern (aus Sicht von PHP) erzeugt. Dass Header nicht gesendet werden konnten, ist schon eine schwerer (als Notices) wiegende Funktionalitätseinbuße und wird mit einer E_WARNING gemeldet.

          Bedenke, E_NOTICE sind in der Standardeinstellung ausgeschaltet. Da dürfen nur solche Fehler ungemeldet bleiben, von denen PHP annimmt, dass es sie sehr leicht selbst korrigieren kann. Beispielsweise bei einem Lesezugriff auf eine nicht vorhandene Variable hat man sie meist nur nicht initialisiert, was oftmals (aber nicht immer) ungefährlich ist. Oder die vergessenen Anführungszeichen bei Array-Keys, die trotzdem als String interpretiert werden.

          Dass es nicht immer unproblematisch ist, diese Korrekturen stillschweigend vorzunehmen, steht auf einem anderen Blatt.

          dedlfix.

          1. Hi,

            [...] entsprechende Versuche werden mit einer Notice quittiert, aber ansonsten ignoriert.

            Wenn du damit eine Meldung vom Typ E_NOTICE meinst, so ist das nicht richtig.

            ja, meinte ich eigentlich.

            Diese werden nur bei ganz einfachen Fehlern (aus Sicht von PHP) erzeugt. Dass Header nicht gesendet werden konnten, ist schon eine schwerer (als Notices) wiegende Funktionalitätseinbuße und wird mit einer E_WARNING gemeldet.

            Das war mir so genau nicht bewusst, danke.

            Allerdings würde ich z.B. den Zugriff auf nicht initialisierte Variablen aus der Sicht von PHP für schwerwiegender halten, als nicht gesendete HTTP-Header. Warum? Weil sich der erstgenannte Fehler oft noch innerhalb des Scripts auswirkt, der andere irgendwoanders, wo das Script selbst oder der PHP-Interpreter nicht mehr betroffen sind.

            Bezüglich der möglichen Auswirkungen auf das Gesamtkonzept können sie natürlich beide fatal sein.

            Ciao,
             Martin