Pit: header location will nicht, wie ich will

Hallo,

in meinem php-script nutze ich an einer Stelle header("Location: ...

Ergebnis ist Warning: Cannot modify header information - headers already sent by (output started at /myPfad/dir/bilder.php:253) in /myPfad/dir/script.php on line 194

Die Stelle im Script bilder.php lautet:

    // Generate Filename to save on server
    protected function generateFilename() {
    }

Übrigens funktionieren selbige Scripte inkl. Weiterleitung auf demselben Server in einem anderen Subdir. Wie komme ich dem Fehler auf die Schliche?

Pit

  1. Tach!

    in meinem php-script nutze ich an einer Stelle header("Location: ...

    Ergebnis ist Warning: Cannot modify header information - headers already sent by (output started at /myPfad/dir/bilder.php:253) in /myPfad/dir/script.php on line 194

    Bitte immer erst den Text der Meldung in eine Suchmaschine werfen. Der Fehler ist altbekannt und wohl dokumentiert.

    Wie komme ich dem Fehler auf die Schliche?

    Vermeide Ausgaben bevor alle headermanipulierenden Funktionsaufrufe durch sind. Das erste Byte Ausgabe schließt die HTTP-Header ab. Auch wenn es ungewollt ist, wie Leerzeichen am Dateiende nach schließenden (und dort überflüssigen) ?>.

    dedlfix.

    1. Hi dedlfix,

      Bitte immer erst den Text der Meldung in eine Suchmaschine werfen. Der Fehler ist altbekannt und wohl dokumentiert.

      Hab ich längst gemacht und vieles gelesen, inkl. utf-8 Kodierung, wo das bom der Auslöser ist, usw. Bisher konnte ich aber nichts finden, was auf meine Situation passt,m daher mein post.

      Wie komme ich dem Fehler auf die Schliche?

      Vermeide Ausgaben bevor alle headermanipulierenden Funktionsaufrufe durch sind. Das erste Byte Ausgabe schließt die HTTP-Header ab. Auch wenn es ungewollt ist, wie Leerzeichen am Dateiende nach schließenden (und dort überflüssigen) ?>.

      Ich schaus nochmal durch.

      Pit

      1. Tach!

        Hab ich längst gemacht und vieles gelesen, inkl. utf-8 Kodierung, wo das bom der Auslöser ist, usw.

        Das weiß ich ja nicht, wenn du das nicht erwähnst.

        Bisher konnte ich aber nichts finden, was auf meine Situation passt,m daher mein post.

        Du weißt also schon, dass es an Ausgaben liegt. Im gezeigten Code ist aber keine Ausgabe zu sehen. Es muss irgendwas mit echo oder print oder anderen ausgabeerzeugenden Funktionsaufrufen oder außerhalb des <?php PHP-Teils ?> sein. Wenn das die Stelle aus der Meldung ist, fehlt auch der Hinweis, welches die entsprechende Zeilennummer ist. Wichtig ist dabei der Verweis im Teil output started at ....

        dedlfix.

        1. Hi dedlfix,

          Du weißt also schon, dass es an Ausgaben liegt. Im gezeigten Code ist aber keine Ausgabe zu sehen. Es muss irgendwas mit echo oder print oder anderen ausgabeerzeugenden Funktionsaufrufen oder außerhalb des <?php PHP-Teils ?> sein. Wenn das die Stelle aus der Meldung ist, fehlt auch der Hinweis, welches die entsprechende Zeilennummer ist. Wichtig ist dabei der Verweis im Teil output started at ....

          Zuerstmal, ich habe mich vertan; Das bilder.php-script geht nur bis zur zeile 249. Wie php dort auf Zeile 253 kommt, ist mir schleierhaft.

          Ich habe blöderweise den Code aus dem bilder-script von Zeile 194 genommen (einfach versehentlich, weil diese Zeile erwähnt wurde).

          Aber im script.php war hinter dem ?> noch eine Leerzeile, als ich die weggemacht habe, gings auch mit dem weiterleiten.

          Und jetzt die Frage an Dich: Wie kommt php auf Zeile 253?

          Pit

          1. Tach!

            Und jetzt die Frage an Dich: Wie kommt php auf Zeile 253?

            PHP läuft auf dem Computer und Computer haben immer Recht. Wenn PHP also eine Zeile 253 sieht, dann ist in der Datei, die das PHP da auswertet auch eine Zeile 253. Wenn du diese Zeile nicht siehst, dann schaust du vermutlich in eine andere Datei - oder eine andere Inkarnation der Datei.

            dedlfix.

      2. Vermeide Ausgaben bevor alle headermanipulierenden Funktionsaufrufe durch sind. Das erste Byte Ausgabe schließt die HTTP-Header ab. Auch wenn es ungewollt ist, wie Leerzeichen am Dateiende nach schließenden (und dort überflüssigen) ?>.

        Ich schaus nochmal durch.

        Pit

        Danke @ dedlfix,

        genau das hinter dem ?>, das wars.

        Pit

        1. Tach!

          genau das hinter dem ?>, das wars.

          Wenn das ?> am Dateiende steht, lass es weg. Das ist sowohl syntaktisch richtig als auch im PHP-Handbuch empfohlen. Hinter einem nicht vorhandenen ?> kann sich kein Whitespace verstecken.

          dedlfix.

          1. Hi,

            Wenn das ?> am Dateiende steht, lass es weg. Das ist sowohl syntaktisch richtig als auch im PHP-Handbuch empfohlen. Hinter einem nicht vorhandenen ?> kann sich kein Whitespace verstecken.

            Aua. Wenn mans so gelernt hat, fühlt sich das dann irgendwie so "unvollkommen" an 😉 Werd' ich machen, danke für die Hilfe.

            Pit

  2. Hallo Pit,

    was steht denn in deiner bilder.php in Zeile 253?

    Viele Grüße
    Robert

    1. Hallo Robert,

      Problem erledigt, danke fürs mithelfen.

      Pit

  3. Hallo Pit,

    PHP versteckt das Thema "HTTP-Protokoll" relativ erfolgreich vor dem eigentlichen Script, aber an dieser Stelle ist es dann vorbei.

    Eine HTTP Antwort besteht aus einem Header-Teil und den Nutzdaten. Um sie zum Browser zu bringen, warten mehrere Busse an der Serverhaltestelle. Der erste Bus ist schön ordentlich und sauber, und der Fahrer achtet streng darauf, dass keine dreckigen Nutzdatenbytes einsteigen. Sobald sich der erste fiese Nutzerich an der Haltestelle sehen lässt, macht der Fahrer die Tür zu und gibt Vollgas. Die Nutzeriche müssen dann mit dem nächsten Bus fahren.

    Wenn nun aber noch eine vornehme Headerdame ankommt, z.B. Lady Location, dann wendet sie sich natürlich angewidert ab. "Also nei-en, diese stinkenden Nuutzdaten, wie könnte ich mir da den Rocksaum beflecken!". Und sie kehrt heim und heult sind bei Papa Hugo-Paul (PHP) aus. „*Der bööse Headerbuhuhus - einfach abgefahren, ohne mihihich schnief“.

    Und die Moral von der Geschicht: Sende keine Nutzdaten nicht, wenn Lady Location noch im Headerbus mitfahren soll.

    Nutzdaten stecken im ECHO, und außerhalb der <?php ?> Schutzgatter. Manchmal auch in Form einer Leerstelle oder eines Zeilenumbruchs vor dem ersten <?php Tag.

    Ein PHP Fehler, der eine Fehlermeldung ausgibt, hat den gleichen Effekt. Fehlermeldungen sind zwar nicht wirklich Nutzdaten, aber manchmal immerhin nützlich…

    Die Stelle zu finden, die das erste Nutzdatenbyte erzeugt, mag knifflig sein, das ist aber von ferne kaum möglich.

    Deswegen ist es in aufwändigeren Scripten auch eigentlich so, dass man zunächst alle Daten für die Antwort aufbereitet und zwischenspeichert. Erst wenn alle Daten bereit sind, sendet man die nötigen Header, und dann en bloc die Antwort.

    Rolf

    --
    sumpsi - posui - clusi
    1. Hallo Rolf,

      Und die Moral von der Geschicht: Sende keine Nutzdaten nicht, wenn Lady Location noch im Headerbus mitfahren soll.

      Danke für dieses schöne Beispiel 😀

      Nutzdaten stecken im ECHO, und außerhalb der <?php ?> Schutzgatter. Manchmal auch in Form einer Leerstelle oder eines Zeilenumbruchs vor dem ersten <?php Tag.

      Da war sie, meine Wissenslücke. Ich glaube, ich habe in fast allen php-scripten noch ein paar Leerzeilen hinter den abschließenden ?>. Werde ich mal aufräumen müssen.

      Ein PHP Fehler, der eine Fehlermeldung ausgibt, hat den gleichen Effekt. Fehlermeldungen sind zwar nicht wirklich Nutzdaten, aber manchmal immerhin nützlich…

      Das war mein erster Geadanke beim debuggen.

      Die Stelle zu finden, die das erste Nutzdatenbyte erzeugt, mag knifflig sein, das ist aber von ferne kaum möglich.

      Nicht den Fehler finden, da hast Du recht. Aber sowohl dedlfix als auch Du hatten den richtgen Riecher in Sachen <?php ?> .

      Deswegen ist es in aufwändigeren Scripten auch eigentlich so, dass man zunächst alle Daten für die Antwort aufbereitet und zwischenspeichert. Erst wenn alle Daten bereit sind, sendet man die nötigen Header, und dann en bloc die Antwort.

      Danke für die Hilfe.

      Pit

      1. Hallo Pit,

        den Hinweis mit ?> hat mir meine Entwicklungsumgebung verraten. Die hat mir jedes ?> am Scriptende als "schlechter Stil, lass das" um die Ohren gehauen. Wenn man es dann aus 30 Scripten oder so ausbauen musste, weiß man es 😀

        Rolf

        --
        sumpsi - posui - clusi