Yadgar: Problem mit Eingabeformular

High!

Ich versuche seit gestern, ein Eingabeformular für eine Benutzer-Registrierung (die üblichen Angaben...) PHP-gestützt zum Laufen zu bringen... mir schwebt dabei vor, dass bei teilweise fehlerhaften Angaben die korrekten Angaben beim Klicken auf die Submit-Taste stehen bleiben; Eingabeformulare und PHP-Verarbeitungslogik befinden sich im selben Skript, so dass die Daten an das Skript selbst zurückgesendet werden. Zu diesem Zweck habe ich ein Array für die zu erfüllenden Bedingungen bei den Pflichtfeldern ($entries[]) eingerichtet, in dem alle Elemente anfänglich auf true gesetzt sind. Sobald nach dem Drücken von "submit" in einem Eingabefeld ein Wert als nicht vorhanden oder fehlerhaft erkannt wird, wird das entsprechende Array-Element auf false gesetzt.

Zusätzlich existiert ein Array für sämtliche den möglichen Fehleingaben entsprechenden Fehlermeldungen, die dann ebenfalls entsprechend der auf false gesetzten Bedingungs-Elemente ausgegeben werden.

Anschließend werden die Elemente im Bedingungs-Array wieder auf true gesetzt.

Damit bereits richtig eingegebene Daten beim Anklicken der Submit-Taste nicht gelöscht werden, fügte ich für jedes Eingabefeld PHP-gesteuert einen value-Wert ein (hier im Beispiel für das Feld "vorname"):

  
	<?php  
	  if ($entries[0]==true) echo $_POST['vorname'];  
	  else echo "";  
	?>  

Leider funktioniert dies auch nicht... gibt es überhaupt eine Möglichkeit, Eingaben über das Drücken von submit hinaus zu speichern?

Bis bald im Khyberspace!

