Überprüfung dynamisch erzeugter Radiobuttons

knallbernd

Erfahrenes Mitglied
Hallo!
Wäre sehr nett wenn mir jemand helfen könnte, es geht um eine Formularüberprüfung.
Und zwar habe ich ein dynamisch aus einer DB erzeugtes Formular mit Radiobuttons:

PHP:
<html>
<head>
</head>

<form name="bewertung" method="post" action="formular.php">
<?php
error_reporting(E_ALL);

mysql_connect//...

$x = mysql_real_escape_string($_POST["kurs"]);
$abfrage = "SELECT $x FROM lehrende";
$ergebnis = mysql_query($abfrage) or die("MySQL-Fehler: " . mysql_error());

if (mysql_num_rows($ergebnis)) {
  while($row = mysql_fetch_array($ergebnis))
  {           
     $rname = $row[0];
     echo "$rname
  <table>
   <tr><td>Unterrichtsvorbereitung</td>
   <td><input type=\"radio\" name=\"Frage1[{$rname}]\" value=\"1\"></td>
   <td><input type=\"radio\" name=\"Frage1[{$rname}]\" value=\"2\"></td>
   <td><input type=\"radio\" name=\"Frage1[{$rname}]\" value=\"3\"></td>
   <td><input type=\"radio\" name=\"Frage1[{$rname}]\" value=\"4\"></td>
   <td><input type=\"radio\" name=\"Frage1[{$rname}]\" value=\"5\"></td>
   <td><input type=\"radio\" name=\"Frage1[{$rname}]\" value=\"6\"></td>
   </tr>
   
   <tr><td>Fachliche Sicherheit</td>
   <td><input type=\"radio\" name=\"Frage2[{$rname}]\" value=\"1\"></td>
   <td><input type=\"radio\" name=\"Frage2[{$rname}]\" value=\"2\"></td>
   <td><input type=\"radio\" name=\"Frage2[{$rname}]\" value=\"3\"></td>
   <td><input type=\"radio\" name=\"Frage2[{$rname}]\" value=\"4\"></td>
   <td><input type=\"radio\" name=\"Frage2[{$rname}]\" value=\"5\"></td>
   <td><input type=\"radio\" name=\"Frage2[{$rname}]\" value=\"6\"></td>
   </tr>

   
   <input type=\"hidden\" name=\"ueberpruefung\" value=\"1\"> 
   <br>
   </table>";
     
  }
} else {
  echo "No result for {$_POST['kurs']}<br />";
}
}

?> 
<input type="hidden" name="name" value="<?PHP print ("$x"); ?>">
<input value=" Beurteilung absenden" type="submit">
</form>
</html>

Das Ziel ist eine Überprüfung, ob ALLE Radiobuttons ausgewählt wurden. Falls nicht soll eine Fehlermeldung ausgegeben und NICHT an formular.php weitergeleitet werden.
Habs schon mittels diesem Tutorium http://www.tutorials.de/forum/php-tutorials/207714-formular-uberpruefung-mit-fehlerausgabe.html
versucht, allerdings will das in meinem speziellen Fall nicht funktionieren. Oder ich bin zu blöd. Bitte bitte um Hilfe :(.
 

saftmeister

Nutze den Saft!
Eines kann ich dir schon mal sagen, ohne XSS kann man nicht alle Radio-Buttons gleichzeitig auswählen. Das ist der Sinn von Radio-Buttons.

Zum zweiten hab ich nen Vorschlag: Speicher dein $rname in einer Session, dann kannst du mit

PHP:
$rname = $_SESSION['rname'];
$button = $_POST['Frage1'.$rname];

den Button auslesen, der geklickt wurde.

Vielleicht konnte ich etwas behilflich sein.

EDIT: Sorry, mein Code ist hier nicht ganz brauchbar, aber er zeigt auf einen möglichen Lösungsweg hin.
 

knallbernd

Erfahrenes Mitglied
Zunächst mal vielen Dank für deine prompte Antwort. Ich hab mich vielleicht unklar ausgedrückt. Es soll überprüft werden ob bei jeder Frage ein Radiobutton angeklickt wurde --> das Ganze ergibt dann beim folgenden Script Sinn (kann ich nachher zum besseren Verständnis gerne posten).
Falls auch nur eine Frage leerbleibt soll eine Fehlermeldung aufscheinen und das Formular nicht abgeschickt werden.
Das Weiterverarbeiten funktioniert schon wunderbar, die Überprüfung ist jetzt noch das (unabdingbare) i-Tüpfelchen ;-).
 

saftmeister

