phpbar.de logo

Mailinglisten-Archive

[php] Summe des Formulas berechnen

[php] Summe des Formulas berechnen

Ringo Großer swek at gmx.net
Mon Apr 9 13:38:57 CEST 2007


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>&nbsp;<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