Yadgar

  1. Hallo Yadgar,

    Leider funktioniert dies auch nicht... gibt es überhaupt eine Möglichkeit, Eingaben über das Drücken von submit hinaus zu speichern?

    Ich habe nicht ganz verstanden, was du tust, aber wenn du Daten über Seitengrenzen hinweg behalten willst brauchst du entweder Sessions oder du musst sie immer per POST oder GET mitgeben.

    Speicher also einfach die Daten aus dem Formular in die zugehörige Sessionvariable und lies diese beim Anzeigen der Seite aus.

    Tipp: Sessions auf php.net

    ciao
    romy

    1. Hallo Yadgar,

      Ich habe nicht ganz verstanden, was du tust, aber wenn du Daten über Seitengrenzen hinweg behalten willst brauchst du entweder Sessions oder du musst sie immer per POST oder GET mitgeben.

      Speicher also einfach die Daten aus dem Formular in die zugehörige Sessionvariable und lies diese beim Anzeigen der Seite aus.

      Über Seitengrenzen hinweg müssen die Daten nicht behalten werden, da sowohl das Formular als auch die Verarbeitungslogik im selben Skript (registrierung.php) enthalten sind - im Formular steht action="registrierung.php", das Skript schickt die Daten also an sich selbst!

      1. Hallo Yadgar,

        Über Seitengrenzen hinweg müssen die Daten nicht behalten werden, da sowohl das Formular als auch die Verarbeitungslogik im selben Skript (registrierung.php) enthalten sind - im Formular steht action="registrierung.php", das Skript schickt die Daten also an sich

        selbst!

        Wenn du ein Formular ausfüllst und an sich selbst schickst sind deine Daten in den GET bzw. POST-Variablen drin. Wenn du diese nun schlicht anzeigst im Formular, sollte ein Ergebnis zu sehen sein. Wenn nicht, machst du irgendwas anders. Was machst du also genau?

        ciao
        romy

        1. High!

          Wenn du ein Formular ausfüllst und an sich selbst schickst sind deine Daten in den GET bzw. POST-Variablen drin. Wenn du diese nun schlicht anzeigst im Formular, sollte ein Ergebnis zu sehen sein. Wenn nicht, machst du irgendwas anders. Was machst du also genau?

          Ich gebe die Daten ein, drücke auf Submit - und in diesem Augenblick sind sie verschwunden, obwohl ich im Formular für jede Eingabezeile eine Verzweigung programmiert habe, die im Falle einer korrekten Eingabe den übergebenen Wert im Formular belässt:

            
              <td class="b"><b>Vorname<sup>*</sup>:</b>&nbsp;</td>  
          	<td class="b"><input type="text" name="vorname" value="  
          	<?php  
          	  if ($entries[0]==true) echo $_POST['vorname'];  
          	  else echo "";  
          	?>  
          	 "></input></td>  
          
          

          Die Definition von $entries[] steht im Anschluss an das Formular:

            
            $entries=array(true, true, true, true, true, true, true, true, true, true);  
          
          

          $entries enthält 10 Elemente entsprechend der 10 Pflichtfelder in meinem Formular. Für jedes falsch oder überhaupt nicht ausgefüllte Pflichtfeld wird das entsprechende Array-Element auf false gesetzt, z. B.

            
             if (empty($_POST['vorname']))  
             {  
               $error=0;  
          	 $entries[$error]=false;  
             }  
          
          

          Leider scheint aber $entries[] nach Anklicken von submit nicht mehr definiert zu sein, so dass die Speicherung der bereits richtig eingegebenen Werte im Formular nicht funktioniert... ist das normal?

          Bis bald im Khyberspace!

          Yadgar

          1. Hallo Yadgar,

            <td class="b"><b>Vorname<sup>*</sup>:</b>&nbsp;</td>
            <td class="b"><input type="text" name="vorname" value="
            <?php
              if ($entries[0]==true) echo $_POST['vorname'];
              else echo "";
            ?>
            "></input></td>

            Warum nicht einfach if (!empty($\_POST['vorname'])) echo $\_POST['vorname']; oder sogar nur echo $\_POST['vorname']. Wenn es leer ist wird ja so oder so nichts angezeigt, warum nachfragen?  
              
            
            > Die Definition von $entries[] steht im Anschluss an das Formular:  
            > Leider scheint aber $entries[] nach Anklicken von submit nicht mehr definiert zu sein, so dass die Speicherung der bereits richtig eingegebenen Werte im Formular nicht funktioniert... ist das normal?  
            
            Genau, $entries verschwindet, wenn du die Seite neu lädst, was automatisch beim abschicken eines Formlars passiert. Du könntest $entries in einer Sessionvariablen speichern und diese dann auslesen, dann hättest du deine Daten noch. Nur, wenn ich das jetzt richtig verstanden habe, brauchst du das gar nicht, oder? Da war eher ein Verständnisproblem bei der Anzeige der Post-Variablen!?  
              
            ciao  
            romy
            
            -- 
            [Frauenfussball SV 09 Hofheim](http://frauenfussballsv09hofheim.de)
            
            1. High!

              Warum nicht einfach if (!empty($_POST['vorname'])) echo $_POST['vorname']; oder sogar nur echo $_POST['vorname']. Wenn es leer ist wird ja so oder so nichts angezeigt, warum nachfragen?

              Dein Vorschlag ändert allerdings nichts am Ergebnis, wie ich gerade herausgefunden habe...

              Genau, $entries verschwindet, wenn du die Seite neu lädst, was automatisch beim abschicken eines Formlars passiert. Du könntest $entries in einer Sessionvariablen speichern und diese dann auslesen, dann hättest du deine Daten noch.

              Das werde ich dann wohl machen müssen... danke für den Tipp!

              Bis bald im Khyberspace!

              Yadgar

              1. Hallo Yadgar,

                »» Warum nicht einfach if (!empty($_POST['vorname'])) echo $_POST['vorname']; oder sogar nur echo $_POST['vorname']. Wenn es leer ist wird ja so oder so nichts angezeigt, warum nachfragen?
                Dein Vorschlag ändert allerdings nichts am Ergebnis, wie ich gerade herausgefunden habe...

                Warum? Wie äußert sich das?

                Ich formuliere mal, was ich verstanden habe, wie es läuft bei dir, vielleicht kommen wir ja noch zum Pferdefuß ;)

                Du hast ein Eingabeformular in einer .php-Datei. Action führt mit der Method="POST" zu genau derselben .php-Datei. Wenn du nach dem Abschicken des Formulars irgendwo am Anfang echo $_POST["vorname"]; stehen hast und es ein gefülltes Eingabefeld vorname gab, dann solltest du einen Wert ausgespuckt bekommen.

                echo var_dump($_POST); sollte dir anzeigen, was generell gespeichert wurde beim Versenden um Schreibfehler auszuschließen.

                Ich denke, du hast entweder ein anderes Verfahren oder einen Schreibfehler bei den Bezeichnern.

                ciao
                romy

      2. Hello Yadgar,

        Ich habe nicht ganz verstanden, was du tust, aber wenn du Daten über Seitengrenzen hinweg behalten willst brauchst du entweder Sessions oder du musst sie immer per POST oder GET mitgeben.

        Speicher also einfach die Daten aus dem Formular in die zugehörige Sessionvariable und lies diese beim Anzeigen der Seite aus.

        Über Seitengrenzen hinweg müssen die Daten nicht behalten werden, da sowohl das Formular als auch die Verarbeitungslogik im selben Skript (registrierung.php) enthalten sind - im Formular steht action="registrierung.php", das Skript schickt die Daten also an sich selbst!

        Das bezeichnet man dann aber schon "über Seitengrenzen hinweg", weil zwischen der Anzeige des Formulares und der Weiterverarbeitung der Daten immer mindestens ein Requestzyklus liegt.
        Jeder request steht für sich alleine und weiß erstmal nichts von anderen Requests, denn HTTP ist ein zustandsloses Protokoll.

        Um nun bei einem neuen Request einen anderen Startzustand als den Default-Zustand zu erzeugen, kannst Du Sessions benutzten, oder aber (das ist aber hässlich) die Daten immer zwischen Client und Server hin und her schicken.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
  2. Hello,

    welche Art der "Anmeldung" soll es denn sein?
    Möchtest Du die Identifikationsdaten jedes Mal wieder mitsenden? Dann ist es möglich, mit Basic Authentication zu arbeiten.

    Dann musst Du nur dieses Stückchen Code in jedes zu schützende Script einbauen:

    <?php   ### show_auth_vars.php ###

    function authenticate()
        {
            Header("WWW-authenticate: basic realm="Privater Bereich"");
            Header("HTTP/1.0 401 Unauthorized");

    ##      Wahlweise komplette valide HTML-Seite includen
    #        include("wunderbare_leider_nicht_Seite");
    ##      oder nur einen einfachen Text ausgeben lassen.
            echo "Benutzerdaten erforderlich!";
            exit;
        }

    if (!isset($_SERVER['PHP_AUTH_USER'], $_SERVER['REMOTE_USER'])) authenticate();

    if ($_SERVER['PHP_AUTH_USER'] != $password or $_SERVER['REMOTE_USER'] != $username) authenticate();

    ##  bis hierher, wenn die Anmeldung geklappt hat, geht es dann hier weiter...

    echo "<pre>\r\n";
        echo htmlspecialchars(print_r($_SERVER,1));
        echo "</pre>\r\n";

    ?>

    Alternativ kannst Du auch mit einem Token (Cookie) arbeiten, dass der Server dem Client sendet.
    Am einfachsten geht das, wenn Du eine Session startest.

    http://de3.php.net/manual/en/book.session.php

    In einem Formular fragst Du dann auch wieder Name und Passwort ab, die Du immer dann überprüfst, wenn in der Session (das geht auch noch anders...) noch nicht vermerkt ist, dass die Überprüfung bereits stattgefunden hat. Wenn die "Anmeldung" erfolgreich war, also der Name zum Passwort passt, dann trägst Du das in das Session-Array einfach ein.

    if($_POST['password'] == $password_des_users)
    {
      $_SESSION['user'] = $username;
      $_SESSION['logintime'] = time();
    }

    und schon weißt Du beim nächsten request, dass der Benutzer sich schon angemeldet hatte und wie er heißt.

    Dann ist nämlich

    intval($_SESSION['logintime']) > 0

    erfüllt.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

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

      Hello,

      welche Art der "Anmeldung" soll es denn sein?
      Möchtest Du die Identifikationsdaten jedes Mal wieder mitsenden? Dann ist es möglich, mit Basic Authentication zu arbeiten.

      Dann musst Du nur dieses Stückchen Code in jedes zu schützende Script einbauen:

      <?php   ### show_auth_vars.php ###

      function authenticate()
          {
              Header("WWW-authenticate: basic realm="Privater Bereich"");
              Header("HTTP/1.0 401 Unauthorized");

      ##      Wahlweise komplette valide HTML-Seite includen
      #        include("wunderbare_leider_nicht_Seite");
      ##      oder nur einen einfachen Text ausgeben lassen.
              echo "Benutzerdaten erforderlich!";
              exit;
          }

      if (!isset($_SERVER['PHP_AUTH_USER'], $_SERVER['REMOTE_USER'])) authenticate();

      if ($_SERVER['PHP_AUTH_USER'] != $password or $_SERVER['REMOTE_USER'] != $username) authenticate();

      ##  bis hierher, wenn die Anmeldung geklappt hat, geht es dann hier weiter...

      echo "<pre>\r\n";
          echo htmlspecialchars(print_r($_SERVER,1));
          echo "</pre>\r\n";

      ?>

      Oops, das ist mir (vorerst) noch zu hoch...

      Alternativ kannst Du auch mit einem Token (Cookie) arbeiten, dass der Server dem Client sendet.
      Am einfachsten geht das, wenn Du eine Session startest.

      http://de3.php.net/manual/en/book.session.php

      In einem Formular fragst Du dann auch wieder Name und Passwort ab, die Du immer dann überprüfst, wenn in der Session (das geht auch noch anders...) noch nicht vermerkt ist, dass die Überprüfung bereits stattgefunden hat. Wenn die "Anmeldung" erfolgreich war, also der Name zum Passwort passt, dann trägst Du das in das Session-Array einfach ein.

      if($_POST['password'] == $password_des_users)
      {
        $_SESSION['user'] = $username;
        $_SESSION['logintime'] = time();
      }

      und schon weißt Du beim nächsten request, dass der Benutzer sich schon angemeldet hatte und wie er heißt.

      Dann ist nämlich

      intval($_SESSION['logintime']) > 0

      erfüllt.

      Kann das Skript denn erkennen, ob "submit" angeklickt wurde?

      Bis bald im Khyberspace!

      Yadgar

      1. Hi,

        Kann das Skript denn erkennen, ob "submit" angeklickt wurde?

        Dann wird ein entsprechende mame=value-Paar übermittelt.

        Ggf. kann man das noch mit einer Prüfung der HTTP-Methode kombinieren.

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
      2. Hello Yadgar,

        Oops, das ist mir (vorerst) noch zu hoch...

        Kann das Skript denn erkennen, ob "submit" angeklickt wurde?

        Das "Script" is nur eine Anregung für Dich, wie es geht.
        Fertigschreiben musst Du es schon selber.

        Zu Deiner Frage: Wie erkennt das Script, dass "senden" oder "anmelden" gedrückt wurde im Formular?

        Antwort von ...: Du baust im Formular soviele Submut-Buttons ein, wie Du für nötig hältst und wenn einer Geclickt wird, dann sollte der Browser dessen Namen (und Value) zusammen mit den anderen Parametern des Formulares den Request beifügen.

        <form ...

        <input type="text" name="data[username]" size="40">
           <input type="password" name="data[password]" size="40">
           <input type="submit" name="btn[login]" value="anmelden">

        </form>

        Im Script fragst Du dann:

        if (isset($_POST['btn']['login']))
           {
               ## und dann hier die Prüfungen durchführen
               ## 1. sind denn überhaupt Anmelödedaten vorhanden?

        if (!empty($_POST['data']['username']) and !empty($_POST['data']['password'])
               {
                   ## 2. User und Passwort in der Datenhaltung suchen

        }

        }

        usw.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

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

    Leider funktioniert dies auch nicht...

    Du bist auch schon lange genug hier, um zu wissen, dass "funzt nich" unbrauchbarer Mist ist.

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.