Nutze den Saft!
Ok, dann benenn deine Radio-Buttons doch so:

PHP:
<td><input type=\"radio\" name=\"Frage1$rname\" value=\"1\"></td>


Anschließend kannst du mit dem von mir oben geschriebenem Code arbeiten.

Abfragen kannst du das dann z.B. so:

PHP:
if(!isset($_POST['Frage1' . $_SESSION['rname']])) {
    echo "Es wurde keine Option bei Frage 1 ausgewählt";
}
 

knallbernd

Erfahrenes Mitglied
So einfach gehts in dem speziellen Fall leider nicht, weil das ganze Ding sehr umfangreich und in sich schon schlüssig aufgebaut ist. Mag dich aber damit um die Uhrzeit nicht belästigen (höchstens du möchtest :)).
 

saftmeister

Nutze den Saft!
Ok, dann fragen wir mal anders: Warum hast du das so gelöst:

Frage1[{$rname}]

Das erscheint mir etwas seltsam und deutet auf die Verwendung eines Templates hin. Um Normalfall sollten die geschweiften Klammern doch wegfallen.

BTW: Was spuckt ein

PHP:
echo "<pre>";
print_r($_POST);
echo "</pre>";

nach Abschicken des Forms denn genau aus?

EDIT: ich hab es mir noch mal genau durch gelesen. Wenn du beim absenden des Forms checken willst, ob alles ausgewählt wurde, geht das nur mit Javascript, welches letztendlich verhindert, dass das Form abgesendet wird. Das Java-Script müsste dann natürlich auch dynamisch aufgebaut werden, da deine Radio-Buttons einen dynamischen Namen bekommen.

Kurz gesagt, du müsstest das onsubmit-Ereignis des Formulars mit einem JS bestücken, quasi so:

Code:
<form name="bla" action="blub.php" method="post" onsubmit="return checkMyButtons();">

In der JS-Funktion checkMyButtons müsstest du über alle Radio-Buttons laufen, und prüfen ob sie gesetzt sind (Eigenschaft checked). Ich empfehle einen Blick ins SelfHTML: http://de.selfhtml.org/javascript/objekte/elements.htm#checked

Wenn du es ohne JS lösen willst, geht das auch, das File formular.php wird dann aber trotzdem aufgerufen, das lässt sich dann nicht verhindern. Du kannst dann im forumlar.php lediglich die Prüfung vornehmen und ein header()-Redirect vornehmen.
 
Zuletzt bearbeitet:

knallbernd

Erfahrenes Mitglied
Na gut :)...

Das ganze ist ein Beurteilungsscript. Ich poste mal den Code mit Kommentaren zum besseren Verständnis:

PHP:
<html> 
<head> 
</head> 
<form method="post" action="formular.php"> 
<?php 
error_reporting(E_ALL); 
 
//Ansprechen des auf der ersten Seite ausgewählten Kurses:  
 
$x = mysql_real_escape_string($_POST["kurs"]); //speichert die Einträge in der Variable $x. 
$abfrage = "SELECT $x FROM lehrende"; 
$ergebnis = mysql_query($abfrage) or die("MySQL-Fehler: " . mysql_error()); 
 
if (mysql_num_rows($ergebnis)) { 
  while($row = mysql_fetch_array($ergebnis)) 
  {            
     $rname = $row[0]; 
     echo "$rname 
     //Erzeugen der Radiobuttons, wobei bei jeder Frage der Name des Lehrenden mitgegeben wird.

  <table> 
   <tr><td>Unterrichtsvorbereitung</td> 
   <td><input type=\"radio\" name=\"Frage1[{$rname}]\" value=\"1\"></td> 
   <td><input type=\"radio\" name=\"Frage1[{$rname}]\" value=\"2\"></td> 
   <td><input type=\"radio\" name=\"Frage1[{$rname}]\" value=\"3\"></td> 
   <td><input type=\"radio\" name=\"Frage1[{$rname}]\" value=\"4\"></td> 
   <td><input type=\"radio\" name=\"Frage1[{$rname}]\" value=\"5\"></td> 
   <td><input type=\"radio\" name=\"Frage1[{$rname}]\" value=\"6\"></td> 
   </tr> 
    
   <tr><td>Fachliche Sicherheit</td> 
   <td><input type=\"radio\" name=\"Frage2[{$rname}]\" value=\"1\"></td> 
   <td><input type=\"radio\" name=\"Frage2[{$rname}]\" value=\"2\"></td> 
   <td><input type=\"radio\" name=\"Frage2[{$rname}]\" value=\"3\"></td> 
   <td><input type=\"radio\" name=\"Frage2[{$rname}]\" value=\"4\"></td> 
   <td><input type=\"radio\" name=\"Frage2[{$rname}]\" value=\"5\"></td> 
   <td><input type=\"radio\" name=\"Frage2[{$rname}]\" value=\"6\"></td> 
   </tr> 
   
   </table>"; 
      
  } 
} else { 
  echo "No result for {$_POST['kurs']}<br />"; 
} 
?>  
<input type="hidden" name="name" value="<?PHP print ("$x"); ?>"> 
<input value=" Beurteilung absenden" type="submit"> 
</form> 
</html>

