Andreas: viele Input Type = Text als Array übertragen

Hallo!
Ich dachte man könnte Textfelder in einem Formular genau so einfach als Array übertragen, wie bei Checkboxen? Aber igrendwie geht das wohl nicht. (<input type=text name=$Menge[] value=12>)
Wie so ging das jedenfalls immr bei Checkboxen. Jedenfalls will ich eine unbestimmte Anzahl dieser Textfelder übertragen. Ich kann auch Menge[1...] schreiben, bringt alles nichts.
Wie könnte das funktionieren?
Grüße
Andreas

  1. Hi,

    Ich dachte man könnte Textfelder in einem Formular genau so einfach als Array übertragen, wie bei Checkboxen?

    doch; der PHP-Bug ist wenigstens konsequent.

    Aber igrendwie geht das wohl nicht.

    "Geht nicht" geht nicht. Fehlerbeschreibung, bitte.

    (<input type=text name=$Menge[] value=12>)

    Was soll das Dollarzeichen da? Außerdem gehört so ein Attributwert in Anführungszeichen, sonst ist es definitiv falsch.

    Wie könnte das funktionieren?

    "Kaum macht man's richtig, schon funktioniert's."

    Cheatah :-)

    1. Hi!

      "Geht nicht" geht nicht. Fehlerbeschreibung, bitte.

      OK - Der "array" den ich in PHP auslesen will sei kein Array, z.B. wenn ich das probiere:

      foreach($Anzahl as $num){
      ...}
      "Anzahl sei kein array".

      Im HTML Formular steht da z.B.:

      <input type="text" value="5" name="Anzahl[1]">
      <input type="text" value="3" name="Anzahl[2]">

      Ist ein Warenkorb, wo die Artikel aktualisiert werden sollen. Ich mach das normalerweise anders. Und da 1 - 10000... Artikel im Waenkorb liegen können dachte ich da an einen array. ich will wie oben geschrieben für jedes Element des Array ein Update-Statement ausführen. Hab mal bei Amazon geguckt, die haben da was stehen wie

      <input type="text" value="5" name="Anzahl.aö9skwo39ws">

      (<input type=text name=$Menge[] value=12>)

      Was soll das Dollarzeichen da? Außerdem gehört so ein Attributwert in Anführungszeichen, sonst ist es definitiv falsch.

      Mein Fehler, hatte das nur kurz zusammengefasst.

      "Kaum macht man's richtig, schon funktioniert's."

      Das ist das problem!

      Grüße
      Andreas

      1. Holladiri !

        Schau doch mal in Deiner php.ini nach, ob Du da register_globals auf irgendwas anderes als "on" gesetzt hast, weil dann kann es nämlich nicht funktionieren. In diesem Fall (und eigentlich auch überhaupt) solltest Du Dich mit $HTTP_POST_VARS[] anfreunden ...

        Ciao,

        Harry
         (ID=42)

        1. Hi!

          Schau doch mal in Deiner php.ini nach, ob Du da register_globals auf irgendwas anderes als "on" gesetzt hast, weil dann kann es nämlich nicht funktionieren. In diesem Fall (und eigentlich auch überhaupt) solltest Du Dich mit $HTTP_POST_VARS[] anfreunden ...

          Ich hab extra nachgeguckt, sind auf ON. Mein Problem ist nicht das ich die Variablen gar nicht bekomme, sondern dass der Array nicht als solcher erkannt wird. Wie gesagt kann ich genau sowas mit Checkboxen machen, nur nicht mit Textboxen.
          Aber vielleicht brauche ich auch gar keinen Array - folgendes möchte ich erreichen:
          Ich hole mir eine Liste mit Artikeln aus der Datenbank, mit je einem Textfeld "anzahl". Diese Liste steht in einem Formular. Wenn ich das Formular absende, möchte ich, dass bei jedem Datensatz, der in der Formular-Liste vorkam, das Feld "Anzahl" genau mit der Zahl, die im jeweiligen Textfeld steht aktualisieren.
          Das wollte ich halt mit einem Array machen, den ich in einer Schleife auslese, und dann jedesmal mit UPDATE den jeweiligen Datensatz aktualisiern. Mein Problem ist halt an den entsprechenden Datensatz nicht drankomme, woher weiß ich welchen Datensatz ich jedesmal aktualisieren soll? Das kann doch nicht so schwer sein, hat doch jeder Online-Shop? Wie machen die anderen das?

          Grüße
          Andreas

          1. Hallo Andreas

            Ich hab extra nachgeguckt, sind auf ON. Mein Problem ist nicht das ich die Variablen gar nicht bekomme, sondern dass der Array nicht als solcher erkannt wird. Wie gesagt kann ich genau sowas mit Checkboxen machen, nur nicht mit Textboxen.

            Ich hole mir eine Liste mit Artikeln aus der Datenbank, mit je einem Textfeld "anzahl". Diese Liste steht in einem Formular. Wenn ich das Formular absende, möchte ich, dass bei jedem Datensatz, der in der Formular-Liste vorkam, das Feld "Anzahl" genau mit der Zahl, die im jeweiligen Textfeld steht aktualisieren.
            Das wollte ich halt mit einem Array machen, den ich in einer Schleife auslese, und dann jedesmal mit UPDATE den jeweiligen Datensatz aktualisiern.

            Geht eigentlich ganz einfach:

            <form action="<? echo $PHP_SELF;?>" method="post" target="">
            <input type="Text" name="Anzahl[3]" value="13" size="" maxlength="">
            <input type="Text" name="Anzahl[4]" value="15" size="" maxlength="">
            <input type="Text" name="Anzahl[7]" value="16" size="" maxlength="">
            <input type="Text" name="Anzahl[a1]" value="18" size="" maxlength="">

            <input type="Submit" name="" value="ab">
            </form>

            Und im Auswertungsscript:

            <?
              if (isset($HTTP_POST_VARS["Anzahl"]))
              foreach ($HTTP_POST_VARS["Anzahl"] as $key =>$value)
              echo $key."-->".$value."<br>";

            ?>

            In $key ist jetzt der jeweilige Schlüssel gespeichert und in $value der Wert.

            Allerdings verstehe ich wirklich nicht, wo bei dir das Problem lag.

            Hier ein Link zum Testen:
            http://pc-anfaenger.de/test/php_input_als_array.php

            Viele Grüße

            Antje

      2. Hi,

        <input type="text" value="5" name="Anzahl[1]">

        nennst Du es bei Checkboxen auch "Anzahl[1]", oder nicht vielleicht doch "Anzahl[]"?

        Cheatah

  2. Moin!

    Ich dachte man könnte Textfelder in einem Formular genau so einfach als Array übertragen, wie bei Checkboxen? Aber igrendwie geht das wohl nicht. (<input type=text name=$Menge[] value=12>)
    Wie so ging das jedenfalls immr bei Checkboxen. Jedenfalls will ich eine unbestimmte Anzahl dieser Textfelder übertragen. Ich kann auch Menge[1...] schreiben, bringt alles nichts.
    Wie könnte das funktionieren?

    Üblicherweise kriegt man so ein Array mit den ganzen Inhalten hin:

    <input type="text" name="arrayname[]" value="...">
    <input type="text" name="arrayname[]" value="...">

    PHP interpretiert den Variablennamen als Array wegen der eckigen Klammern hinten und legt das Array "$arrayname" an. Und das Weglassen des Index hat den schönen Effekt, daß PHP den jeweiligen Eintrag immer hinter den letzten bestehenden Eintrag anhängt, sofern das Array schon existiert.

    Aber Vorsicht! Solch ein Vorgehen ist bei der Übermittlung der Zutatenliste eines Salates sicher ganz simpel machbar, weil es da auf die Reihenfolge nicht ankommt, aber ganz sicher nicht bei der Massenaktualisierung einer Datenbank - viel zu leicht kann durch einen dummen Fehler ein Eintrag verrutschen - und dann ist Alarm!

    Besser ist, den Namen (wie du schon bei Amazon gesehen hast) mit einer eindeutigen ID anzureichern (die muß nicht verschlüsselt sein), und den Zugriff auf die Formulardaten ausschließlich über den Hash HTTP_POST_VARS zu erledigen.

    <input type="text" name="headline123" value="...">
    <input type="text" name="headline2768" value="...">

    PHP kennt dann $HTTP_POST_VARS['headline123'] und $HTTP_POST_VARS['headline2768']. Man kann den Hash auch nach den Schlüsseln durchsuchen, diese auf bestimmte Anteile untersuchen (ein Schlüsselname mit "headline" vorn wird irgendeine Überschrift kennzeichnen), und die ID des Datensatzes dann abfragen, indem man die Zahl dahinter auswertet.

    - Sven Rautenberg

    1. HI!
      Also probiere ich es so:

      if ($aktualisieren && $HTTP_POST_VARS){
         reset($HTTP_POST_VARS);
                foreach ($HTTP_POST_VARS as $key=>$Feld){
           if (strstr($key,'Anzahl')){
           list($nix, $ID) = explode(".", $key);
           $update = "UPDATE warenkorb SET Anzahl = '$Feld' WHERE ID='$ID'";
        mysql_query($update, $link);}
         }
        }

      Aber da passiert leider gar nichts, keine Fehlermeldung.... bin in sowas auch kein Experte, sieht jemand auf Anhieb einen Fehler?

      Meine Inputfelder haben den Namen: 'Anzahl.123', 'Anzahl.234'...., die Nummer bezeichnet das Feld ID der Tabelle Warenkorb.

      Auf den ersten Blick? Habe auch die obige If-Bedingung weggelassen, brachte auch nichts, naja. ne Idee?
      Grüße
      Andreas

      1. Yo!

        Also probiere ich es so:

        if ($aktualisieren && $HTTP_POST_VARS){
           reset($HTTP_POST_VARS);
                  foreach ($HTTP_POST_VARS as $key=>$Feld){
             if (strstr($key,'Anzahl')){
             list($nix, $ID) = explode(".", $key);
             $update = "UPDATE warenkorb SET Anzahl = '$Feld' WHERE ID='$ID'";
          mysql_query($update, $link);}
           }
          }

        Aber da passiert leider gar nichts, keine Fehlermeldung.... bin in sowas auch kein Experte, sieht jemand auf Anhieb einen Fehler?

        Nö, auf Anhieb kein Fehler zu sehen - aber ganz gut umgesetzt ist mein Vorschlag da. :)

        Meine Inputfelder haben den Namen: 'Anzahl.123', 'Anzahl.234'...., die Nummer bezeichnet das Feld ID der Tabelle Warenkorb.

        Auf den ersten Blick? Habe auch die obige If-Bedingung weggelassen, brachte auch nichts, naja. ne Idee?

        Klar: phpinfo() im Skript ausführen lassen und nachsehen, welche Variablen wirklich übergeben werden. Wenn das stimmt, machst du irgendwas falsch mit dem Auseinandernehmen, sonst mit dem Formular vorher.

        - Sven Rautenberg

      2. Hi,

        ne Idee?

        Testausgaben, Testausgaben, Testausgaben. Prüfe, ob z.B. die Schleife durchlaufen wird, und wenn ja, mit welchen Werten.

        Cheatah

        1. Hi!
          Gute Idee :)

          Also ganz was seltsames:

          Im Formular steht:

          <input type="text" size="2" name="Anzahl.2" value="5">

          in der Ausgabe(echo $key." - ".$ID." - ".$Feld."<br>";) steht:

          Anzahl_2 - - 5

          wie kommt denn das? Wenn "Anzahl.2" übertragen wird, wie kann da Anzahl_2 ankommen?

          Grüße
          Andreas

          1. Hi,

            wie kommt denn das?

            ah - ein weiterer PHP-Bug. Variablennamen dürfen keinen Punkt enthalten. Versuche es mal mit $HTTP_GET_VARS['Anzahl.1'] (bzw. $HTTP_POST_VARS['Anzahl.1']). Allgemein solltest Du _dringend_ darauf verzichten, auf Variablen mit dynamisch generierten Namen zuzugreifen.

            Wenn "Anzahl.2" übertragen wird, wie kann da Anzahl_2 ankommen?

            Es kommt das richtige an und wird das falsche draus gemacht.

            Cheatah

            1. Hi!
              OK, it mir ja auch egal, wollte mich nur an Amazon halten, ist aber glaub ich auch nicht PHP :)
              Mir ist es egal ob "." oder "_", also direkt "_", normalerweise mache ich es auch nicht, aber sag mir eine bessere Lösung!!!
              Sven hatte ich genau anders herum verstanden?!
              Grüße
              Andreas

              PS: mit "_" geht es wunderbar - Danke Euch!

              1. Hi,

                aber sag mir eine bessere Lösung!!!

                $HTTP_GET_VARS / $HTTP_POST_VARS, oder noch besser: gleich auf PHP verzichten.

                Sven hatte ich genau anders herum verstanden?!

                Wie Du Sven verstanden hast, kann ich Dir auch nicht sagen :-)

                Cheatah

                1. Hi!

                  $HTTP_GET_VARS / $HTTP_POST_VARS, oder noch besser: gleich auf PHP verzichten.

                  if ($aktualisieren && $HTTP_POST_VARS){
                     reset($HTTP_POST_VARS);
                     foreach ($HTTP_POST_VARS as $key=>$Feld){
                       if (strstr($key,'Anzahl')){
                       list($nix, $ID) = explode("_", $key);
                       $update = "UPDATE warenkorb SET Anzahl = '$Feld' WHERE ID='$ID'";
                    mysql_query($update, $link);}
                     }
                    }

                  Warum habe ich das nicht verwendet?

                  Wegen so ner Kleinigkeit die Programmiersprache wechseln? Naja...wenn mans einmal weiß ist es doch total egal!

                  Sven hatte ich genau anders herum verstanden?!

                  Wie Du Sven verstanden hast, kann ich Dir auch nicht sagen :-)

                  Er fand sogar obige Lösung sei gut umgesetzt :-))

                  Grüße
                  Andreas

                  1. Auch hi!

                    Sven hatte ich genau anders herum verstanden?!

                    Wie Du Sven verstanden hast, kann ich Dir auch nicht sagen :-)

                    Er fand sogar obige Lösung sei gut umgesetzt :-))

                    Jawoll, und dazu stehe ich auch: Dafür, daß ich nur sehr grob skizziert hatte, ist die Lösung ziemlich kompakt geworden.

                    Wenn natürlich Bugs vorhanden sind, muß man um sie herumarbeiten, das ist ganz klar. Ich hätte ansonsten auf ein Trennzeichen einfach verzichtet, und stattdessen mit regulären Ausdrücken gearbeitet - aber so ist auch ganz schön.

                    Wie aber schon unlängst erwähnt: Wenn etwas nicht so will, wie man selbst: Testweise alles ausgeben lassen, was verarbeitet werden soll: Vor der Verarbeitung, bei der Verarbeitung, und nach der Verarbeitung. Nur so ist man sicher, daß 1. das ankommt, was man erwartet, 2. daß passiert, was man wollte, und 3. das rauskommt, was rauskommen soll (insbesondere bei SQL-Statements nicht ganz unwichtig).

                    - Sven Rautenberg

                    1. Hi Sven!

                      Jawoll, und dazu stehe ich auch: Dafür, daß ich nur sehr grob skizziert hatte, ist die Lösung ziemlich kompakt geworden.

                      Ich hatte ja selbst schon ein bisschen überlegt, war ein guter Denkanstoß!

                      Wenn natürlich Bugs vorhanden sind, muß man um sie herumarbeiten, das ist ganz klar. Ich hätte ansonsten auf ein Trennzeichen einfach verzichtet, und stattdessen mit regulären Ausdrücken gearbeitet - aber so ist auch ganz schön.

                      Wie gesagt bin ich gar nicht sicher ob das nicht einen tieferen Sinn hat...
                      Mit regullären Ausdrücken habe ich bislang kaum gearbeitet, wäre noch kompakter geworden. Aber so gehts ja auch!

                      Wie aber schon unlängst erwähnt: Wenn etwas nicht so will, wie man selbst: Testweise alles ausgeben lassen, was verarbeitet werden soll: Vor der Verarbeitung, bei der Verarbeitung, und nach der Verarbeitung. Nur so ist man sicher, daß 1. das ankommt, was man erwartet, 2. daß passiert, was man wollte, und 3. das rauskommt, was rauskommen soll (insbesondere bei SQL-Statements nicht ganz unwichtig).

                      Jajaja, nur bis vor kurzem konnte ich zu 99,9% sicher gehen, das ich irgendwas falsch geschrieben habe, bzw. mich vertippt... oder sonstige Fehler eingebaut habe. Da fand ich es am einfachsten Euch um einen kurzen Blick zu bemühen, aber irgendwie passiert das letzte Zeit immer weniger, es kommt sogar vor das ich eine kpl. html-Seite mit komplexen Scripten versehe, - und es funktioniert auf anhieb, das ist zwar noch nicht die Regel, solche Fälle häufen sich aber :)
                      Jedenfalls werde ich ab jetzt mehr selbst mit ausgaben probieren, (was ja vorher auch geklappt hätte :-)!
                      Grüße
                       Andreas

                      1. Hi,

                        es kommt sogar vor das ich eine kpl. html-Seite mit komplexen Scripten versehe, - und es funktioniert auf anhieb,

                        dies sollte Dir grundsätzlich eine Erkenntnis geben: Da kann was nicht stimmen.

                        ;-)

                        das ist zwar noch nicht die Regel, solche Fälle häufen sich aber :)

                        Uiuiui... das könnte eine Verschwörung sein! :-)

                        Cheatah, aus dem Nähkästchen plaudernd

                  2. Hi,

                    Wegen so ner Kleinigkeit die Programmiersprache wechseln?

                    Du solltest es nicht als Kleinigkeit sehen, sondern eher als Anlass... als günstige Gelegenheit sozusagen ;-)

                    Naja...wenn mans einmal weiß ist es doch total egal!

                    Die Risiken und Ungereimtheiten der Sprache sind damit noch nicht beseitigt.

                    Er fand sogar obige Lösung sei gut umgesetzt :-))

                    Ja, und da kannst Du stolz drauf sein :-)

                    Cheatah

                    1. Hi!

                      Du solltest es nicht als Kleinigkeit sehen, sondern eher als Anlass... als günstige Gelegenheit sozusagen ;-)

                      Ich bin dabei PERL zu lernen(hab zumindest angefangen), aber werde es voraussichtlich nie für solche Webanwendungen einsetzen!

                      Die Risiken und Ungereimtheiten der Sprache sind damit noch nicht beseitigt.

                      Wo liegt denn hier ein Risiko? Auch wenn Du meinst es ist ein Bug, ich denke selbst da hat sich jemand mal was bei gedacht!

                      Andreas

                      1. Hi,

                        Die Risiken und Ungereimtheiten der Sprache sind damit noch nicht beseitigt.

                        Wo liegt denn hier ein Risiko?

                        allgemein:

                        • Das Environment wird in Variablen mit vorher unbekannten Namen gespeichert (z.B. $DOCUMENT_ROOT).
                        • Request-Parameter werden in Variablen mit vorher unbekannten Namen gespeichert (z.B. "...?bla=blub" in $bla).
                        • Was passiert bei "...?DOCUMENT_ROOT=bla"?

                        Weitere Unstimmigkeiten, wie z.B. die Möglichkeit, mit fopen() auch Ressourcen anzufordern (natürlich nicht schreibend), POP3- und NNTP(!)-Funktionen im IMAP-Modul, ein wilder Mischmasch aus C-Funktionsnamen und hochsprachenüblichen Namen (strstr kontra join), preg und ereg usw., komplettieren das Bild: PHP ist schlicht und ergreifend unausgegoren, unausgereift, undurchdacht. Was sich da neben solch offensichtlichen Lücken wie den dynamischen Variablennamen noch alles versteckt, will ich ehrlich gesagt gar nicht wissen.

                        Auch wenn Du meinst es ist ein Bug, ich denke selbst da hat sich jemand mal was bei gedacht!

                        Ja. Der Bug _sind_ diese Überlegungen. Es ist schlichtweg Schwachsinn, die Nomenklatur von der verwendeten Programmiersprache abhängig zu machen - überall sonst ist es schon immer möglich gewesen, mehrere <input name="wiederholter_name"> anzugeben, ohne dass es Probleme gegeben hat, und es macht auch keinen Sinn, hier eine Vorgabe oder gar Einschränkung zu machen.

                        Cheatah