Andrea: Auswertung einer dynamischen Anzahl von Formulareinträgen

Hallo zusammen,

ich möchte auf einer Seite die Möglichkeit anbieten Personennamen zu editieren und in die DB zu schreiben.

Ich habe eine DB-Tabelle "personen", die enthält die Spalten "id", "name" und "vorname".

Auf der Seite habe ich im Formular für jeden Eintrag aus der DB-Tabelle ein hidden-field mit der id, und jeweils ein text-field für Name und Vorname. Wenn nun der User etwas ändert, müssen alle Personen geupdatet werden.

Meine Frage nun an Euch: wie kann ich das mit PHP machen?
Bisher habe ich immer über $eintrag1 = $_GET[eintrag1]; einen Wert aus einem Formular geholt. Hier habe ich aber eine Collection von mehreren Werten, wobei ich noch nicht einmal weiß wie viele Einträge es sind.

Vielen Dank im Voraus
Liebe Grüße
Andrea

  1. Hi Andrea,

    Meine Frage nun an Euch: wie kann ich das mit PHP machen?
    Bisher habe ich immer über $eintrag1 = $_GET[eintrag1]; einen Wert aus einem Formular geholt. Hier habe ich aber eine Collection von mehreren Werten, wobei ich noch nicht einmal weiß wie viele Einträge es sind.

    Es kommt drauf an, wie du Formularfelder benannt hast - im Prinzip brauchst du gar kein hidden Field mit der ID - du kannst das auch so lösen:

    Name: <input type="text" name="feld[[code lang=php]<?php echo $id; ?>][name]">
    Sonstiges: <input type="text" name="feld[<?php echo $id; ?>][sonstiges]">[/code]

    Im daten-empfangenden PHP Script kannst du dann das Array $_POST durchgehen, jeder Index darin ist ein Datensatz:

    foreach($_POST as $id => $values)  
    {  
      echo "Name: " . $_POST[$id]['name'];  
      echo "Sonstiges: " . $_POST[$id]['sonstiges'];  
    }
    

    Wie genau du jetzt die Formularfelder strukturierst, ist deine Sache und auch immer vom Anwendugnszweck abhängig, grundsätzlich wird es aber immer darauf hinauslaufen, dass du mit einer Schleife (eine foreach Schleife ist IHMO am geeignesten) ein entsprechendes Array durchgehst und die Daten entsprechend verarbeitest.

    MfG, Dennis.

    --
    Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
    Die FlatBox 0.3 mit Dokumentation ist da!
    Man kann die Menschen zur Vernunft bringen, indem man sie dazu verleitet, daß sie selbst denken. (Voltaire)
    1. Hi Dennis,
      vielen Dank für Deine Antwort.

      foreach($_POST as $id => $values)
      kannst Du mir diesen Teil etwas näher erläutern? Was passiert hier?

      {
        echo "Name: " . $_POST[$id]['name'];
        echo "Sonstiges: " . $_POST[$id]['sonstiges'];
      }

      
      >   
        
      Ich habe vor allem Verständnisprobleme wenn ich die geänderten Werte in die DB zurück schreiben soll.  
        
      Muss ich jedes einzelne Feld in die DB reinschreiben oder kann ich das auch Zeilenweise machen, also z.B.: Schreibe in Tabelle "personen" den Namen und Vornamen wo die id "4711" ist.  
        
      Danke  
      Liebe Grüße  
      Andrea
      
      1. Hi Andrea,

        foreach($_POST as $id => $values)
        kannst Du mir diesen Teil etwas näher erläutern? Was passiert hier?

        Setze dich mal mit der Funktionsweise einer foreach Schleife auseinander, lies dazu die Seite foreach im PHP Manual (auch auf deutsch).

        Kurz gesagt: Es wird das Array $_POST durchgegangen, Eintrag für Eintrag, wobei der Index des aktuellen Eintrags immer in $id steht (frei wählbar) und der Inhalt, der Wert des Eintrages (in unserem Beispiel ist es ein Array) in $values steht (ebenfalls frei wählbar).

        Muss ich jedes einzelne Feld in die DB reinschreiben oder kann ich das auch Zeilenweise machen, also z.B.: Schreibe in Tabelle "personen" den Namen und Vornamen wo die id "4711" ist.

        Nein, du kannst das prima "zeilenweise" machen - dazu könntest du z.B. innerhalb der foreach-Schleife folgendes notieren:

        $sql = "UPDATE tabelle  
                SET  
                  person = '" . mysql_real_escape_string($_POST[$id]['person']) . "',  
                  sonstiges = '" . mysql_real_escape_string($_POST[$id]['person']) . "'  
                WHERE  
                  id = '$id'";  
        mysql_query($sql) OR die(mysql_error());
        

        MfG, Dennis.

        --
        Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
        Die FlatBox 0.3 mit Dokumentation ist da!
        Man kann die Menschen zur Vernunft bringen, indem man sie dazu verleitet, daß sie selbst denken. (Voltaire)
        1. Hi Dennis,
          ok, habe verstanden.

          Zwei kleine Fragen habe ich noch:
          1. wozu benötige ich dann im input feld die Bezeichnung "feld"?
          2. was passiert wenn ich im Formular noch ein Input-Feld habe, welches nichts mit der DB-Tabelle zu tun hat (z.B. ein Feld das nur ein mal vorkommt)? Dann wird in der foreach Schleife auch über dieses Feld iteriert und da es keinen Value hat ergibt das doch ein Fehler, oder?

          Liebe Grüße
          Andrea

          1. Hi Andrea,

            1. wozu benötige ich dann im input feld die Bezeichnung "feld"?

            Die Bezeichnung "feld" war von mir nicht sonderlich sinnvoll vergeben und dann im späteren Verlauf auch noch vergessen worden. Etwas sinnvoller wäre vielleicht "datensaetze", die foreach Schleife muss dann aber so aussehen:

            foreach($_POST['datensaetze'] as $id => $values) { /* mach was */ }

            Da war mir vorhin in der Flüchtigkeit ein Fehler unterlaufen ;-)

            1. was passiert wenn ich im Formular noch ein Input-Feld habe, welches nichts mit der DB-Tabelle zu tun hat (z.B. ein Feld das nur ein mal vorkommt)? Dann wird in der foreach Schleife auch über dieses Feld iteriert und da es keinen Value hat ergibt das doch ein Fehler, oder?

            Da könnte es dann zu Konflikten kommen, richtig. Deshalb habe ich auch alle Felder nochmal in ein Array namens "feld" bzw. wie hier jetzt geschrieben sinnvoller "datensaetze" gepackt. Auf die Art und Weise kannst du auch noch prima andere Felder verwenden, diese sollten dann aber nicht "datensaetze" oder "datesaetze[irgendwas]" genannt werden.

            Im Zweifelsfall schau dir einfach mal an, welche Daten überhaupt bei dir in PHP ankommen:

            echo "<pre>";  
            [link:http://php.net/print_r@title=print_r]($_POST);  
            echo "</pre>";
            

            MfG, Dennis.

            --
            Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
            Die FlatBox 0.3 mit Dokumentation ist da!
            Denn wer 'ne Blacklist hat, muss halt daran denken, dass er manches nicht sieht... und vor dem posten die Realitaet einschalten. (Swen Wacker)
            1. Hi Dennis,

              prima, probiere ich gleich mal aus.

              Vielen lieben Dank.
              Gruss

              Andrea

            2. Hallo Dennis,

              ich bin auf ein weiteres Problem gestoßen:
              In der DB habe ich die Spalten "Name", "Vorname" und "onlineStatus". Der online-status kann nur den Wert 0 oder 1 haben.

              Wenn ich nun die Daten auf der Seite darstelle möchte ich, dass man den Status über radio-buttons ändern kann.

              Ich weiss nun leider nicht, wie ich es anstellen soll, dass der richtige Status (der richtige Button) bereits selektiert ist wenn die Seite geladen wird.

              Der HTML-Quellcode müsste demnach folgendermaßen aussehen:

              <input type="radio" name="datensaetze[4711][onlineStatus]" value="0">
              <input type="radio" name="datensaetze[4711][onlineStatus]" value="1">

              Der richtige radio-button (dem Wert in der DB entsprechend) müsste jetzt selektiert sein.

              Hintergrund meiner Frage:
              in Java (Struts) wird geschaut welcher Wert selektiert sein müsste und die Selektion erfolgt automatisch.

              Natürlich könnte ich in meiner PHP Datei abfragen wie der Status dieser Person ist und dementsprechend die radio-buttons generieren.
              Das würde dann so aussehen:

              falls onlineStatus == 0
               <input type="radio" name="datensaetze[4711][onlineStatus]" value="0" selected>
               <input type="radio" name="datensaetze[4711][onlineStatus]" value="1">

              ansonsten
               <input type="radio" name="datensaetze[4711][onlineStatus]" value="0">
               <input type="radio" name="datensaetze[4711][onlineStatus]" value="1" selected>

              Gibt es da nicht eine bequemere Möglichkeit?

              Liebe Grüße
              Andrea

              1. Hi Andrea,

                Gibt es da nicht eine bequemere Möglichkeit?

                Nein, eine bequemere Möglichkeit dafür gibt es nicht - es sei denn, du benutzt einen fertigen Code, der dir die HTML Ausgabe generiert ;-)

                Aber du kannst es trotzdem ziemlich kurz halten:

                echo '<input type="radio" ...' . ($onlinestatus ? " selected" : "") . '>';  
                echo '<input type="radio" ...' . (!$onlinestatus ? "" : " selected") . '>';
                

                Das ist eine Kurzschreibweise in PHP für ein IF-Konstrukt, allgemein sieht das so aus:

                <Bedingung> ? <Befehlt bei wahrer Bedingung> : <Befehl bei falscher Bedingung>;

                MfG, Dennis.

                1. Hi Dennis,

                  super!! Danke
                  Gruss
                  Andrea