Und jetzt das Schreiben in die DB:

PHP:
?php 
 
error_reporting(E_ALL); 
 
$verbindung = mysql_connect ('localhost', 'root', '') 
or die ("keine Verbindung möglich. 
 Benutzername oder Passwort sind falsch"); 
 
mysql_select_db("homepage") 
or die ("Die Datenbank existiert nicht."); 
 
echo '<pre>'; 
var_dump($_POST); 
echo '</pre>'; 
 
$y = $_POST['name']; //in dem Fall unwichtig (der Kursname wird mitgegeben)
 
echo $y; 
 
//if-Schleife, die Grenzzahl ist abhängig von der Anzahl der Fragen 
for ($i=1; $i<3; $i++ ) { 
         
   $zahl = "Frage".$i; //Variable, abhängig von den Fragen im Formular (Frage1, Frage2,...) --> 
//haben die selben Namen wie die Spalten in der DB. 
   $array[$zahl] = $_POST[$zahl]; // speichert die Einträge des Formulars in einem Array ($array[Frage1], $array[Frage2],...) 
 
 
foreach ($array[$zahl] as $key => $wert) { 
        echo "In '".$key."' is question '".$zahl."' the value '".$wert."'<br />\n"; //Zum Beispiel: In Name1 is Frage1 the value 3. 
 
                $Name = $key; 
                $Abteilung = $y; 
        $Wert = $wert;          
 
        //Schreiben in DB: nur wenn $i==1, weil ich die Namen nur einmal in die DB schreibe, die Werte dann später dazu. 
        if ($i == 1){ 
 
        $query = "INSERT INTO personen (ID, Name, Abteilung) VALUES (NULL, '$key', '$y')"; 
        $result = mysql_query($query) or die('Query failed: ' . mysql_error()); 
} 
 
//UPDATE der Werte, bsp.:  
//Name/ Frage1 / Frage2 
//Name1 / 1 / 5 
//Name2 / 2 / 3 
 
//Hier liegt jetzt der Grund dass ich unbedingt eine Formularüberprüfung brauche: 
//die Werte werden nun NUR in freie Felder geschrieben, passend zum Namen. 
//Würde nur ein Wert frei bleiben würde er logischerweise vom nächsten ausgefüllten Formular befüllt werden - soll ja nicht sein.
 
$aendern = "UPDATE personen SET $zahl = '$wert' WHERE Name = '$key' AND $zahl = ''";  
        $ergebnis = mysql_query($aendern) or die('Query failed: ' . mysql_error()); 
    
echo $ergebnis; 
 
} 
} 
    mysql_close();   
?>

POST gibt mir folgendes aus (was ja passt):

array(3) {
["Frage1"]=>
array(3) {
["Name1"]=>
string(1) "2"
["Name2"]=>
string(1) "2"
["Name3"]=>
string(1) "3"
}
["Frage2"]=>
array(3) {
["Name1"]=>
string(1) "1"
["Name2"]=>
string(1) "1"
["Name3"]=>
string(1) "4"
}

Hoffe jetzt ist das Problem verständlicher.
 
Zuletzt bearbeitet:

knallbernd

Erfahrenes Mitglied
Mit Javascript hab ichs schon gemacht, ist mir allerdings in diesem Fall zu unsicher.

Bei der Überprüfung in formular.php ist das Problem dass POST schon mitgegeben wurde und schon entsprechend in die DB geschrieben wird, selbst wenn nur 1 Wert angeklickt wurde. Ich habs mal so probiert, ging aber auch nicht:

PHP:
$valid = true;
for ($i=1; $i<3; $i++ ) {
    $zahl = "Frage".$i;
    $array[$zahl] = $_POST[$zahl];
    foreach ($array[$zahl] as $key => $wert) {
        if (empty($wert)) {
            $valid = false;
            break;
        }
    }
}

if ($valid) {

        for ($i=1; $i<3; $i++ ) { //und so weiter...
 
Zuletzt bearbeitet: