Auswerten von Checkbox-Array
SE
- php
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
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
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.
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.
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
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]);
}
}
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
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
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
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
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
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
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]
-->
Aber der W3-Validator beschwert sich trotzdem nicht :-)
Er hätte auch keinen Grund.
MfG ChrisB
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
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
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