Albert Weißenbach: Warning: Cannot modify header information

Hallo allerseits!

Ich habe folgendes Problem und zwar habe ich ein Formular, welches bei richtigen Angaben an eine Seite (in meinem Fall disneyland.disney.go.com/) weiterleiten soll. Aber ich bekomme folgende Fehlermeldung:

Warning: Cannot modify header information

Da es keine Leerzeichen oder vorhergehende Ausgaben im Skript gibt, müsste eigentlich die Weiterleitung doch erfolgen, aber genau das tut es nicht: Das ist der Quellcode

  
<?php  
$users = array("user1","user2","user3","user4");  
$pass = array("pass1","pass2","pass3","pass4");  
$uip = $_SERVER["REMOTE_ADDR"];  
$today = date("Y-m-d H:i:s");  
if(isset($_POST['user'])){  
$u = $_POST['user'];  
$p = $_POST['pw'];  
$file = "log.txt";  
$handle = fopen($file, 'a+') or die ("Datei konnte nicht geöffnet werden");  
$source = "Neus login versuch am: " .$today. " von IP Adresse: " .$uip. " mit benuzername: " .$u. " mit Kennwort " .$p;  
fwrite($handle,$source);  
fclose($handle);  
for ($i=0; $i<3; $i++){  
if($u == $users[$i] && $p == $pass[$i]){  
header("LOCATION: disneyland.disney.go.com/");  
exit;  
}  
else{  
echo "falsch";  
}  
}  
}	  
?>  

