Phillip: dynamisches formular mit checkboxen kommt durcheinander

Moin Moin!!
Ich hab mal wieder ein Problem :(

Also ein teil meines formulars wird folgendermaßen erstellt:

while ($row3 = @mysql_fetch_array($sql_res3))
      {
       echo "<tr>";
         echo "<td>";
        echo "<input type="checkbox" name="spielt[]" value="ja">";
        echo "<input type="hidden" name="user_id[]" value="".$row3["userid"]."">";
        echo "<input type="hidden" name="vereins_id[]" value="".$row3["vereinid"]."">";
         echo "</td>";
         echo "<td>".$row3["username"]."</td>";
         echo "<td>".$row3["vereinname"]."</td>";
       echo "</tr>";
      }

echo "</table>";

alle value's und so sind richtig, das hab ich alles durchgecheckt. nur wenn ich das jetzt an die nächste datei mittels POST sende stimmt da was nicht.
folgendermaßen habe ich zum debuggen erstmal die ausgabe gestaltet (später soll ein db insert erfolgen):

for($i=0; $i < count($_POST["user_id"]); $i++)
    {
     if ($_POST["spielt"][$i] == "ja")  { $tutspieln = "ja"; }
     else        { $tutspieln = "nein"; }

echo "liga_id: ".$_POST["liga_id"]."<br>";
     echo "user_id: ".$_POST["user_id"][$i]."<br>";
     echo "vereins_id: ".$_POST["vereins_id"][$i]."<br>";
     echo "spielt: ".$tutspieln."<br><br><br>";
    }

die ids werden alle richtig zugeordnet. nur die angekreutzen checkboxen sind falsch. also wenn ich zum beispiel im formular den ersten datensatz und den dritten ankreuze, erhalten im folgenden die beiden ersten datensätze den angekreuzten status... auch wenn ich die beiden letzten ankreuze, oder egal welche eben, die anzahl der kreuze wird immer den ersten datensätzen in der ausgabe zugeordnet :(

weiss einer wie das kommt ??

  1. Hallo,

    das liegt daran, das eine Checkbox, die nicht angeklick ist, keinen Wert überträgt. Du hast also, wenn Du drei Datensätze hast,user_id[0] bis user_id[2] in den Vars. Genauso der Verein.
    Die Variable $spielt enthält aber nur $spielt[0] bis $spielt[1]. Daher geht die Zuordnung verloren.
    Was dabei die geschickteste Lösung ist, weiß ich auch nicht so genau. Ich bezeiehe immer eine ID mit ein. Also z.B.

    echo "<input type="checkbox" name="spielt[".$row3["userid"]."]" value="ja">";
    echo "<input type="hidden" name="user_id[".$row3["userid"]."]" value="".$row3["userid"]."">";
    Genauso auch bei Verein.

    Dann hast Du die user_id als Index im Array $_POST["spielt"] usw.
    Zugriff dann über $_POST["spielt"][$_POST["user_id"][$i]]

    Ist etwas unübersichtlich und man darf nicht vergessen, das die Feldnamen von HTML keine Assoziativen Arrays sind. Das funktioniert als nicht mit Buchstaben o.ä. als Index.
    Aber es funtkioniert :-)

    Schöne Grüße
    Axel

    1. echo $begrüßung;

      echo "<input type="checkbox" name="spielt[".$row3["userid"]."]" value="ja">";

      Man könnte den String auch in einfache Anführungszeichen einrahmen, dann kann man die Backslashs weglassen (echo 'foo"bar"';) Aber das nur nebenbei.

      Ist etwas unübersichtlich und man darf nicht vergessen, das die Feldnamen von HTML keine Assoziativen Arrays sind. Das funktioniert als nicht mit Buchstaben o.ä. als Index.

      "name" ist in HTML einfach nur ein Attribut. Bezeichnungen aus einer Programmiersprache (Feldname, Variable, ...) sind dafür unangebracht.

      Das name-Attribut darf einen Inhalt vom Typ CDATA enthalten, also (mit geringen Ausnahmen) jedes Zeichen aus dem Zeichensatz des Dokuments. foo[bar] ist ebenso zulässig wie ]foo[

      Das wird auch vom Browser so übertragen und kommt so bei PHP so an. (siehe *1)
      Was PHP draus macht steht auf einem ganz anderen Blatt.  (siehe *2)

        
      <form action="" method="post">  
        <input type="text" name="]foo[" value="bla">  
        <input type="text" name="foo[bar]" value="fasel">  
        <input type="text" name="foo[42]" value="blubb">  
        <input type="submit"/>  
      </form>  
      <pre>  
      <?php  
      echo urldecode($HTTP_RAW_POST_DATA); // [link:http://de.php.net/manual/en/ini.core.php#ini.always-populate-raw-post-data@title=always_populate_raw_post_data] muss dafür eingeschaltet sein  
      echo "\n\n";  
      print_r($_POST);  
      ?>
      

      ergibt:

      ]foo[=bla&foo[bar]=fasel   *1

      Array (
        []foo_] => bla           *2
        [foo] => Array (
            [bar] => fasel
            [42] => blubb
        )
      )

      Ein name-Attribut der Form foo[bar] wird also von PHP so interpretiert, dass es in $_GET/$_POST ein Element mit dem Schlüssel foo anlegt. Der Wert ist ein Array mit einem Element mit dem Schlüssel bar und dem Wert aus dem übertragenen Wert (Attribut value bzw. die Usereingabe).

      Es ist PHP also egal, ob man Zahlen oder Buchstaben innerhalb des []-Teiles eines foo[bar]-ähnlich gestalteten name-Attributes verwendet.

      echo "$verabschiedung $name";