PHP Array aus Multiple option funzt nicht

Observer

Well-known member
ID: 351549
L
29 Mai 2009
260
20
Hi,
mein Problem ist folgendes.
PHP:
<form action="" method="post">
<select name="menu[]" multiple="multiple" size="4">
   <option value="Pizza"> Pizza </option>
   <option value="Tortelloni"> Tortelloni </option>
   <option value="Bifsteca"> Bifsteca </option>
</select>

<input type="submit" name="test" value="test" />
</form>
<?
if($_POST[test] == "test"){
foreach( $_POST[menu] as $s ) {
  echo $s;
    }
}
print_r($_POST);
Ich möchte jetzt eigentlich die werte aus dem Array mit einem | in die DB speichern, aber irgendwie bekomme ich die werte nicht heraus :(
Als meldung kommt :
Warning: Invalid argument supplied for foreach() in /www/test.php on line 13
Also will mir das ding ja sagen das $_POST[menu] kein Array ist, dem entgegen steht aber die ausgabe aus dem print_r das folgendes meldet :
Array ( [menu] => Array [test] => test)
Kann mir da jemand helfen ?
Vielen dank im voraus.

MfG
 
Mach die eckigen Klammern im Markup raus. Dann sollte automatisch ein richtiges Array draus werden.
möchte jetzt eigentlich die werte aus dem Array mit einem | in die DB speichern
Das überdenkst du hoffentlich nochmal. Das wäre ein Verstoß gegen 1NF! 8O

Im Übrigen solltest du dir angewöhnen, Arrayindizes ordentlich zu schreiben, sonst läufst du Gefahr, dass dein Code bald nicht mehr funktioniert.
 
Hi, wenn ich die [] aus dem Markup entferne ist aber das Problem das ich keine Multiple auswahl mehr habe.
Dann habe ich nur 1 Wert im Array.
Ich brauche aber alle.
Bei Auswahl von Pizza und Bifsteca bekomme ich folgende werte zurück :
Array ( [menu] => Bifsteca [test] => test)
Laut definition mache ich mit <select name="menu[]" multiple="multiple" size="4">
Ein ordentliches Array daraus.

P.s: keine Panik im Originalcode ist es etwas anderst, aber für die hilfe dazu brauche ich nur das kleine Beispiel.
Da ich normalerweise die Werte für das Option aus der DB hole und da sind es so ca. 20 werte.
Und warum sollte ich den Rückgabewert nicht mit einem | getrennt als Array in die DB speichern ?

MfG
 
Hi, wenn ich die [] aus dem Markup entferne ist aber das Problem das ich keine Multiple auswahl mehr habe.
Dann habe ich nur 1 Wert im Array.
Ich brauche aber alle.
Jupp, war Quark von mir. Mit [] ist es schon richtig. siehe selfHTML: https://de.selfhtml.org/html/formulare/auswahl.htm#listen_mehrfach
Und warum sollte ich den Rückgabewert nicht mit einem | getrennt als Array in die DB speichern ?
Wie gesagt, das ist ein Verstoß gegen die 1NF. Du machst dir damit nur Probleme, wenn du mit den Daten weiterarbeiten willst.
Es gibt hier genügend Threads im Forum, wo Leute fragen, wie sie ein Problem lösen können und es sich rausstellt, dass sie auf Grund ihrer Verstöße gegen die Normalformen sich diese Probleme selber gemacht haben. Also in deinem Interesse: Machs gleich richtig, erspar uns einen solchen Thread, erspar dir die Mühe, später wieder mächtig umschreiben zu müssen.
 
Öhrm, scheinbar stimmt mit Deiner PHP-Installation irgendwas nicht. Ich habe den Code oben problemlos ausführen können.
Array ( [menu] => Array ( [0] => Tortelloni [1] => Bifsteca ) [test] => test )
Und die Daten sollten eigentlich atomar in der DB gespeichert werden, siehe 1. Normalform. Wenn's bei Dir aber passt und Du damit arbeiten kannst, hindert Dich niemand daran, die Daten per Pipe getrennt zu speichern.
 
Jo, diese werte in 1NF zu speichern wäre bei mir eigentlich in diesem Fall ziemlich fatal.
Aber ich überdenke mir das mal ob ich das ganze evtl. in NF abarbeiten kann.
Danke für die Hinweise.

P.s: tleilax, meinst du den von mir geposteten code oben ?
Der Funzt in dieser Form korrekt ?
Das würde nämlich erklären warum ich da keinen Fehler finde.

Wollte das nämlich per :
foreach($_POST['menu'] as $s){ $menu1.="".$s."|"; }
In die DB schieben.
Diese werte brauche ich nur noch einmal zur ausarbeitung.

Edit : Stimmt tleilax, der Code funzt einwandfrei.
Nur innerhalb des VMS nicht.
Weis da jemand warum ?
 
Hm, das VMS wird ja nicht mit den $_POST-Variablen Schabernack treiben oder? Die Ausgabe des print_r() spricht dagegen, aber das Fehlverhalten eindeutig dafür...

Und btw: Das Zusammenfügen zum Speichern kannst Du ohne Schleife viel einfacher haben:
PHP:
$data = implode('|', $_POST['menu']);
Macht das Auslesen mit explode() auch ein wenig einfacher, da der letzte, quasi leere Eintrag verschwindet. :think:
 
Wollte das nämlich per :
foreach($_POST['menu'] as $s){ $menu1.="".$s."|"; }
In die DB schieben.
Dann hast du am letzten Element auch nochn Delimiter dranhängen. Und warum du n leeren String anhängen willst, versteht wohl auch niemand :-?

Wenn, dann doch einfach und nicht umständlich? ;)
PHP:
$menu1 = implode('|', $POST['menu']);
Bedenke, dass du die POST-Daten natürlich vorher überprüfen solltest. Daten vom User sind grundsätzlich immer erstmal böse!

edit: Jo, sag ich ja... nur zu langsam eben :biggrin:
 
Ok, ihr habt recht.
Werde das nochmal überdenken.

MfG und Danke für eure Hilfestellungen.

Hm, das ist Prachtvoll.
Im VMS 1.2 ohne Klammanbindung ist da ein Fehler in der extra.lib.php.
Nachdem ich das behoben habe funzt foreach.
Jetzt geht aber implode nicht.

Das geht mir langsam auf die Nerven das dingens.

Naja, werde mir was einfallen lassen müssen dafür.

Thx MfG
 
Zuletzt bearbeitet:
Hi,
habe mir eure Ratschläge zu Herzen genommen und das ganze jetzt anderst gemacht.

Da ich ja wie gesagt 20 bis Maximal 30 Selects habe, habe ich das ganze jetzt mit Checkboxen gemacht und diese Binär in der DB gespeichert.
Naja, grenze ist da halt 32 aber das macht ja nix da ich ja max 30 haben werde.
Das funzt recht gut und ist schön Performance schonend.

Danke für eure Tipps.

MfG