Mailinglisten-Archive |
Hallo Björn, Björn Dautermann wrote: > Möchte bei einem Formular checkboxen anklicken und dazu noch in einem > Textfeld die Anzahl eintragen können. Die checkboxen stehen für die Art des > Kartons, den man auswählen kann, das Textfeld gibt die Anzahl an Kartons an, > die man benötigt. Erste Überlegung: Sind Checkboxen das notwendige und geeignete Formular-Element? Kann der Nutzer mehrere Kartonarten auswählen oder muss er sich immer für eine Art entscheiden? In letzterem Fall wären Radiobuttons besser geeignet. Aber das nur am Rande als Denkanstoß. Zweite Überlegung: Muss der Nutzer denn zwingend die Art des Kartons mit einer Checkbox markieren oder reicht es vielleicht nicht schon aus, wenn er bei der gewünschten Art die Menge einträgt. Alle Arten mit eingetragener Menge gelten dann aus ausgewählt. > <p> <input type="checkbox" name="<?echo $cb[0]?>">3er Karton</p> Welchen Wert wird diese Checkbox liefern nach dem Submit? Laut SELFHTML ist eine Checkbox wie folgt aufgebaut: <input type="checkbox" name="Name" value="Wert"> Text Dass man den Value weglassen kann, davon steht da nichts, aber vielleicht reagiert HTML dann mit einen Standard-Wert. Durchaus möglich, obwohl für mich der Vollständigkeit halber ein Value immer dazugehört. Vorschlag: Gib deinen Checkboxen einen Namensraum z.B. "kartonart_" Dann wirst du nach dem Submit die entsprechenden Felder leichter erkennen können (ggf. mit einem preg_match oder ereg) oder falls es sich um eine begrenzte und dir immer bekannte Anzahl an Arten handelt, dann kannst du die Schlüssel im $_POST auch direkt prüfen. > <? $t = array(0,1,2,3,4);?> > <p><input type="text" name="<?echo $t[0]?>" maxlength="2" size="4"></p> > <p><input type="text" name="<?echo $t[1]?>" maxlength="2"size="4"></p> Warum nutzt du hier nicht auch eine Schleife zum Aufbau der HTML-Elemente? Mit dem vordefinierten Array lässt sich das doch wunderbar machen. Ich habs jetzt nicht selbst probiert, aber ich glaube nicht, dass im $_POST nach dem Formularelement-Typ unterschieden wird. Du wirst hier also offensichtlich das Problem haben, dass du jeweils 2 Felder (1 Checkbox und 1 Input) mit dem gleichen Namen belegst. Da die Input-Felder im Formular alle später definiert werden als die gleichnamigen Checkboxen, werden die Checkboxen von den Inputfeldern überschrieben und demzufolge auch gar nicht im $_POST auftauchen. Dies hättest du selbst schon überprüfen können, indem du dir direkt nach einem Submit gleich am Anfang deines Scriptes mal den gesamten Inhalt von $_POST ausgeben lässt und schaust, was so alles ankommt. echo '<pre>'; print_r($_POST); echo '</pre>'; Lösung für dieses Problem wäre, den oben erwähnten Namensraum in die Feldbezeichnungen einzubauen. > //Kartonart auswerten strlen($cb) strlen($cb) ? > if (isset ($_POST['summe'])) { Hab ich im Formular ein Feld übersehen oder woher kommt dieser Schlüssel 'summe' im $_POST? > for ($i = 0; $i < count($cb); $i++) { Ok. Wobei ich dem Array $cb einen sprechenderen Namen geben würde. Mir fällt nämlich spontan nichts ein, womit ich "cb" als Karton-Art übersetzen könnte. Na Hauptsache du erkennst deine eigenen Variablen wieder. > // if (isset ($_POST)) { Sowas hättest du vor deiner Anfrage an die Liste mal aufräumen können. > if (isset ($POST_['$cb[$i]'])) { Ach du meine Güte... $_POST_... gibt es zunächst nicht als PHP-eigene Superglobale. Und selbst definiert hast du so eine solche Variable auch nicht. Die Superglobale ist immer $_POST (ohne irgendwelche Suffixe) und beinhaltet ggf. die Werte, die über Schlüssel erreichbar sind. if ( isset($_POST[$i]) ) { würde funktionieren, da in deinem Array $cb (welches du leider nicht eindeutig als assoziatives Array angelegt hast) die Schlüssel und Werte identisch sind. if ( isset($_POST[$cb[$i]]) ) { wirst du gemeint haben, wobei du dir selbst ein Bein stellst, wenn du ein indiziertes Array assoziativ abfragst. Dann leg doch das Array $cb gleich als assoziatives Array an, vergib sprechende Werte für die Kartonarten und dann lässt sich das im HTML besser nachvollziehen ("kartonart_klein" ist sprechender als "kartonart_0") und du kannst beim Auswerten auch assoziativ auf dieses Array zugreifen. > //Kartonpreis ermitteln und übergeben > $karton[$i] = $karton_preise[$i]; Übergeben wohin? Wozu kopierst du den Inhalt von $karton_preise nach $karton? > //Anzahl des Kartons speichern > if (isset ($_POST['$t[$i]'])) { Auch hier ist der Zugriff auf die Schlüssel in $_POST falsch. Entweder benutzt du einen String $_POST['kartonart_klein'] oder eine Variable $_POST[$t[$i]]. Die Verwendung von Variable innerhalb eines Strings ist möglich, muss dann allerding in doppelten Anführungszeichen erfolgen und ist der Syntax-Erkennung deines Editors sehr abträglich. Hinweis: $_POST["$t[$i]"] meint etwas anderes als $_POST[$t[$i]]. $kartonarten = array( 'klein', 'mittel', 'gross', ); $bestellung = array(); $summe_menge = 0; $summe_preis = 0; foreach ( $kartonarten as $k => $v ) { // $k = key, $v = value if ( isset($_POST['kartonart_'.$v]) AND $_POST['menge_'.$v] > 0 ) { $bestellung[$v] = $_POST['menge_'.$v]; $summe_menge += $_POST['menge_'.$v]; // über die Summierung von Mengen unterschiedlicher Arten lässt sich streiten $summe_preis += $karton_preise[$k]; // alternativ ist dein preise array assoziativ aufgebaut, dann $karton_preise[$v]; } } echo '<pre>'; print_r($bestellung); echo </pre>'; echo 'Summe Menge: '.$summe_menge.'<br />'; echo 'Summe Preis: '.$summe_preis.'<br />'; Überprüfungen von Eingabefehlern sollten vor dieser Berechnung erfolgen. Also bring mal etwas Ordnung in deinen Script-Ablauf und versuche über print, echo und print_r oder var_dump die Werte von Variablen an den entscheidenden Stellen im Script nachzuvollziehen. Schau dir außerdem den von dir erzeugten HTML-Quelltext im Browser an. So kommst du den eigenen Fehlern schneller auf die Spur. Wenn dann noch wirkliche Probleme anstehen, grenze diese bitte auf die entscheidenden Zeilen ein. Dann fällt es den Leuten hier in der Liste leichter, eine gezielte Antwort zu geben. regards, Ringo
php::bar PHP Wiki - Listenarchive