Probleme mit der Auswertung von checkboxen
TomIRL
- php
0 André Laugks0 TomIRL
Guten Abend Allerseits
Ich brauche mal wieder jemanden der mir das Brett vor dem Kopf entfernt.:-)
Ausgangslage größeres Formular in dem Die eingegebnen Sachen auf Fehler geprüft werden.
Ich möcht eben jemem Formular bei Checkboxen wenn vorher die Werte ausgewählt waren nach der Fehlerprüfung und vorhandenem Fehler ebenfalls die Werte wieder angeklickt haben.
Nach dem Absenden tritt nun folgender fehler auf:
<img src="http://junior-tours.de/self/fehler.jpg" border="0" alt="">
Also immer Wiederholungen je nach Anzahl der ausgewählten Checkboxen!
Naürlich auch entsprechend in kürzeren Varianten wenn ich nur 2 Boxen ausgewählt habe.
Nun mal ein bischen Quellcode weil ich mich ja schon ne Stunde mit dem Problem rumschlage:
<?php while ($i = mysql_fetch_array($zl)){
//Auslesen aus der DB klappt!
$zl_id=$i[zl_id];
$zusatz=$_POST[zusatzleistungen];
// Wenn ich das Formular absende kommt die Variable $_POST[zusatzleistungen] auch tatsächlich an!
if ($zusatz){
// Array auswerten
foreach ($zusatz as $z_id=>$preis){
// Abfrage welche Werte checked sind
if ($z_id==$i[zl_id]){
print ("<input type="Checkbox" name='zusatzleistungen[$zl_id]' value="$i[zl_preis]" checked>$i[zl_name] $i[zl_preis] <br> ");}
//Angabe was passieren soll wenn if ($z_id==$i[zl_id])nicht erfüllt ist
else { print ("<input type="Checkbox" name='zusatzleistungen[$zl_id]' value="$i[zl_preis]">$i[zl_name] $i[zl_preis] <br> ");}
}//Ende foreach
}//Ende if ($zusatz)
// Hier liegt vermutlich das Problem
//Diese Ausgabe soll erfolgen wenn nichts gepsotet wird klappt beim ersten absenden auch!
//Bloss wenn etwas ausgewählt ist dann eben nicht mehr
elseif (!$zusatz) {
print ("<input type="Checkbox" name='zusatzleistungen[$zl_id]' value="$i[zl_preis]">$i[zl_name] $i[zl_preis] <br> ");} }
?>
Ich hoffe ich konnte mein Problem einigermassen passend beschreiben.
Keine Ahnung "grübbel" ich glaub ich mache mir erst einmal ein Bier auf und gucke noch einmal in Ruhe!
Vielen Dank für die hilfe TomIRl
Hallo!
Ich möcht eben jemem Formular bei Checkboxen wenn vorher die Werte ausgewählt waren nach der Fehlerprüfung und vorhandenem Fehler ebenfalls die Werte wieder angeklickt haben.
Also, wenn Du die Boxen
[ ] 1
[ ] 2
[ ] 3
[ ] 4
[ ] 5
[ ] 6
hast und die Boxen 2 und 5 angeklickt werden, soll bei einem Fehlerbehandlung des Formulars wieder 2 und 5 angecheckt sein?
Wenn das so ist, sieht das vom Prinzip so aus:
$db_array = array(1,2,3,4,5,6); // aus DB
$checked_array = array(2,5); // $_POST[zusatzleistungen]
// $db_array durchlaufen
for($i = 0; $ < count($db_array); $i++)
{
$checked = false;
// $checked_array durchlaufen
// jedes element gehen alle Element aus $db_array testen
for($j = 0; $j < count($checked_array); $j++)
{
if($db_array[$i] == $checked_array[$j])
{
// Treffer -> checked wird true
$checked = true;
break;
}
}
if($checked)
{
print(<input ... checked>)
}
if(!$checked)
{
print(<input ... >)
}
}
MfG, André Laugks
Moin Andrè
vielen Dank für Deine Hilfe.
Bei Deiner Variante gabs aber 2 Probleme:
1. Das Array komt Zeilenweise aus der DB und die id sitz in der ersten Spalte!
2. Der von Dir vorgeschlagene Weg bringt einen Abruch sobald ein selected Feld gefunden wurde. Kann auch sein, dass ich da was falsch gemacht habe :-)
Deine Lösung hat mich aber den ganzen Prozess überdenken lassen, so dass ich zu einer anderen Lösung gekommen bin
Danke dafür.
Hier nun zur Info meine Lösung:
Nur eine Schleife!
TomIRL
<?php
// schleife über zusatzleistungen
while ($i = mysql_fetch_array($zl)) {
// check ob checkbox gechecked
$checked="";
if ($_POST["zusatzleistungen"][$i["zl_id"]]) $checked=" checked";
// Ausgabe checkbox
print "<input type="checkbox" name="zusatzleistungen[{$i[zl_id]}]"
value="{$i[zl_preis]}"{$checked}>{$i[zl_name]} {$i[zl_preis]}<br>\n";
}
?>
Hallo!
- Das Array komt Zeilenweise aus der DB und die id sitz in der ersten Spalte!
Naja, der erste Schleife kann auch die Daten aus der Datenbank abarbeiten. Das muß ja nicht aus einem "festen" Array kommen.
- Der von Dir vorgeschlagene Weg bringt einen Abruch sobald ein selected Feld gefunden wurde. Kann auch sein, dass ich da was falsch gemacht habe :-)
Ich habe es zwar nicht getestet, aber es sollte nur zum Abbruch in der inneren Schleife kommen. Wenn der Vergleich passt, muß man die innere Schleife nicht noch weiter laufen lassen. Die innere Schleife wird aber immer bei jedem Wert aus der DB/$db_array wieder neu angeschmießen.
Deine Lösung hat mich aber den ganzen Prozess überdenken lassen, so dass ich zu einer anderen Lösung gekommen bin
Danke dafür.
Dann ist ja gut!
MfG, André Laugks