gomsoo: Cannot modify header information - headers already sent

Hallo Zusammen

Ich weiss, das Problem wurde hier schon x-Mal diskutiert, aber trotzdem komme ich nicht weiter.

Die Fehlermeldung "Cannot modify header information - headers already sent" kam anfänglich nicht, ohne Änderungen erschien sie plötzlich!

Mit meinem PHP-File erzeuge ich "echo's", d.h. die Seite wird aufgrund von den Datenbankeinträgen erzeugt!
Klicke ich auf meinen Button, werden die geänderten Daten in die Datenbank zurückgeschrieben (funktioniert alles wunderbar) und anschliessen soll die selbe Seite neu geladen werden. Dies mache ich mit "header("Location:admin.php");".

Gibt es da irgendein eine Idee, wie ich das bewerkstelligen kann?

Besten Dank für eure Antworten

Gomsoo

  1. Hi gomsoo!

    Wie sieht das Skript aus, das die geänderten Daten in die DB schreibt und dann per header weiterleitet?

    MfG H☼psel

    --
    "It's amazing I won. I was running against peace, prosperity, and incumbency."
    George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
    Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
  2. Hello,

    Klicke ich auf meinen Button, werden die geänderten Daten in die Datenbank zurückgeschrieben (funktioniert alles wunderbar) und anschliessen soll die selbe Seite neu geladen werden. Dies mache ich mit "header("Location:admin.php");".

    Gibt es da irgendein eine Idee, wie ich das bewerkstelligen kann?

    Du willst also nur die Meldung beseitigen?
    Dann hast Du bestimmt eine Ausgabe produziert vor dem header()-Statement.
    Das kann auch passieren, wenn man sich z.B. eine BOM einfängt durch falsche Einstellungen im Editor oder eben einfach nur ein Leerzeichen vor dem "<?php" stehen hat.

    Ein harzliches Glückauf

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hi

      Ich möchte nicht nur die Meldung beseitigen, sondern auch, dass die Seite neu geladen wird mit den neuen Daten in der Datenbank

      1. Hello,

        Ich möchte nicht nur die Meldung beseitigen, sondern auch, dass die Seite neu geladen wird mit den neuen Daten in der Datenbank

        Mit den neuen Daten _aus_ der Datenbank würde sicherlich gehen ;-))

        Wenn die Meldung verschwindet ist der Fehler verschwunden und damit sollte es auch wieder so funktionieren, wie vorher. Dann müssten die Header (für die Umleitung) wieder gesendet werden und der Browser bekommt wieder seine alten Hinweise für den Re-Request.

        Ein harzliches Glückauf

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
  3. Hi,

    Ich weiss, das Problem wurde hier schon x-Mal diskutiert, aber trotzdem komme ich nicht weiter.

    woran hakt es denn?

    Die Fehlermeldung "Cannot modify header information - headers already sent" kam anfänglich nicht, ohne Änderungen erschien sie plötzlich!
    [...] "header("Location:admin.php");".

    Vielleicht hat Dein Provider die PHP-Installation gepatcht, so dass dieser ungültige HTTP-Header mit einer Fehlermeldung quittiert wird? Das wäre natürlich eine Ausgabe, nach der der Header nicht mehr hinzugefügt werden könnte. Repariere also zunächst diesen Code-Teil.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hallo

      Hmmm, aber ich muss beim Seitenaufbau zuerst einwenig Code (echo's) erzeugen, ich erstelle anhand von der Anzahl Einträge in der Datenbank Checkboxen. Wenn ich diese dann ankreuzen, und auf den Button Klicke, wird die Datenbank geupdatet! Nach diesem Akt soll die Seite neu geladen werden, um sicherzustellen, dass alle Änderungen übernommen worden sind.

      1. Hi!

        Wo brauchst Du denn beim Datenbankupdate Ausgaben? Die Checkboxen haben doch nichts damit zu tun.

        Ankreuzen blabla
        Klick

        Dein phpcode wird aufgerufen

        Datenbankupdate
        Weiterleitung

        --
        Wenn Du eine Antwort nicht verstehst, trau dich und frag nochmal nach.
         
      2. Mahlzeit gomsoo,

        Hmmm, aber ich muss beim Seitenaufbau zuerst einwenig Code (echo's) erzeugen,

        Zuerst? Sicher nicht: EVA-Prinzip.

        ich erstelle anhand von der Anzahl Einträge in der Datenbank Checkboxen. Wenn ich diese dann ankreuzen, und auf den Button Klicke, wird die Datenbank geupdatet!

        Wie wird sie das? Sicher doch, indem ein Formular an irgendein PHP-Skript geschickt wird, oder? Erzeugt dieses PHP-Skript Ausgaben?

        Nach diesem Akt soll die Seite neu geladen werden, um sicherzustellen, dass alle Änderungen übernommen worden sind.

        Bisher ist nur wildes Herumraten und Stochern im Nebel möglich. Wenn Du konkrete Hilfe willst, zeige Code - und zwar nur relevanten ... "Keine Arme - keine Kekse"

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
        1. Hello,

          [...] Sicher doch, indem ein Formular an irgendein PHP-Skript geschickt wird, oder?

          Seit wann kann man Formulare an Scripte verschicken?  *stichel*

          Wie müsste denn dieser Satz wirklich heißen?

          Ein harzliches Glückauf

          Tom vom Berg

          --
          Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. Mahlzeit Tom,

            [...] Sicher doch, indem ein Formular an irgendein PHP-Skript geschickt wird, oder?

            Seit wann kann man Formulare an Scripte verschicken?  *stichel*

            OMG, Du bist heute aber mal ganz besonders genau - zum Frühstück 'nen Haarspalter gegessen? ;-)

            Wie müsste denn dieser Satz wirklich heißen?

            "Sicher doch, indem die in einem Formular gesammelten Daten an irgendein PHP-Skript geschickt werden, oder?"

            Aber verständlicher ist das auch nicht - IMHO wird auch schon in meiner ursprünglichen Fassung deutlich, was gemeint ist.

            MfG,
            EKKi

            --
            sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
  4. Danke vielmals für euer Engagment.

    Ich denke, es ist Zeit den Code hier reinzubrösmeln!

    admin.php:

      
      
    <?  
      
    include("../include/session.php");  
      
      
    function displayUsers(){  
       global $database;  
       $q = "SELECT username,userlevel,email,timestamp,p_sms, p_sms_group, p_user_own, p_user_allM, p_user_allF "  
           ."FROM ".TBL_USERS." ORDER BY username";  
       $result = $database->query($q);  
       /* Error occurred, return given name by default */  
       $num_rows = mysql_numrows($result);  
       if(!$result || ($num_rows < 0)){  
          echo "Error displaying info";  
          return;  
       }  
       if($num_rows == 0){  
          echo "Database table empty";  
          return;  
       }  
       /* Display table contents */  
       echo "<table align=\"left\" border=\"1\" cellspacing=\"0\" cellpadding=\"3\">\n";  
       echo "<tr><td><b>Username</b></td><td><b>Level</b></td><td><b>Email</b></td><td><b>p_sms</b></td><td><b>p_sms_group</b></td><td><b>p_user_allM</b></td><td><b>p_user_allF</b></td><td><b>p_user_own</b></td><td><b>Last Active</b></td></tr>\n";  
       for($i=0; $i<$num_rows; $i++){  
          $uname  = mysql_result($result,$i,"username");  
          $ulevel = mysql_result($result,$i,"userlevel");  
          $email  = mysql_result($result,$i,"email");  
          $p_sms  = mysql_result($result,$i,"p_sms");  
       $p_sms_group  = mysql_result($result,$i,"p_sms_group");  
       $p_user_own  = mysql_result($result,$i,"p_user_own");  
       $p_user_allM  = mysql_result($result,$i,"p_user_allM");  
       $p_user_allF  = mysql_result($result,$i,"p_user_allF");  
       $time   = mysql_result($result,$i,"timestamp");  
      
          if($p_sms == 1) {$tp_sms = " checked"; } else {$tp_sms = ""; }  
       if($p_sms_group == 1) {$tp_sms_group = " checked"; } else {$tp_sms_group = ""; }  
       if($p_user_allM == 1) {$tp_user_allM = " checked"; } else {$tp_user_allM = ""; }  
       if($p_user_allF == 1) {$tp_user_allF = " checked"; } else {$tp_user_allF = ""; }  
       if($p_user_own == 1) {$tp_user_own = " checked"; } else {$tp_user_own = ""; }  
      
      
          echo "<tr><td>$uname</td><td>$ulevel</td><td>$email</td><td><input name='".$uname."_p_sms' type='checkbox' value='1'" . $tp_sms . "></td><td><input name='".$uname."_p_sms_group' type='checkbox' value='1'" . $tp_sms_group . "></td><td><input name='".$uname."_p_user_allM' type='checkbox' value='1'" . $tp_user_allM . "></td><td><input name='".$uname."_p_user_allF' type='checkbox' value='1'" . $tp_user_allF . "></td><td><input name='".$uname."_p_user_own' type='checkbox' value='1'" . $tp_user_own . "></td><td>$time</td></tr>\n";  
       }  
       echo "</table><br>\n";  
      
    }  
      
    ?>  
    <html>  
    <title>Admin</title>  
    <body>  
    <h1>Admin Center</h1>  
    <font size="5" color="#ff0000">  
    <b>::::::::::::::::::::::::::::::::::::::::::::</b></font>  
    <font size="4">Logged in as <b><? echo $session->username; ?></b></font><br><br>  
    Back to [<a href="../main.php">Main Page</a>]<br><br>  
    <?  
    if($form->num_errors > 0){  
       echo "<font size=\"4\" color=\"#ff0000\">"  
           ."!*** Error with request, please fix</font><br><br>";  
    }  
    ?>  
    <table align="left" border="0" cellspacing="5" cellpadding="5">  
    <tr><td>  
    <?  
    /**  
     * Display Users Table  
     */  
    ?>  
    <h3>Users Table Contents:</h3>  
    <p>  
      
    </p>  
    <table>  
      <form action="admin.php" method="POST">  
        <tr>  
          <td><br>  
      
    <?  
     displayUsers();  
    ?>  
       </td><tr></tr><td>  
              <input type="submit" value="Update Access" name="btnPA">      </td>  
        </tr>  
      </form>  
    </table>  
      
    <?  
      
    if ($_POST['btnPA']){  
       /* Display table contents */  
      /* displayUsers();  */  
      global $database, $session;  
      $a_pages = array("p_sms", "p_sms_group", "p_user_allM", "p_user_allF", "p_user_own");  
       $q = "SELECT username "  
           ."FROM ".TBL_USERS." ORDER BY username";  
       $result = $database->query($q);  
       /* Error occurred, return given name by default */  
       $num_rows = mysql_numrows($result);  
       for($i=0; $i<$num_rows; $i++){  
          $uname  = mysql_result($result,$i,"username");  
          foreach ($a_pages as $tmp9){  
      if ($_POST[$uname . "_" . $tmp9] == "1"){  
       $database->updateUserField($uname, $tmp9, "1");  
      }else{  
       $database->updateUserField($uname, $tmp9, "0");  
      }  
         }  
       }  
       header("Location:admin.php");  
    }  
      
    ?>  
    
    
    1. Mahlzeit gomsoo,

      header("Location:admin.php");

      Das wird nicht funktionieren - Du hast immer noch Ausgaben, bevor diese Funktion aufgerufen wird.

      MfG,
      EKKi

      --
      sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
      1. Hi

        genau, das ist mir bewusst, aber wie kriege ich dann die dynisch erzeugten Checkboxen auf meine Seite?

        Muss ich viellicht alles zuerst puffern?

        1. Hallo,

          genau, das ist mir bewusst, aber wie kriege ich dann die dynisch erzeugten Checkboxen auf meine Seite?

          Muss ich viellicht alles zuerst puffern?

          Könntest du. Du wurdest aber schon auf das EVA-Prinzip hingewiesen. Warum machst du nicht zuerst die Prüfung, und dann abhängig davon die Umleitung oder Ausgabe?

          Gruß

          1. Weil ich zuerst eine Ausgabe machen muss, damit der User dann auch die Checkboxen sehen kann und bearbeiten kann! Erst wenn er fertig gecheckt hat und mit dem Klick auf den Button bestätigt, soll die Seite neu geladen werden.

            Ich kann ja nicht zuerst die Seite neu laden, macht ja keinen Sinn, oder ich habe dich jetzt falsch verstanden.

            1. Hallo,

              Du willst doch folgendes:

              Benutzer fordert Formular an
                         ||
                         /
              //>> Script sendet Formular (evtl. mit Fehlerbeschreibung)
              ||         ||
              ||         /
              ||   Benutzer füllt das Formular aus und schickt es an die gleiche URL
              ||         ||
              ||         /
              ||   Das Script prüft die Eingabe
              \====<< wenn ungültig
                       wenn gültig
                         ||
                         /
                   Umleiten

              Du schaust dann zunächst, ob Eingabedaten vorhanden sind. Wenn ja, prüfst du sie. Sind sie in Ordnung, kannst du den Umleitungsgheader senden, ansonsten, oder wenn keine Eingabe gemacht wurde, gibst du das Formular aus. Wo liegt jetzt genau das Problem?

              Btw: Du solltest das <font>-Element nicht verwenden. Benutze CSS für die Darstellung.

              Gruß

              1. Hallo

                Ja genau so, aber bei "Script sendet Formular" mache ich es mit Echo's, und ist somit vor dem Umleiten!

                Oder wie gebe ich das Formular am Besten aus?

                ps: Mit den <font>-Elementen hast du vollkommen recht, aber mein Script hat bis anhin noch keine wirkliche Formatierung, da ich selber noch nicht weiss, wie es aussehen sollte, ich konzentriere mich vorerst auf die Funktionen.

                1. Yerf!

                  Ja genau so, aber bei "Script sendet Formular" mache ich es mit Echo's, und ist somit vor dem Umleiten!

                  Oder wie gebe ich das Formular am Besten aus?

                  Wozu? In dem Moment, wo das Eintragen stattfindet und umgeleitet werden soll muss das Formular doch gar nicht ausgegeben werden.

                  Es sieht so aus, als hättest du noch etwas Schwierigkeiten dir die Abläufe bei einem Webfromular vorzustellen.

                  Dein Skript wird insgesamt 2 mal aufgerufen. Beim ersten mal erscheint das Formular mit den Eingabefeldern, danach ist das Skript beendet. Beim abschicken des Formulars wird dann das Skript neu gestartet. Da nun nur noch gespeichert und umgeleitet werden soll müssen in diesem fall keine weiteren Ausgaben vom Skript erfolgen.

                  Somit kannst du zum Beginn des Skipts abfragen, ob der Senden-Button betätigt wurde.

                  Wenn nein: Gib das Formular aus.

                  Wenn ja: Datenbankaktion und Weiterleitung

                  Gruß,

                  Harlequin

                  --
                  <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
                  1. "Es sieht so aus, als hättest du noch etwas Schwierigkeiten dir die Abläufe bei einem Webfromular vorzustellen."

                    Genau, mitten ins schwarze getroffen!

                    Ich habe  "if ($_POST['btnPA'])" ganz brav an den Anfang des Scripts verschoben, und siehe da, es funktioniert einwandfrei! GEIL!

                    Wo darf ich die Flasche Wein hinschicken?

                    Besten Dank euch allen, mir ist ein riesen Brocken von Herzen gefallen

                2. Hallo,

                  Ja genau so, aber bei "Script sendet Formular" mache ich es mit Echo's, und ist somit vor dem Umleiten!

                  Oder wie gebe ich das Formular am Besten aus?

                  Ich glaube, du hast nicht richtig gelesen. Dieser Satz:

                  Sind sie in Ordnung, kannst du den Umleitungsgheader senden, ansonsten, oder wenn keine Eingabe gemacht wurde, gibst du das Formular aus.

                  sagt dir doch, dass du _entweder_ umleitest _oder_ das Formular ausgibst. Also in etwa so:

                    
                  $formular_wurde_gesendet = isset($_POST['name_des_absendebuttons']);  
                  $formular_daten_ok = false;  
                  if ($formular_wurde_gesendet) {  
                    // Daten prüfen, falls OK, $formular_daten_ok auf true setzen  
                  }  
                  if ($formular_wurde_gesendet && $formular_daten_ok) {  
                    // Umleitung  
                  } else {  
                    // Formular ausgeben  
                  }  
                  
                  

                  Gruß

                  1. "Es sieht so aus, als hättest du noch etwas Schwierigkeiten dir die Abläufe bei einem Webfromular vorzustellen."

                    Genau, mitten ins schwarze getroffen!

                    Ich habe  "if ($_POST['btnPA'])" ganz brav an den Anfang des Scripts verschoben, und siehe da, es funktioniert einwandfrei! GEIL!

                    Wo darf ich die Flasche Wein hinschicken?

                    Besten Dank euch allen, mir ist ein riesen Brocken von Herzen gefallen