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