Paul Styrnol: Mehrere input-Felder gleichen Namens verarbeiten

Hallo,

ich möchte Auszüge von Datenbankwerten innnerhalb einer Tabelle anzeigen lassen. Dabei soll man allerdings gleich Änderungen vornehmen können, weshalb ich die Tabelle in ein Formular einbinde und jede Tabellenzelle ein input-Feld mit dem entsprechenden Wert enthält:

Auszug (nicht völlständig):
<tr>
  <td><input id="gname" name="gname" value="bla"></td>
  <td><input id="gtitel" name="gtitel" value="blablubb"></td>
</tr>
<tr>
  <td><input id="gname" name="gname" value="blabla"></td>
  <td><input id="gtitel" name="gtitel" value="blablablubb"></td>
</tr>
usw. (Die Tabellenzeilen mit den werten werden jeweils dynamisch erzeugt)

Es sollen in einem Rutsch alle angezeigten Daten geändert und in die Datenbank geschrieben werden können. Nun habe ich allerdings Probleme beim Verarbeiten der Daten, da ich über $_POST[...] immer nur die Daten der letzten Zeile auslesen konnte.
Ich könnte theoretisch auch die Datensatznummer in den Namen einbinden, aber das würde die Sache wahrscheinlich unnötig komplizierter machen, außerdem ist diese nicht immer fortlaufend weshalb sie für das Auslesen der ganzen Werte mittels einer Schleife wohl nicht dienlich wäre.

