Formulare mit mehreren radio-Button-Auswahlfeldern
David
- php
0 Felix Riesterer0 David0 Felix Riesterer0 David
0 David1 Dennis0 David
0 David
Hallo,
ich beschäftige mich erst seit kurzem mit PHP und verstehe eine (hoffentlich recht einfache) Sache bei Formularen nicht:
Ich habe ein Formular. Dort habe ich unter anderem mehrere Auswahlfelder drin, die ich mit radio-Button abfrage. Also etwa so:
<form>
Hast du Montag einen Termin?
<input type="radio" name="<?php echo "$id";?>">Ja
<input type="radio" name="<?php echo "$id";?>">Nein
Hast du Dienstag einen Termin?
<input type="radio" name="<?php echo "$id";?>">Ja
<input type="radio" name="<?php echo "$id";?>">Nein
<input type="radio" name="<?php echo "$id";?>">Vielleicht
<input type="submit" value="abschicken" name="eintragen">
</form>
Das Ergebnis will ich dann in eine Datenbank eintragen. Und die Fragen hole ich auch aus einer Datenbank. $id wäre dann z.B. die id der jeweiligen Frage. Eintragen würde ich das dann in etwa so:
mysql_query("INSERT into datenbank (antwort) VALUES ('$?')");
Was muss ich jetzt für $? eingeben. Ich glaube es würde mit einem Array gehen. Aber ich verstehe nicht wie.
Ich hoffe ich konnte mich verständlich machen. Wäre schön, wenn mir jemand helfen kann. Danke dafür schonmal!
Gruß
David
Lieber David,
kennst Du schon die superglobalen Arrays?
Insbesondere $_POST dürfte Dich interessieren.
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Hi Felix,
Danke schonmal für die Antwort. Grds. weiß ich, wie ich ein Formular absende und danach in die Datenbank eintrage. Auch $_POST und $_GET (wenn ich dich richtig verstehe) sind mir ein Begriff. Ich könnte das Formular im Beispiel auch verarbeiten, wenn nur eine Antwort-Auswahl vorgegeben wäre. Also z.B. nur "hat du Montag einen Termin?".
Was mir Probleme macht, ist die "doppelte" Auswahlmöglichkeit.
Ich glaube was mir hilft, wäre ein Variable zu erzeugen und diese hochzuzählen. So hätte jede radio-Auswahl einen eindeutigen Namen. Aber irgenwie stehe ich genau hier auf dem Schlauch. Wie kann ich danach die richtige Variable ansprechen, um die Antwort in der Datenbank der richtigen Frage zuzuordnen?
Lieber David,
Was mir Probleme macht, ist die "doppelte" Auswahlmöglichkeit.
aus Deinem HTML-Code ist eine mehrfache Auswahl nicht möglich. Da alle Radiobuttons denselben Namen tragen, "wandert" der Punkt beim Anklicken, sodass immer nur eine Auswahl gleichzeitig möglich ist.
Solltest Du allerdings Checkboxen verwenden, deren name-Attribut verschiedene Werte enthält, dann hast Du Recht, wenn Du von einem Array sprichst. Da könntest Du so vorgehen:
<input type="checkbox" name="auswahl[]" value="wert1 />
<input type="checkbox" name="auswahl[]" value="wert2 />
<input type="checkbox" name="auswahl[]" value="wert3 />
In $_POST steht dann ein Array "auswahl" mit drei Elementen, das Du in etwa so auslesen kannst:
[code lang=php]foreach ($_POST['auswahl'] as $index => $wert) {
echo "Wert $index: $wert\n";
}
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Hallo Felix
aus Deinem HTML-Code ist eine mehrfache Auswahl nicht möglich. Da alle Radiobuttons denselben Namen tragen, "wandert" der Punkt beim Anklicken, sodass immer nur eine Auswahl gleichzeitig möglich ist.
Genau dies (denselben Namen der Radiobuttons) möchte ich ja umgehen. Kann ich das wirklich nur mit Checkboxen erreichen? Weil dann wäre auch eine Mehrfachantwort pro Frage möglich, was ich nicht möchte.
Ich möchte also erreichen, dass der HTML-Code so aussieht:
Frage 1
<input type="radio" name="1">Ja
<input type="radio" name="1">Nein
Frage 2
<input type="radio" name="2">Ja
<input type="radio" name="2">Nein
Für 1 und 2 soll dann natürlich eine Variable hinhalten, weil es z.B. auch 10 Fragen oder 100 Fragen sein könnten, die aus der Datenbank ausgelesen werden.
Aber ich glaube das mit den Checkboxen und dem Array habe ich verstanden. Mit Radiobuttons gibt es so eine Möglichkeit nicht. Es gibt doch soviele Formulare im Web, die so aufgebaut sind.
Gruß
David
Hi Felix,
Danke schonmal für die Antwort. Grds. weiß ich, wie ich ein Formular absende und danach in die Datenbank eintrage. Auch $_POST und $_GET (wenn ich dich richtig verstehe) sind mir ein Begriff. Ich könnte das Formular im Beispiel auch verarbeiten, wenn nur eine Antwort-Auswahl vorgegeben wäre. Also z.B. nur "hat du Montag einen Termin?".
Was mir Probleme macht, ist die "doppelte" Auswahlmöglichkeit.
Ich glaube was mir hilft, wäre ein Variable zu erzeugen und diese hochzuzählen. So hätte jede radio-Auswahl einen eindeutigen Namen. Aber irgenwie stehe ich genau hier auf dem Schlauch. Wie kann ich danach die richtige Variable ansprechen, um die Antwort in der Datenbank der richtigen Frage zuzuordnen?
Ich will also dieses hier erreichen
...
<input type="radio" name="1"Ja
<input type="radio" name"1">Nein
Hast du Dienstag einen Termin?
<input type="radio" name="2">Ja
<input type="radio" name="2>">Nein
<input type="radio" name="2">Vielleicht
<input type="submit" value="abschicken" name="eintragen">
...
Ich glaube ich drücke mich irgendwie umständlich aus ...
Gruß
David
Hi David,
Felix hat dir ja schon einen Tip gegeben - schau dir mal <?php echo print_r($_POST); ?> bzw <?php ehco print_r($_GET); ?> an.
<form>
Da steckt schon mal ein Fehler drin - du solltest die Attribute action und method angeben, also z.B.
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
Hast du Montag einen Termin?
<input type="radio" name="<?php echo "$id";?>">Ja
<input type="radio" name="<?php echo "$id";?>">Nein
Hast du Dienstag einen Termin?
<input type="radio" name="<?php echo "$id";?>">Ja
<input type="radio" name="<?php echo "$id";?>">Nein
<input type="radio" name="<?php echo "$id";?>">Vielleicht
Erst mal wieder Stilkorrektur: Schreibe einfach nur <?php echo $id; ?> - die Anführungszeichen um $id sind vollkommen überflüssig und erfordern lediglich weiteren Rechenaufwand von PHP.
Abgesehen davon sehe ich nirgendwo, dass $id verändert wird - es werden also alle Radio-Buttons denselben Namen bekommen, das hat zur Folge, dass man von _allen_ nur _einen_ auswählen kann. Vermutlich willst du aber, dass man sowohl bei Montag als auch Dienstag je einen auswählen kann, deshalb:
Hast du Montag einen Termin?
<input type="radio" name="mo_<?php echo "$id";?>">Ja
<input type="radio" name="mo_<?php echo "$id";?>">Nein
Hast du Dienstag einen Termin?
<input type="radio" name="di_<?php echo "$id";?>">Ja
<input type="radio" name="di_<?php echo "$id";?>">Nein
<input type="radio" name="di_<?php echo "$id";?>">Vielleicht
Also einfach bei den unterschieldichen Tagen einen tages-spezifischen Prefix davorstellen. Damit ist auch sichergestellt, dass der vergebene Name mit einem Buchstaben beginngt - $id wird vermutlich eine Zahl sein, aber namen dürfen nicht mit Zahlen beginnen!
So, machen wir weiter - leichter auszuwerten im PHP-Scirpt wird das ganze, wenn du noch value Werte vergibst:
Hast du Montag einen Termin?
<input type="radio" name="mo_<?php echo "$id";?>" value="ja">Ja
<input type="radio" name="mo_<?php echo "$id";?>" value="nein">Nein
Hast du Dienstag einen Termin?
<input type="radio" name="di_<?php echo "$id";?>" value="ja">Ja
<input type="radio" name="di_<?php echo "$id";?>" value="nein">Nein
<input type="radio" name="di_<?php echo "$id";?>" value="vielleicht">Vielleicht
Was muss ich jetzt für $? eingeben. Ich glaube es würde mit einem Array gehen. Aber ich verstehe nicht wie.
Über $_POST['mo_X'] könntest du darauf zugreifen - wobei X für die entsprechende Zahl steht. Beachte aber bitte, dass du den Wert bevor du ihn in einen SQL-Query packst auf jeden Fall durch mysql_real_escape_string() schickst, andernfalls machst du deine Datenbank zu einem Ziel für Hackangriffe.
MfG, Dennis.
Hi Dennis
Da steckt schon mal ein Fehler drin - du solltest die Attribute action und method angeben, also z.B.
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
Sorry. Ich habe nur eine Kurzform gepostet. "action" habe ich gesetzt.
Erst mal wieder Stilkorrektur: Schreibe einfach nur <?php echo $id; ?> - die Anführungszeichen um $id sind vollkommen überflüssig und erfordern lediglich weiteren Rechenaufwand von PHP.
Danke für den Hinweis.
Abgesehen davon sehe ich nirgendwo, dass $id verändert wird
$id wird aus der Datenbank abgefragt. Und ist für jede Frage anders. Für Frage Eins wird $id = 1 sein und für Frage Zwei hat $id den Wert 2.
Damit ist auch sichergestellt, dass der vergebene Name mit einem Buchstaben beginngt - $id wird vermutlich eine Zahl sein, aber namen dürfen nicht mit Zahlen beginnen!
Danke! Habe ich nicht beachtet.
So, machen wir weiter - leichter auszuwerten im PHP-Scirpt wird das ganze, wenn du noch value Werte vergibst:
Sorry Nr. 2. Auch value habe ich vergeben und hier nur nicht gepostet, weil ich dachte, das spielt für mein Problem keine Rolle. Tut mir Leid, ich werde das beim nächsten Post alles wieder gut machen.
Beachte aber bitte, dass du den Wert bevor du ihn in einen SQL-Query packst auf jeden Fall durch mysql_real_escape_string() schickst, andernfalls machst du deine Datenbank zu einem Ziel für Hackangriffe.
Das habe ich nicht gewusst. Danke.
Ein großes Sorry an alle. Ich glaube ich habe sehr schlecht meine Frage gepostet. Hier nochmal, hoffentlich vollständig:
//Abfrage für Ergenisse aus der Datenbank (funktioniert auch)
$praef_abfr = mysql_query("SELECT * FROM ptp_feiertage WHERE probe = '1' && datum >= '$datum_heute' LIMIT $start, $eintraege_pro_seite");
+++++++++++++++++++++++++++++
<?
// Ergbenisse ausgeben
while ($praef = mysql_fetch_array($praef_abfr))
{
echo "<tr>
<td>"; wochentag ($praef[datum]); echo "</td>
wochentag ist eine von mir definierte Funktion, die den entsprechenden Tag der Woche berechnet.
<td>"; schoenes_datum ($praef[datum]); echo "</td>
schones_datum: Funktion, die das Datumsformat etwas schöner formatiert.
<td><input type="radio" name="$praef[id]" value="1">Ja
<input type="radio" name="$praef[id]" value="2">Nein
<input type="radio" name="$praef[id]" value="3">Vielleicht
</td>
<td>$praef[kommentar] <input type="hidden" name="idselektor" value="$praef[id]"></td>
</tr>";
}
?>
<tr><td colspan="4" align="right"><input type="submit" name="verfuegbarkeit_etr" value="abschicken"></td></tr>
</table>
</form>
+++++++++++++++++++++++++
Das ganze Formular steckt also in einer while-Schleife. Dieses Formular will ich also in die Datenbank eintragen.
<? (mysql_query("INSERT into datenbank (user, verfuegbar, kommentar) VALUES ('$_SESSION[name]', '$praef[id]', '$kommentar')"); ?>
Die Frage ist jetzt: Wie muss ich $praef[id] so benennen?
Danke.
Gruß
D.
Lieber David,
Die Frage ist jetzt: Wie muss ich $praef[id] so benennen?
was ist $praef[id]
? Eine Konstante? Ich hätte hier jetzt $praef[$id]
erwartet...
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Hi David,
Ich mache deinen Code mal etwas übersichlticher:
while ($praef = mysql_fetch_array($praef_abfr))
{
echo "<tr>\n";
echo "<td>" . wochentag ($praef[datum]) . "</td>\n";
echo "<td>" . schoenes_datum ($praef[datum]) . "</td>\n";
// echo "<td><input type=\"radio\" name=\"$praef[id]\" value=\"1\">Ja"
// Hier hast du immer noch eine Nummer als Namen!
// Wir werden das mit den Namen jetzt etwas anders machen, wir werden das
// als ein Array aufbauen - damit das auch wieder als Array reinkommt, das macht
// das ganze beim Verarbeiten leichter!
echo "<td><input type=\"radio\" name=\"antwort[" . $praef['id'] . "]\" value=\"1\">Ja\n";
echo " <input type=\"radio\" name=\"antwort[" . $praef['id'] . "]\" value=\"2\">Nein\n";
echo " <input type=\"radio\" name=\"antwort[" . $praef['id'] . "]\" value=\"3\">Vielleicht\n";
// ^^^^ Das ist besserer Stil!
// Alternativ könntest du auch im String {$praef['id']}
// schreiben, aber $praef[id] ist Murks!!
echo "</td>\n";
// für den Browser sähe das dann z.B. so aus:
// <input type="radio" name="antwort[5]" value="1">Ja
// nachfolgendes brauchen wir nicht
// <td>$praef[kommentar] <input type=\"hidden\" name=\"idselektor\" value=\"$praef[id]\"></td>
echo "</tr>\n";
}
Dieses Formular will ich also in die Datenbank eintragen.
Und genau das machen wir jetzt:
// Schau dir ruhig mal an, wie das $_POST Array aussieht:
echo "<pre>";
print_r($_POST);
echo "</pre>";
if(isset($_POST['verfuegbarkeit_etr']))
// ^^^^^ Name des Submit Buttons
{
foreach($_POST['antwort'] as $id => $wert)
// Wir durchlaufen alle Einträge in $_POST['antwort'], der Key enspricht dabei $praef['id'], hier $id
// und der Wert ist das was der Besucher angeklickt hat, 1, 2 oder 3
{
// es ist guten Stil den MySQL Query erst in eine Variable zu schreiben (weil der dann beim
// Debuggen leichter auszugeben ist) und außerdem über mehrere Zeilen zu schreiben (weil dann
// die Zeilenummer von mysql_error() hilft einen Fehler einzugrenzen)
$sql = "INSERT into datenbank (
user,
verfuegbar,
kommentar
)
VALUES (
'" . mysql_real_escape_string($_SESSION['name']) . "',
'" . mysql_real_escape_string($wert) . "',
'" . mysql_real_escape_string($kommentar) . "'
)";
// $_SESSION['name'] kann zwar eigentlich nicht von einem Besucher gefälscht werden, aber zur
// Sicherheit jagen wir es auch durch mysql_real_escape_string(), für $wert ist dies besonders
// wichtig, da dies ja unmittelbar vom User kommt!! Ich weiß nicht, woher deine Variable
// $kommentar kommt - zur Sicherheit habe ich auch die durch mysql_real_escape_string() geschickt.
// nun wird der erstelle MySQL-Query verschickt:
mysql_query($sql) OR die(mysql_error());
}
}
MfG, Dennis.
Lieber Dennis,
echo "<td>" . wochentag ($praef[datum]) . "</td>\n";
ich bin mir mit diesem "datum" bei $praef[datum]
immer noch nicht sicher! Ich vermisse da ein Dollar-Zeichen, da "datum" keine Konstante (Variablennamen _ohne_ Dollarzeichen) sein kann. Daher sollte es meiner Meinung nach $praef[$datum]
heißen!
Vergleiche selbst:
$praef[datum]
$praef[$datum]
Liebe Grüße aus Ellwangen,
Felix Riesterer.
echo $begrüßung;
ich bin mir mit diesem "datum" bei
$praef[datum]
immer noch nicht sicher! Ich vermisse da ein Dollar-Zeichen, da "datum" keine Konstante (Variablennamen _ohne_ Dollarzeichen) sein kann. Daher sollte es meiner Meinung nach$praef[$datum]
heißen!
Wie wäre es mit einem einfachen String $praef['datum']?
Die "Konstantenschreibweise" ist eine, die schon lange nicht mehr gebilligt wird, von Anfängern gern verwendet wird und einfach nicht totzukriegen ist. Vergleiche: Array do's and don'ts - Why is $foo[bar wrong?]
echo "$verabschiedung $name";
Hallo dedlfix.
Vergleiche: Array do's and don'ts - Why is $foo[bar] wrong?
Du solltest das erste „]“ maskieren.
Einen schönen Montag noch.
Gruß, Ashura