SE: Auswerten von Checkbox-Array

Ich habe ein Formular, in dem mehrere gleichname Checkboxen als Array übergeben werden sollten.
Beispiel:

<input type="checkbox" class="checkbox_produkt_id"  name="checkbox_produkt_id[]" value="19" />
<input type="checkbox" class="checkbox_produkt_id"  name="checkbox_produkt_id[]" value="20" />
<input type="checkbox" class="checkbox_produkt_id"  name="checkbox_produkt_id[]" value="21" />

Diese lasse ich per POST übergeben.

Ich versuche nun im PHP die dort übergebenen Werte über $_POST auszuwerten.

Allerdings ist $_POST['checkbox_produkt_id'] in jedem Fall (also solange mindestens eine Checkbox markiert war) kein Array, sondern ein String (!) mit Inhalt 'Array'!

Laut diversen er-google-ten Beispielen sollte es eigentlich funktionieren, aber vermutlich übersehe ich etwas offensichtliches...

Hat jemand einen Tip?

Danke und Gruß
Sebastian

  1. Hallo

    <input type="checkbox" class="checkbox_produkt_id"  name="checkbox_produkt_id[]" value="19" />
    <input type="checkbox" class="checkbox_produkt_id"  name="checkbox_produkt_id[]" value="20" />
    <input type="checkbox" class="checkbox_produkt_id"  name="checkbox_produkt_id[]" value="21" />

    Diese lasse ich per POST übergeben.

    Allerdings ist $_POST['checkbox_produkt_id'] in jedem Fall (also solange mindestens eine Checkbox markiert war) kein Array, sondern ein String (!) mit Inhalt 'Array'!

    Der String sagt dir, dass $_POST['checkbox_produkt_id'] ein Array ist, so wie bei jedem anderen PHP-Array auch. Kannst ja mal das probieren:

    <?php

    $array = range(1,10);
    // Ein Array mit den Zahlen von 1 bis 10

    echo $array;
    // Ausgabe: "Array"

    echo "<pre>";
    foreach ($array as $zahl)
       {
       echo $zahl."\n";
       }
    echo "</pre>";
    // Ausgabe: Die Zahlen von 1 bis 10 untereinander notiert

    ?>

    Laut diversen er-google-ten Beispielen sollte es eigentlich funktionieren, aber vermutlich übersehe ich etwas offensichtliches...

    Ja, du musst auf die einzelnem Elemente von $_POST['checkbox_produkt_id'] zugreifen (z.B., wie oben, über eine Schleife).

    Tschö, Auge

    --
    Die deutschen Interessen werden am Liechtenstein verteidigt.
    Veranstaltungsdatenbank Vdb 0.3
    1. Habe jetzt mal verschiedene Ausgabemöglichkeiten versucht, und jede davon behauptet, dass es sich um keinen Array handelt:

      var_dump($_POST['checkbox_produkt_id']);
      gibt aus: string(5) "Array"

      foreach ($_POST['checkbox_produkt_id'] as $element)
      sagt mir: Warning: Invalid argument supplied for foreach()

      is_array($_POST['checkbox_produkt_id'])
      gibt false zurück.

      Da scheint also tatsächlich etwas mit der Übergabe der Daten nicht zu funktionieren.

      1. Ich ziehe hiermit sämtliche Fragen zurück, habe soeben den Fehler gefunden.
        Ich hatte folgende Zeilen Code eingebaut:

        foreach ($_GET as $key => $value) {
        if (get_magic_quotes_gpc() == 1){
        $_GET[$key] = stripslashes($_GET[$key]);
        }
        }
        foreach ($_POST as $key => $value) {
        if (get_magic_quotes_gpc() == 1){
        $_POST[$key] = stripslashes($_POST[$key]);
        }
        }
        foreach ($_COOKIE as $key => $value) {
        if (get_magic_quotes_gpc() == 1){
        $_COOKIE[$key] = stripslashes($_COOKIE[$key]);
        }
        }

        Diese zerhauen nun leider als Array übergebene Daten.

        1. Mahlzeit SE,

          Diese zerhauen nun leider als Array übergebene Daten.

          Warum lässt Du sie dann nicht einfach weg? Oder prüfst alternativ, ob es sich bei dem jeweiligen Element um ein Array handelt?

          if (get_magic_quotes_gpc() == 1) {  
            foreach ($_GET as $key => $value) {  
              if (!is_array($value))  
                $_GET[$key] = stripslashes($_GET[$key]);  
            }  
            
            foreach ($_POST as $key => $value) {  
              if (!is_array($value))  
                $_POST[$key] = stripslashes($_POST[$key]);  
            }  
            
            foreach ($_COOKIE as $key => $value) {  
              if (!is_array($value))  
                $_COOKIE[$key] = stripslashes($_COOKIE[$key]);  
            }  
          }
          

          (wie immer ungeprüft)

          MfG,
          EKKi

          --
          sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
          1. Habe folgende Lösung auf php.net gefunden, funktioniert:

              
            function stripslashes_deep(&$value){  
                $value = is_array($value) ? array_map('stripslashes_deep', $value) : stripslashes($value);  
            	return $value;  
            }  
              
            if (get_magic_quotes_gpc() == 1){  
            	foreach ($_GET as $key => $value) {  
            		$_GET[$key] = stripslashes_deep($_GET[$key]);  
            	}  
            	  
            	foreach ($_POST as $key => $value) {  
            		$_POST[$key] = stripslashes_deep($_POST[$key]);  
            	}  
            	  
            	foreach ($_COOKIE as $key => $value) {  
            		$_COOKIE[$key] = stripslashes_deep($_COOKIE[$key]);  
            	}	  
            }
            
  2. Hi,

    Allerdings ist $_POST['checkbox_produkt_id'] in jedem Fall (also solange mindestens eine Checkbox markiert war) kein Array, sondern ein String (!) mit Inhalt 'Array'!

    Also *ist* es ein Array - nur du verstehst damit nicht umzugehen. (Denn sonst wüsstest du ja, dass ein Array, in einen String-Kontext gebracht, also bspw. beim Versuch einer Ausgabe mittels echo, von PHP eben nur mit "Array" dargestellt wird.)

    MfG ChrisB

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

    name="checkbox_produkt_id[]"
    Allerdings ist $_POST['checkbox_produkt_id'] in jedem Fall (also solange mindestens eine Checkbox markiert war) kein Array, sondern ein String (!) mit Inhalt 'Array'!

    Hat jemand einen Tip?

    Der Name stimmt nicht überein, einmal hast Du
    name="checkbox_produkt_id[]"

    und zum Anderen erwartest das Array auf
    'checkbox_produkt_id'

    Wenn alle Checkboxen 'zitrone' heißen, bekommst Du das Array mit den Values nur, wenn Du 'zitrone' abfragst.

    Hotte

    --
    Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
    1. Hi,

      Der Name stimmt nicht überein, einmal hast Du
      name="checkbox_produkt_id[]"

      und zum Anderen erwartest das Array auf
      'checkbox_produkt_id'

      Das passt so weit - die eckigen Klammern sind ja gerade dafür da, dass PHP aus den Werten ein Array erstellt.

      Wenn alle Checkboxen 'zitrone' heißen, bekommst Du das Array mit den Values nur, wenn Du 'zitrone' abfragst.

      Wenn alle Checkboxen 'zitrone' hiessen, dann bekäme man gar kein Array, weil PHP dann nur den letzten übergebenen Wert berücksichtigen würde.

      MfG ChrisB

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

        Wenn alle Checkboxen 'zitrone' hiessen, dann bekäme man gar kein Array, weil PHP dann nur den letzten übergebenen Wert berücksichtigen würde.

        Ahhh, das wusste ich nicht, dass PHP ein spezielles HTML braucht für multible-choices, danke;

        Hotte

        --
        Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
      2. Hi again Chris,

        »» Der Name stimmt nicht überein, einmal hast Du
        »» name="checkbox_produkt_id[]"
        »»
        »» und zum Anderen erwartest das Array auf
        »» 'checkbox_produkt_id'

        Das passt so weit - die eckigen Klammern sind ja gerade dafür da, dass PHP aus den Werten ein Array erstellt.

        Nachgelesen in http://de.selfhtml.org/html/referenz/attribute.htm#id_idref_name@title=SELFHTML

        ID, IDREF oder Name

        =schipp
        Der Wert eines solchen Attributs muss mit einem Buchstaben A-Z oder a-z beginnen, und darf in der weiteren Zeichenkette ebenfalls nur Buchstaben A-Z und a-z, Ziffern 0-9, Bindestriche (-), Unterstriche (_), Doppelpunkte (:) und Punkte (.) enthalten. Nicht erlaubt sind Sonderzeichen, Leerzeichen oder andere Interpunktionszeichen.
        =schnapp

        [] also auch nicht.

        Hotte

        --
        Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
        1. Hello,

          Nachgelesen in http://de.selfhtml.org/html/referenz/attribute.htm#id_idref_name@title=SELFHTML

          ID, IDREF oder Name

          =schnipp
          Der Wert eines solchen Attributs muss mit einem Buchstaben A-Z oder a-z beginnen, und darf in der weiteren Zeichenkette ebenfalls nur Buchstaben A-Z und a-z, Ziffern 0-9, Bindestriche (-), Unterstriche (_), Doppelpunkte (:) und Punkte (.) enthalten. Nicht erlaubt sind Sonderzeichen, Leerzeichen oder andere Interpunktionszeichen.
          =schnapp

          [] also auch nicht.

          Hast Du tatsächlich recht. das steht beim W3 auch so.

          http://www.w3.org/TR/html4/types.html#type-cdata

          Das Name-Attribut ist vom Typ CDATA und für CDATA gibt es die obige Festlegung...

          Aber der W3-Validator beschwert sich trotzdem nicht :-)

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

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

            Hast Du tatsächlich recht. das steht beim W3 auch so.

            Nein -

            http://www.w3.org/TR/html4/types.html#type-cdata

            Das Name-Attribut ist vom Typ CDATA und für CDATA gibt es die obige Festlegung...

            Eben.

            Wenn du mal in die HTML-DTD schaust - ziemlich weit oben,

            <!ENTITY % LanguageCode "NAME"
                -- a language code, as per [RFC1766]
                -->

            • da wird zum Beispiel für den LanguageCode gefordert, dass er vom Type NAME (Token) sein muss.
              Für Formularfelder gibt's diese Forderung aber nicht.

            Aber der W3-Validator beschwert sich trotzdem nicht :-)

            Er hätte auch keinen Grund.

            MfG ChrisB

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

              »» Aber der W3-Validator beschwert sich trotzdem nicht :-)

              Er hätte auch keinen Grund.

              Und ich hätte jetzt von Dir spätestens hier einen Link zu einem PHP-Tutorial erwartet, wo das bestätigt wird, was Du weiter oben behauptet hast:

              Dass PHP im Namen von multible checkboxen eckige Klammern braucht, um die CGI-Parameter in einem _Array_ zu liefern.

              Viele Grüße,
              Hotte

              --
              Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
              1. Hi,

                Und ich hätte jetzt von Dir spätestens hier einen Link zu einem PHP-Tutorial erwartet, wo das bestätigt wird, was Du weiter oben behauptet hast:

                Dass PHP im Namen von multible checkboxen eckige Klammern braucht, um die CGI-Parameter in einem _Array_ zu liefern.

                Wozu? Ich weiss, dass es so ist, und es ist auch an genügend Stellen im WWW nachzulesen.

                Wenn dir das nicht reicht - dann probier's halt selber aus:
                somescript.php?wert=1&wert=2&wert=3
                und
                somescript.php?wert[]=1&wert[]=2&wert[]=3
                mal aufrufen, und darin jeweils $_GET per print_r ausgeben lassen.

                MfG ChrisB

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

          Nachgelesen in http://de.selfhtml.org/html/referenz/attribute.htm#id_idref_name@title=SELFHTML

          ID, IDREF oder Name

          Der Inhalt des name-Attribut eines Formularfeldes ist kein "Name-Token", sondern als #CDATA definiert - darf also fast alles mögliche enthalten.

          MfG ChrisB

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