Da in der Tabelle auch Checkboxen enthalten sind die ich mit Hilfe eines Array im name-Attribut und einer foreach-Schleife verarbeite (so wie hier beschrieben: http://php-faq.de/q/q-formular-checkbox.html).

Mein nächster Versuch basierte auf einem Kommentar zur foreach-Schleife in der PHP-Dokumentation (http://de3.php.net/manual/de/control-structures.foreach.php#53016):

$i = 0;
foreach($_POST as $varName => $value) {
  $dv=$value;
  print 'Variable: ' . $varName . ' Value: ' . $dv[$i] . '<br>';
  $i++;
};

Das ging leider auch schief, zwar wird der Name (gname) der ersten Zeile korrekt ausgegeben, aber der dazugehörige Titel (gtitel) stammt vom folgenden Datensatz. Außerdem werden auch hier nicht alle Werte ausgegeben.

Ich habe auch versucht die Vorgehensweise von anderen Seiten abzugucken, z.B. gibt es my phpmyadmin etwas ähnliches (wenn man mehrer Datensätze einer Tabelle zum Bearbeiten markiert). Aber ehrlich gesagt blick ich nicht wirklich durch bei dem Code, ich bin ewiger PHP-Neuling und das ist dort schon ein wenig komplizierter.

Google hilft mir auch nicht weiter, es gibt zwar jede Menge Ergebnisse zum Verarbeiten von input-Feldern mit PHP, aber speziell zu meinem Problem habe ich leider nichts gefunden.

Hat jemand eine Idee oder einen Lösungsansatz wie ich das Problem lösen könnte?

Viele Grüße
Paul

--
Meine Photos:  http://www.rapunzeln.de
  1. Lieber Paul,

    Auszug (nicht völlständig):
    <tr>
      <td><input id="gname" name="gname" value="bla"></td>
      <td><input id="gtitel" name="gtitel" value="blablubb"></td>
    </tr>
    <tr>
      <td><input id="gname" name="gname" value="blabla"></td>
      <td><input id="gtitel" name="gtitel" value="blablablubb"></td>
    </tr>
    usw. (Die Tabellenzeilen mit den werten werden jeweils dynamisch erzeugt)

    Ich erkenne hier Namenspaare: "gname" + "gtitel". Die gehören wohl immer zusammen. Jede Zeile hat genau ein solches Paar.

    da ich über $_POST[...] immer nur die Daten der letzten Zeile auslesen konnte.

    Logisch! Mit jedem Input, das den selben Namen hat, wird der vorher gespeicherte Wert überschrieben. Was tun?

    Du könntest mal folgendes versuchen: be"nenne" doch die Inputfelder mit "gname[]" und "gtitel[]". Damit erzeugst Du in $_POST Arrays, anstatt direkte Variablenwerte.

    $_POST['gname[3]'] sollte dann den Wert des Inputfeldes der vierten Zeile geben...

    Probiere es doch mal aus! Wenn's klappt dann melde Dich doch wieder!

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    1. Hi Felix,

      $_POST['gname[3]'] sollte dann den Wert des Inputfeldes der vierten Zeile geben...

      Nicht eher $_POST['gname'][3] ?

      MfG, Dennis.

      --
      Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
      Schon gewusst, dass Bugs und Feature Vorschläge für das CForum ins Entwicklerforum oder in den BugTracker von WWWTech gehören und nicht hier her?
      1. Lieber Dennis,

        $_POST['gname[3]'] sollte dann den Wert des Inputfeldes der vierten Zeile geben...

        Nicht eher $_POST['gname'][3] ?

        Ich habe das selbst so noch nie gemacht, aber nach der Syntax, wie man Array-Dimensionen notiert, natürlich ja! Du hast recht.

        Liebe Grüße aus Ellwangen,

        Felix Riesterer.

        1. Hi Felix,

          Ich habe das selbst so noch nie gemacht, ...

          Wie würdest du dann ein Problem wie das gestellte lösen? Also ein Editieren von mehreren Datensätzen gleichzeitig? Das über so Arrays zu erledigen ist IHMO ziemlich praktisch, da sich z.B. die ID des Datensatzes prima zur Identifizierung in $_POST['data][ID] nutzen lässt.

          MfG, Dennis.

          --
          Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
          Die Definition des SelfCodes ist hier zu finden, es gibt auch einen Encoder.
    2. Hallo

      Auszug (nicht völlständig):
      <tr>
        <td><input id="gname" name="gname" value="bla"></td>
        <td><input id="gtitel" name="gtitel" value="blablubb"></td>
      </tr>
      <tr>
        <td><input id="gname" name="gname" value="blabla"></td>
        <td><input id="gtitel" name="gtitel" value="blablablubb"></td>
      </tr>

      Du könntest mal folgendes versuchen: be"nenne" doch die Inputfelder mit "gname[]" und "gtitel[]". Damit erzeugst Du in $_POST Arrays, anstatt direkte Variablenwerte.

      $_POST['gname[3]'] sollte dann den Wert des Inputfeldes der vierten Zeile geben...

      Je nachdem, wie der Abfragequery gestaltet ist (Sortierung), kann es sein, dass die vierte Zeile der HTML-Tabelle innerhalb des Formulars nicht der vierten Zeile in der DB-Tabelle entspricht.

      Man sollte also noch eine eindeutige ID der Zeile (die aus der DB-Tabelle) mitgeben.

      Die resultierende Ausgabe sollte für die Zeile mit der ID "3" so aussehen (ungetestet):

      <input id="gname[3]" name="gname[3]" value="blabla">

      Tschö, Auge

      --
      Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
      (Victor Hugo)
      Veranstaltungsdatenbank Vdb 0.1
      1. Liebes Auge,

        Man sollte also noch eine eindeutige ID der Zeile (die aus der DB-Tabelle) mitgeben.

        Die resultierende Ausgabe sollte für die Zeile mit der ID "3" so aussehen (ungetestet):

        <input id="gname[3]" name="gname[3]" value="blabla">

        Da die Tabelle dynamisch generiert wird, ist das möglich. Daher muss ich Dir absolut zustimmen, denn so ist es ja außerdem noch am einfachsten!

        Liebe Grüße aus Ellwangen,

        Felix Riesterer.

      2. Hallo,

        Je nachdem, wie der Abfragequery gestaltet ist (Sortierung), kann es sein, dass die vierte Zeile der HTML-Tabelle innerhalb des Formulars nicht der vierten Zeile in der DB-Tabelle entspricht.

        Man sollte also noch eine eindeutige ID der Zeile (die aus der DB-Tabelle) mitgeben.

        Die resultierende Ausgabe sollte für die Zeile mit der ID "3" so aussehen (ungetestet):

        <input id="gname[3]" name="gname[3]" value="blabla">

        hab das jetzt mal so oder so ähnlich versucht.

        Die Ausgabe der Tabelle in der Seite (Original Auszug):
        <tr>
        <td><input type="checkbox" name="gdelete[]" value="4"></td>
        <td><input id="gname" name="gname[4]" value="anorexia"></td>
        <td><input id="gtitel" name="gtitel[4]" value="»anorexia nervosa«"></td>
        <td><input type="checkbox" name="gvisible[]" value="4"></td>
        <td>2005-06-20</td>
        </tr>

        Der PHP/SQL-Code zum Verarbeiten und Ändern der Daten:

        $i = 0;
        foreach($_POST["gname"] as $bla) {
          $a_id = $_POST["visible"][$i];
          $result = mysql_query("UPDATE album SET name = '" . $_POST["gname"][$i] . "', titel = '" . $_POST["gtitel"][$i] . "', sichtbar = '0' WHERE a_id = '" . $a_id . "';");
          $i++;
        }

        Als Argument für die foreach-Schleife hatte ich zuerst gvisible (die Checkbox als $a_id, aber da kam eine Fehlermeldung (Invalid argument).
        Passieren tut leider immernoch nicht viel. :(

        Viele Grüße
        Paul

        --
        Meine Photos:  http://www.rapunzeln.de
        Meine Tribals: http://www.tribal-galerie.de
        1. Hallo

          <td><input type="checkbox" name="gvisible[]" value="4"></td>

          Der PHP/SQL-Code zum Verarbeiten und Ändern der Daten:

          $a_id = $_POST["visible"][$i];

          Als Argument für die foreach-Schleife hatte ich zuerst gvisible (die Checkbox als $a_id, aber da kam eine Fehlermeldung (Invalid argument).
          Passieren tut leider immernoch nicht viel. :(

          Du setzt den Namen der Checkbox mit "gvisible" und fragst das $_POST-Element "visible" ab, welches es nicht gibt.

          Tschö, Auge

          --
          Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
          (Victor Hugo)
          Veranstaltungsdatenbank Vdb 0.1
          1. Hallo,

            Du setzt den Namen der Checkbox mit "gvisible" und fragst das $_POST-Element "visible" ab, welches es nicht gibt.

            Ups, habs geändert, aber das Problem bleibt bestehen.
            Ich habe jetzt zusätzlich noch eine Zeile eingefügt:

            $a_id = $_POST["gvisible"][$i];
            echo $_POST["gname"][$i] . ' ... ' . $_POST["gtitel"][$i] . '<br>';

            Es werden aber lediglich die Punkte untereinander ausgegeben, es scheint als wären keine Formulardaten vorhanden.

            Viele Grüße
            Paul

            --
            Meine Photos:  http://www.rapunzeln.de
            Meine Tribals: http://www.tribal-galerie.de
            1. echo $begrüßung;

              echo $_POST["gname"][$i] . ' ... ' . $_POST["gtitel"][$i] . '<br>';

              Es werden aber lediglich die Punkte untereinander ausgegeben, es scheint als wären keine Formulardaten vorhanden.

              Das wird dann wohl der Fall sein. Wenn du das error_reporting auf E_ALL stellt sagt dir das das PHP sogar.

              $i = 0;
              foreach($_POST["gname"] as $bla) {
                $a_id = $_POST["visible"][$i];

              ...

              $i++;
              }

              Außerdem ist das foreach hier falsch angewendet. Es nützt ja nichts, ein $i hochzuzählen, um damit auf nicht vorhandene Keys zuzugreifen. So wendet man foreach im Allgemeinen richtig an:

              foreach ($array as $key => $value)
                echo $value;
              oder
                echo $array[$key];

              echo "$verabschiedung $name";

              1. Hallo,

                echo $_POST["gname"][$i] . ' ... ' . $_POST["gtitel"][$i] . '<br>';

                Es werden aber lediglich die Punkte untereinander ausgegeben, es scheint als wären keine Formulardaten vorhanden.

                Das wird dann wohl der Fall sein. Wenn du das error_reporting auf E_ALL stellt sagt dir das das PHP sogar.

                Ich verstehe aber nicht warum das so ist. Vom Formular her müsste doch es doch eigentlich alles funktionieren, oder kann es Probleme geben weil ich die Datensatznummer im name-Attribut quasi als Array mitgebe? Aber normalerweise sollte es doch klappen oder?

                $i = 0;
                foreach($_POST["gname"] as $bla) {
                  $a_id = $_POST["visible"][$i];
                ...
                  $i++;
                }

                Außerdem ist das foreach hier falsch angewendet. Es nützt ja nichts, ein $i hochzuzählen, um damit auf nicht vorhandene Keys zuzugreifen. So wendet man foreach im Allgemeinen richtig an:

                foreach ($array as $key => $value)
                  echo $value;
                oder
                  echo $array[$key];

                Ich hatte mir das so gedacht: foreach sorgt dafür, dass die Schleife so oft ausgeführt wird wieviele Datensätze vorhanden sind. Durch das zusätzliche hochzählen von $i erreiche ich das jeweils der Datensatz mit der Nummer verarbeitet wird, die ich über das Formular im name-Attribut mitgegeben habe.

                Viele Grüße
                Paul

                --
                Meine Photos:  http://www.rapunzeln.de
                1. echo $begrüßung;

                  Vom Formular her müsste doch es doch eigentlich alles funktionieren, oder kann es Probleme geben weil ich die Datensatznummer im name-Attribut quasi als Array mitgebe?

                  Schau dir an, was wirklich mitgesendet wird: print_r($_POST); (vorher ein <pre> erhöht die Übersichtlichkeit)

                  Ich hatte mir das so gedacht: foreach sorgt dafür, dass die Schleife so oft ausgeführt wird wieviele Datensätze vorhanden sind. Durch das zusätzliche hochzählen von $i erreiche ich das jeweils der Datensatz mit der Nummer verarbeitet wird, die ich über das Formular im name-Attribut mitgegeben habe.

                  Woher weißt du, welche Datensätze mitgegeben werden und dass die fortlaufend nummeriert sind? Schau dir an, was wirklich ...

                  echo "$verabschiedung $name";

                  1. Hallo,

                    Schau dir an, was wirklich mitgesendet wird: print_r($_POST); (vorher ein <pre> erhöht die Übersichtlichkeit)

                    Danke, die Möglichkeit kannte ich noch nicht.
                    Ausgabe:
                    Array
                    (
                        [gname] => Array
                            (
                                [4] => anorexia
                                [5] => bronxtattoo
                                usw.
                            )

                    [gtitel] => Array
                            (
                                [4] => »anorexia nervosa«
                                [5] => Reportage über das Tattoo-Studio Bronx
                                usw.
                            )

                    [save] => Änderungen speichern
                    )

                    Bei den gesendeten Daten scheint ja alles zu passen, aber wie schaffe ich es nun mit der Foreach-Schleife diese zu verarbeiten?

                    Ich habe es mit

                    foreach($_POST["gname"] as $var[])

                    versucht, aber das sieht dann so aus:

                    Array
                    (
                        [0] => anorexia
                    )

                    Array
                    (
                        [0] => anorexia
                        [1] => bronxtattoo9
                    )
                    usw. Mit jedem Durchlauf der Schleife wird den nächste Name eingelesen. So wie ich das verstanden habe muss ich doch versuchen auf den numerischen Index eines Unterarrays zugreifen, oder hab ich das was falsch verstanden?

                    Viele Grüße
                    Paul

                    --
                    Meine Photos:  http://www.rapunzeln.de
                    1. echo $begrüßung;

                      Bei den gesendeten Daten scheint ja alles zu passen, aber wie schaffe ich es nun mit der Foreach-Schleife diese zu verarbeiten?

                      foreach($_POST["gname"] as $index => $value) {
                        echo $index; // nur damit du siehst, wie foreach arbeitet - Ausgabe: 4, 5, usw.
                        echo $_POST['gname'][$index]; // oder in dem Fall einfacher als: echo $value;
                        echo $_POST['gtitle'][$index];
                      }

                      echo "$verabschiedung $name";

                      1. Hallo,

                        Bei den gesendeten Daten scheint ja alles zu passen, aber wie schaffe ich es nun mit der Foreach-Schleife diese zu verarbeiten?

                        foreach($_POST["gname"] as $index => $value) {
                          echo $index; // nur damit du siehst, wie foreach arbeitet - Ausgabe: 4, 5, usw.
                          echo $_POST['gname'][$index]; // oder in dem Fall einfacher als: echo $value;
                          echo $_POST['gtitle'][$index];
                        }

                        Danke, das funktioniert. Ich habe in einem anderen Fall bei dem ich Checkboxen verarbeitet habe nur die erste Version aus dem PHP-Manual für foreach (http://de2.php.net/foreach) genommen was auch prima geklappt hat. Da ich ich davon ausgegangen bin, dass es sich um eine ähnliche Problematik handelt bin ich garnicht auf die Idee gekommen es mit der zweiten Variante zu probieren.

                        Viele Grüße
                        Paul

                        --
                        Meine Photos:  http://www.rapunzeln.de
                        Meine Tribals: http://www.tribal-galerie.de