Alexander Krug: Seitenrefresh nach Absenden eines Formulars

Hallo, allerseits!

Ich hab ein kleines Problem mit einem Formular und den dadurch aktualisierten Daten:

Ein Benutzer kriegt seinen aktuellen Status (z.B. "Dein Profil ist nicht öffentlich") angezeigt und kann diesen mittels Klick auf einen Button ändern. Durch den Klick wird in der Datenbank einfach der Inhalt das Status-Feldes von 0 auf z.B. 1 gesetzt. So weit funktioniert auch alles. Das Problem ist, daß die Seite sich nach Klicken des Buttons nicht automatisch neu lädt und der Nutzer somit noch den alten Status angezeigt bekommt. Das heißt, ich müßte es irgendwie hinkriegen, daß mit Absenden des Formulars die gesamte Seite neu geladen bzw. zumindest die Datenbank neu ausgelesen und der neue Status angezeigt wird. Gibt es dafür eine einfache Möglichkeit?

Habt Nachsicht mit mir, ich bin noch PHP-Anfänger. ;-)

Vielen Dank auf jeden Fall für Eure Unterstützung!

Alex

  1. Hi

    Hallo, allerseits!

    ... Das heißt, ich müßte es irgendwie hinkriegen, daß mit Absenden des Formulars die gesamte Seite neu geladen ...

    Alex

    Ich vermute du suchst nach header .

    grüße

    1. Ich vermute du suchst nach header .

      Hi und vielen Dank für den Hinweis!

      Ich hab es darüber mal versucht, aber irgendwas mach ich, scheint's, falsch. Ich krieg dauernd folgende Meldung:

      Warning: Cannot modify header information - headers already sent by (XXXXXXXXXXXXXXXXXX) in /xxx/xxx/xxxx/xxxx/xxxx/xxxxxxx.php on line 52

      Ich hab's mit folgendem Code probiert:

      $host  = $_SERVER['HTTP_HOST'];
       $uri   = rtrim(dirname($_SERVER['PHP_SELF']), '/\');
       $extra = 'seite.php';
       header("Location: http://$host$uri/$extra");

      Weiß irgend jemand, was daran falsch ist oder was noch fehlt?

      1. Hallo!

        Weiß irgend jemand, was daran falsch ist oder was noch fehlt?

        Die header() Funktion __muss__ vor allen Ausgaben (echo, print, print_r, Fehlermeldungen, ..) stehen.
        Sobald du per print/echo/was auch immer etwas an den Browser gibst werden automatisch die ensprechenden Header mitgegeben und diese lassen sich dann nicht mehr ändern.

        --
        Lg,
        Snafu
        1. Die header() Funktion __muss__ vor allen Ausgaben (echo, print, print_r, Fehlermeldungen, ..) stehen.
          Sobald du per print/echo/was auch immer etwas an den Browser gibst werden automatisch die ensprechenden Header mitgegeben und diese lassen sich dann nicht mehr ändern.

          Ich glaub, ich steh momentan irgendwie auf dem Schlauch ...

          Also, ich hab die Funktion jetzt ganz nach oben gesetzt:

          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">

          <?php
           header("Location: http://www.blabla.de/seite.php");

          Trotzdem erhalte ich dieselbe Fehlermeldung immer noch:

          Warning: Cannot modify header information - headers already sent by (output started at /xxx/xxxx/xxxx/seite.php:3) in /xxx/xxxx/xxxx/seite.php on line 4

          Geändert hat sich nur das "line 4". In Zeile 4 steht aber:

          header("Location: http://www.blabla.de/seite.php");

          Jetzt versteh ich langsam gar nichts mehr ...

          Um mein Problem noch mal genauer darzulegen:

          Zuerst wird in der Datenbank ausgelesen, welcher Wert unter "status" steht. Dann wird je nach Wert eine Statusanzeige ausgegeben. Das sieht z.B. so aus:

          Sie sind derzeit:
          <?php
          if($ergebnis[status]=="0")
          {
          echo "nicht verfügbar.";
          }

          Anhand dieses Wertes wird dann auch ein Button angezeigt, mittels dessen der Benutzer den Status ändern kann.

          Der Code für einen Button sieht z.B. so aus:

          <?php
           if($ergebnis[status]=="0")
           {
           ?>
           <form action="<?php echo $PHP_SELF; ?>" method="post">
           <input type="hidden" name="flag" value="1">
           <input type="submit" value="Status &auml;ndern auf: jetzt verfügbar">
           <?php
           if($_POST[flag]==1)
           {
           $sql="UPDATE $tabellenname set status=1";
           $link = mysql_connect("localhost", "Benutzername", "Paßwort");
           mysql_select_db("Datenbank", $link);
           $result = mysql_query($sql, $link);
           }
           }
           ?>

          Die Seite soll demnach neu geladen, werden sobald der Benutzer auf den Butten geklickt hat. Dadurch werden die Befehle in der zweiten If-Anweisung ausgeführt (der Wert unter "status" in der Datenbank geändert).

          Wo kann ich jetzt wie dem Browser sagen, daß er nach Drücken des Buttons die Seite neu laden bzw. die Datenbank neu auslesen soll? Entschuldigt meine Verständnisschwierigkeiten ... Momentan kapier ich aber echt gar nichts mehr.

          1. Hi,

            Also, ich hab die Funktion jetzt ganz nach oben gesetzt:

            <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">

            <?php
            header("Location: http://www.blabla.de/seite.php");

            das nennst Du ganz nach oben?

            freundliche Grüße
            Ingo

            1. Hi,

              Also, ich hab die Funktion jetzt ganz nach oben gesetzt:

              <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">

              <?php
              header("Location: http://www.blabla.de/seite.php");
              das nennst Du ganz nach oben?

              freundliche Grüße
              Ingo

              Okay, hab's jetzt so gemacht:

              <?php
               header("Location: http://www.blabla.de/seite.php");
              ?>

              <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">

              Dafür krieg ich jetzt diese Fehlermeldung:

              Safari kann die Seite nicht öffnen.
              Es traten zu viele Verbindungswiederholungen beim Öffnen von „http://www.blabla.de/seite.php“ auf. Dies könnte bei inkorrekten Weiterleitungen auftreten.

              Was ist jetzt wieder falsch?

              1. Hi,

                Dafür krieg ich jetzt diese Fehlermeldung:

                Safari kann die Seite nicht öffnen.
                Es traten zu viele Verbindungswiederholungen beim Öffnen von „http://www.blabla.de/seite.php“ auf. Dies könnte bei inkorrekten Weiterleitungen auftreten.

                Was ist jetzt wieder falsch?

                Du hast vermutlich auf dieselbe Seite weitergeleitet, diese dann wiederum auf dieselbe usw. Jeder Browser gibt dann irgendwann auf. Aber wie Du siehst, funktioniert die Weiterleitung jetzt.

                freundliche Grüße
                Ingo

                1. Du hast vermutlich auf dieselbe Seite weitergeleitet, diese dann wiederum auf dieselbe usw. Jeder Browser gibt dann irgendwann auf. Aber wie Du siehst, funktioniert die Weiterleitung jetzt.

                  freundliche Grüße
                  Ingo

                  Irgendwo gab es, glaub ich, ein Mißverständnis: Ich will überhaupt nirgendwohin weiterleiten. Ich will, daß nach dem Absenden des Formulars bzw. Klicken des Buttons dieselbe Seite neu lädt und damit die Datenbank neu ausliest, weil sich durch den Buttonklick ja was geändert hat. Das muß doch irgendwie möglich sein.

                  1. Moin!

                    Irgendwo gab es, glaub ich, ein Mißverständnis: Ich will überhaupt nirgendwohin weiterleiten. Ich will, daß nach dem Absenden des Formulars bzw. Klicken des Buttons dieselbe Seite neu lädt und damit die Datenbank neu ausliest, weil sich durch den Buttonklick ja was geändert hat. Das muß doch irgendwie möglich sein.

                    Dein Logikfehler ist in https://forum.selfhtml.org/?t=159222&m=1035926 erklärt.

                    - Sven Rautenberg

                    --
                    "Love your nation - respect the others."
  2. echo $begrüßung;

    Ein Benutzer kriegt seinen aktuellen Status (z.B. "Dein Profil ist nicht öffentlich") angezeigt

    Das heißt also, dass die Seite wechselnden Inhalt hat und mit jedem Besuch der Seite etwas anderes dastehen kann. In dem Fall ist es nicht sinnvoll, dass der Browser eine Kopie der Seite im Cache ablegt und beim erneuten Aufrufen diese verwendet.

    Das heißt, ich müßte es irgendwie hinkriegen, daß mit Absenden des Formulars die gesamte Seite neu geladen bzw. zumindest die Datenbank neu ausgelesen und der neue Status angezeigt wird.

    Bitte den Browser also, die Seite jedes Mal neu zu holen. Dazu kannst du HTTP-Header senden (Beispiel im PHP-Handbuch) und/oder im HTML-Head Meta-Elemente verwenden. Siehe Datei von Originaladresse laden und Diverse Meta-Angaben. Ein HTTP-Header hat dabei immer Vorrang vor einer gleichnamigen "meta http-equiv"-Angabe.

    echo "$verabschiedung $name";

    1. echo $begrüßung;

      Ein Benutzer kriegt seinen aktuellen Status (z.B. "Dein Profil ist nicht öffentlich") angezeigt

      Das heißt also, dass die Seite wechselnden Inhalt hat und mit jedem Besuch der Seite etwas anderes dastehen kann. In dem Fall ist es nicht sinnvoll, dass der Browser eine Kopie der Seite im Cache ablegt und beim erneuten Aufrufen diese verwendet.

      Die Seite in diesem Fall ist paßwortgeschützt und nur für diesen einen User zugänglich. Über das Formular auf dieser Seite kann er seinen Status ändern, also ob im öffentlichen Teil der Website z.B. sein Profil angezeigt werden soll oder nicht. Die Seite hat also wechselnde Inhalte, allerdings werden die vom User immer manuell geändert.

      Das heißt, ich müßte es irgendwie hinkriegen, daß mit Absenden des Formulars die gesamte Seite neu geladen bzw. zumindest die Datenbank neu ausgelesen und der neue Status angezeigt wird.

      Bitte den Browser also, die Seite jedes Mal neu zu holen. Dazu kannst du HTTP-Header senden (Beispiel im PHP-Handbuch) und/oder im HTML-Head Meta-Elemente verwenden. Siehe Datei von Originaladresse laden und Diverse Meta-Angaben. Ein HTTP-Header hat dabei immer Vorrang vor einer gleichnamigen "meta http-equiv"-Angabe.

      Ich hab das alles probiert, aber es klappt trotzdem nicht. Es geht ja nicht (nur) darum, daß die Inhalte der Datenbank bei jedem Seitenbesuch neu ausgelesen werden müssen und nicht aus einem Cache kommen dürfen. Es geht darum, daß die Seite automatisch nach Klicken eines Buttons neu geladen wird und dadurch die Daten in der Datenbank gelesen.

      Momentan kriegt der User angezeigt: Ihr Profil ist nicht öffentlich. Er möchte es jetzt aber veröffentlichen und klickt auf den Button "Profil freigeben". Nach Klicken dieses Buttons wurde zwar in der Datenbank der entsprechende Eintrag geändert, aber der User kriegt immer noch angezeigt "Ihr Profil ist nicht öffentlich" und den Button zum Freigeben. Er soll aber den neuen Status angezeigt kriegen und den neuen Button, mit dem er es wieder sperren kann.

      Eine Weiterleitung mit der header()-Funktion hat bislang nicht funktioniert bzw. hab ich's nicht hingekriegt ...

      Das ganze Script sieht momentan so aus:

      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">

      <?php

      $tabellenname="xxxxxx";
       $link = mysql_connect("localhost", "xxxxx", "xxxxxxx");
       mysql_select_db("xxxxxxxx", $link);
       $sql="SELECT status FROM $tabellenname";
       $result = mysql_query($sql, $link);
       $ergebnis=mysql_fetch_array($result);
       ?>

      <HTML>
       <HEAD>
       <meta http-equiv="expires" content="0">
        <TITLE> </TITLE>
       </HEAD>
       <BODY>

      Ihr Profil ist derzeit:
      <?php
      if($ergebnis[status]=="0")
      {
      echo "nicht öffentlich.";
      }
      if($ergebnis[status]=="1")
      {
      echo "öffentlich.";
      }
      ?>

      <?php
       if($ergebnis[status]=="0")
       {
       ?>
       <form action="<?php echo $PHP_SELF; ?>" method="post">
       <input type="hidden" name="flag" value="1">
       <input type="submit" value="Status &auml;ndern auf: öffentlich">
       <?php
       if($_POST[flag]==1)
       {
      $sql="UPDATE $tabellenname set status=1";
       $link = mysql_connect("localhost", "xxxxx", "xxxxxxxxx");
       mysql_select_db("xxxxxxxxxx", $link);
       $result = mysql_query($sql, $link);
       }
       }
       ?>

      </BODY>
      </HTML>

      Welche Möglichkeit(en) hab ich denn nun hier, dem Browser zu sagen, daß er mit Klick auf den Button zuerst den Wert ändern und dann sofort die Seite neu laden oder zumindest die Datenbank neu auslesen soll?

      Ich wäre Euch wirklich überaus dankbar, wenn mir irgend jemand einen entscheidenden Tipp geben könnte. Bislang hat alles nicht so recht funktioniert, was ich mit der header()-Funktion probiert hab. Ich mache sicher irgendwas ganz grob falsch oder gar nicht, aber ich weiß nicht, was ...

      1. Moin!

        Ich hab das alles probiert, aber es klappt trotzdem nicht. Es geht ja nicht (nur) darum, daß die Inhalte der Datenbank bei jedem Seitenbesuch neu ausgelesen werden müssen und nicht aus einem Cache kommen dürfen. Es geht darum, daß die Seite automatisch nach Klicken eines Buttons neu geladen wird und dadurch die Daten in der Datenbank gelesen.

        Die Sache ist doch klar:

        Erster Seitenaufruf. Die Datenbank wird gelesen und der Status angezeigt.

        Dann Buttonklick.

        Zweiter Seitenaufruf. Die Datenbank wird gelesen und der Status angezeigt. Dann wird der neue Status in die Datenbank geschrieben. Was also wird die Statusanzeige anzeigen, den neuen oder den alten Zustand?

        Reload.

        Dritter Seitenaufruf. Die Datenbank wird gelesen und der Status angezeigt. Wird jetzt der alte oder der neue Status angezeigt?

        Du hast den typischen Denkfehler gemacht. Deshalb halte dich grundsätzlich an folgende Reihenfolge: EVA. Das heißt: Eingabe, Verarbeitung, Ausgabe.

        Derzeit hast du Ausgabe, Eingabe, Verarbeitung, noch mehr Ausgabe, und du hoffst, dass die spätere Verarbeitung dann noch rückwirkend Einfluß auf die schon erfolgte Ausgabe nimmt - was zeitlich unmöglich ist, denn Zeitmaschinen sind noch nicht erfunden.

        Deshalb grundsätzlich: Am Skriptanfang beginnt direkt in der ersten Zeile erstmal der PHP-Block. Dann wird darin viel programmiert. Und ganz am Ende, wenn alles berechnet und aktualisiert wird, kommt der Skript- und HTML-Teil, der die Ausgabe realisiert.

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
  3. Irgendwo gab es, glaub ich, ein Mißverständnis: Ich will überhaupt nirgendwohin weiterleiten. Ich will, daß nach dem Absenden des Formulars bzw. Klicken des Buttons dieselbe Seite neu lädt und damit die Datenbank neu ausliest, weil sich durch den Buttonklick ja was geändert hat. Das muß doch irgendwie möglich sein.

    Was ich nicht verstehe ist, wie die Seite den Status des Profils auf "öffentlich setzten kann, wenn sie nicht neu geladen wird?
    Die "Aufforderung" muss ja erstmal zum Server -> Die Seite muss sich neu laden.

    Ich würde das so machen (Skript nicht getestet):

    <?php
     $tabellenname="xxxxxx";
     $link = mysql_connect("localhost", "xxxxx", "xxxxxxx");
     mysql_select_db("xxxxxxxx", $link);

    if($_POST['flag'] == 1) {
      $sql = "UPDATE $tabellenname set status = 1";
      $link = mysql_connect("localhost", "xxxxx", "xxxxxxxxx");
      mysql_select_db("xxxxxxxxxx", $link);
      $result = mysql_query($sql, $link);
     }

    $sql="SELECT status FROM $tabellenname";
     $result = mysql_query($sql, $link);
     $ergebnis=mysql_fetch_array($result);
    ?>
    <HTML>
     <HEAD>
      <TITLE> </TITLE>
     </HEAD>
     <BODY>

    Ihr Profil ist derzeit:
    <?php
    if($ergebnis[status]=="0") {
     echo "nicht öffentlich.";
    }

    if($ergebnis[status]=="1") {
     echo "öffentlich.";
    }
    ?>

    <?php
    if($ergebnis[status]=="0") {
    ?>
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
    <input type="hidden" name="flag" value="1">
    <input type="submit" value="Status &auml;ndern auf: öffentlich">
    </form>
    <?php
    }
    ?>
     </BODY>
    </HTML>