was kann da falsch sein?

  1. Hallo allerseits!

    hi.

    was kann da falsch sein?

    In deinem codesnipped ist ein zeilenumbruch oben. Absicht?

    Mfg entropie

    --
    Whenever people agree with me I always feel I must be wrong.
      -- Oscar Wilde
  2. Hallo,

    Warning: Cannot modify header information

    schade, dass du den wichtigen Teil der Fehlermeldung weggekürzt hast. Da steht nämlich nicht nur drin, wo der Fehler festgestellt wurde (vermutlich die Zeile mit der header()-Anweisung), sondern auch, wo die erste Ausgabe erfolgte, die das erneute Header-Senden verhindert.

    Da es keine Leerzeichen oder vorhergehende Ausgaben im Skript gibt, ...

    ... könnte ebensogut eine BOM am Dateianfang der Störenfried sein - vorausgesetzt, du verwendest UTF-8.

    <?php

    $users = array("user1","user2","user3","user4");
    $pass = array("pass1","pass2","pass3","pass4");
    $uip = $_SERVER["REMOTE_ADDR"];
    $today = date("Y-m-d H:i:s");
    if(isset($_POST['user'])){
    $u = $_POST['user'];
    $p = $_POST['pw'];
    $file = "log.txt";
    $handle = fopen($file, 'a+') or die ("Datei konnte nicht geöffnet werden");
    $source = "Neus login versuch am: " .$today. " von IP Adresse: " .$uip. " mit benuzername: " .$u. " mit Kennwort " .$p;
    fwrite($handle,$source);
    fclose($handle);
    for ($i=0; $i<3; $i++){
    if($u == $users[$i] && $p == $pass[$i]){
    header("LOCATION: disneyland.disney.go.com/");
    exit;
    }
    else{
    echo "falsch";
    }
    }
    }
    ?>

      
    Da ist nichts drin, was eine Ausgabe an den Client produziert (außer der Meldung im else-Zweig), so dass die Ausgabe schon vorher erfolgt sein muss. Wie gesagt: Möglicherweise eine BOM.  
      
    So long,  
     Martin  
    
    -- 
    Es sagte...  
    ein korpulenter Lehrer zu einem Schüler, der ihn ein Fass genannt hatte: "Nein. Ein Fass ist von Reifen umgeben, ich dagegen von Unreifen."  
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    
    1. Hallo,

      Warning: Cannot modify header information

      schade, dass du den wichtigen Teil der Fehlermeldung weggekürzt hast. Da steht nämlich nicht nur drin, wo der Fehler festgestellt wurde (vermutlich die Zeile mit der header()-Anweisung), sondern auch, wo die erste Ausgabe erfolgte, die das erneute Header-Senden verhindert.

      Da es keine Leerzeichen oder vorhergehende Ausgaben im Skript gibt, ...

      ... könnte ebensogut eine BOM am Dateianfang der Störenfried sein - vorausgesetzt, du verwendest UTF-8.

      <?php

      $users = array("user1","user2","user3","user4");
      $pass = array("pass1","pass2","pass3","pass4");
      $uip = $_SERVER["REMOTE_ADDR"];
      $today = date("Y-m-d H:i:s");
      if(isset($_POST['user'])){
      $u = $_POST['user'];
      $p = $_POST['pw'];
      $file = "log.txt";
      $handle = fopen($file, 'a+') or die ("Datei konnte nicht geöffnet werden");
      $source = "Neus login versuch am: " .$today. " von IP Adresse: " .$uip. " mit benuzername: " .$u. " mit Kennwort " .$p;
      fwrite($handle,$source);
      fclose($handle);
      for ($i=0; $i<3; $i++){
      if($u == $users[$i] && $p == $pass[$i]){
      header("LOCATION: disneyland.disney.go.com/");
      exit;
      }
      else{
      echo "falsch";
      }
      }
      }
      ?>

      
      >   
      > Da ist nichts drin, was eine Ausgabe an den Client produziert (außer der Meldung im else-Zweig), so dass die Ausgabe schon vorher erfolgt sein muss. Wie gesagt: Möglicherweise eine BOM.  
      >   
      > So long,  
      >  Martin  
      >  
        
      Oh sorry, die komplette Fehlermeldung ist die:  
        
      Warning: Cannot modify header information - headers already sent by (output started at /home/php5/public\_html/index.php:1) in /home/php5/public\_html/index.php on line 21 (da ist der header drin)
      
      1. Hallo Albert,

        bitte zitiere nicht das komplette Vorposting (TOFU), sondern nur den Teil, auf den du dich konkret beziehst.

        Warning: Cannot modify header information - headers already sent by (output started at /home/php5/public_html/index.php:1) in /home/php5/public_html/index.php on line 21 (da ist der header drin)

        Gut, das bestätigt meine Vermutung: "output started at /home/php5/public_html/index.php:1"
        Also in Zeile 1 - wenn du dort ganz sicher keine Leerzeile am Anfang hast, kann es nur eine BOM sein.

        So long,
         Martin

        --
        Ich wollt', ich wär ein Teppich.
        Dann könnte ich morgens liegenbleiben.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  3. Da es keine Leerzeichen oder vorhergehende Ausgaben im Skript gibt, müsste eigentlich die Weiterleitung doch erfolgen, aber genau das tut es nicht: Das ist der Quellcode

    Ganz sicher nicht?

      
    
    > for ($i=0; $i<3; $i++){  
    >    if($u == $users[$i] && $p == $pass[$i]){  
    >        header("LOCATION: disneyland.disney.go.com/");  
    >        exit;  
    >    }  
    >    else{  
    >       echo "falsch";  
    >    }  
    > }  
    > 
    
    

    was kann da falsch sein?

    Was passiert, wenn innerhalb der ersten oder zweiten Iteration in den else-Block gesprungen wird?

    1. Hallo,

      for ($i=0; $i<3; $i++){

      if($u == $users[$i] && $p == $pass[$i]){
             header("LOCATION: disneyland.disney.go.com/");
             exit;
         }
         else{
            echo "falsch";
         }
      }

        
      
      > Was passiert, wenn innerhalb der ersten oder zweiten Iteration in den else-Block gesprungen wird?  
        
      boah, ein Logikfehler. Gut erkannt!  
      Stimmt, die "falsch"-Ausgabe darf natürlich erst kommen, wenn die Schleife durchgelaufen ist. Das geht in diesem Fall sogar völlig ohne Verrenkungen, weil das Script ja im Erfolgsfall sofort mit exit beendet wird.  
        
      Ciao,  
       Martin  
      
      -- 
      F: Was macht ein Offizier, der in der Nase bohrt?  
      A: Er holt das Letzte aus sich heraus.  
      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
      
  4. Hi,

    was kann da falsch sein?

    Das Übliche …?

    Wirklich nach dem Text der Fehlermeldung gesucht und dich informiert hast du nicht, oder?

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Hi,

      was kann da falsch sein?

      Das Übliche …?

      Wirklich nach dem Text der Fehlermeldung gesucht und dich informiert hast du nicht, oder?

      MfG ChrisB

      Lieber ChrisB

      Ich würde hier nicht Hilfe suchen wenn ich nicht schon nach Lösungen geschaut hätte geschweige denn ich die Lösung schon wüsste, oder nicht?

      Ich habe außerdem folgendes festgestellt: auf dem Server von Plativio.com auf dem die index.php ist hat Probleme mit der Weiterleitung, mit /localhost ist es problemlos gegangen...

      1. Hi,

        Ich würde hier nicht Hilfe suchen wenn ich nicht schon nach Lösungen geschaut hätte geschweige denn ich die Lösung schon wüsste, oder nicht?

        Wenn du ernsthaft nach der Ursache des Problems gesucht hättest, hättest du m.E. auch genügend Stellen finden sollen, die die Ursache erklären.

        Ich habe außerdem folgendes festgestellt: auf dem Server von Plativio.com auf dem die index.php ist hat Probleme mit der Weiterleitung, mit /localhost ist es problemlos gegangen...

        Stichwort: output_buffering.

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        1. Hi,

          Ich würde hier nicht Hilfe suchen wenn ich nicht schon nach Lösungen geschaut hätte geschweige denn ich die Lösung schon wüsste, oder nicht?

          Wenn du ernsthaft nach der Ursache des Problems gesucht hättest, hättest du m.E. auch genügend Stellen finden sollen, die die Ursache erklären.

          Ich habe außerdem folgendes festgestellt: auf dem Server von Plativio.com auf dem die index.php ist hat Probleme mit der Weiterleitung, mit /localhost ist es problemlos gegangen...

          Stichwort: output_buffering.

          MfG ChrisB

          So ChrisB... bevor du hier weiterhin den Klugen spielst möchte ich dir eins sagen: nicht jeder kann ein Gescheitling sein, da gehöre ich sicherlich auch dazu, auch ich bilde und entwickle mich weiter. Zweitens distanziere ich mich von solchen Unterstellungen ich hätte nicht "ernsthaft nach der Ursache des Problems gesucht". - was ich ja gemacht habe, hingegen ich aber keine für mich passenden Lösungen - außer die von dir genannte Lösung mit output_buffering - gefunden habe wo ich die Lösung auch sinnvoll und für mich auch verständlich nachvollziehen kann.

          Ansonsten: danke für den Gedankenanstoß.

          1. Hallo,

            Hi,
            [...]
            MfG ChrisB

            was hast du an meiner Bitte, sinnvoll zu zitieren, nicht verstanden? Das hat zwar nichts mit deinem Problem zu tun, aber mit Kommunikationskultur.

            außer die von dir genannte Lösung mit output_buffering
            Ansonsten: danke für den Gedankenanstoß.

            Ich glaube nicht, dass Chris dir die Verwendung von output buffering empfehlen wollte - im Gegenteil, das ist eigentlich eine große Keule, die man normalerweise vermeiden möchte (und nur sehr selten wirklich braucht). Ich denke, er wollte andeuten, dass auf deinem localhost möglicherweise output buffering aktiv ist und das eigentliche Problem dadurch vertuscht wird.

            Auf meine These, dass eine UTF-8-BOM am Dateianfang das Problem sein könnte, bist du mit keinem Wort eingegangen (obwohl das ein häufiges Ärgernis ist und die Indizien darauf hindeuten), und auch die Hinweise von 1UnitedPower und MudGuard solltest du ernst nehmen, bzw. die gravierenden Fehler ausbessern, auf die die beiden hinweisen.

            So, und jetzt bitte nochmal konkret:
             * Hat deine Scriptdatei eine BOM? Wenn ja, stelle deinen Editor um, so dass er UTF-8 *ohne* BOM speichert.
             * Hat deine Scriptdatei eine Leerzeile (ein Linefeed?) vor dem "<?php"? Weg damit!

            So long,
             Martin

            --
            Abraham sprach zu Bebraham: Kann i mal dei Cebra ham?
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  5. Hi,

    header("LOCATION: disneyland.disney.go.com/");

    Unabhängig vom bereits gesagten:

    beim Location-Header muß eine vollständige URL angegeben sein.
    Keine relative wie bei Dir.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.