PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Optionschalter in PHP MYSQL


denis_89er
17.02.2008, 14:14:01
Hallo, ich erstelle gerade ein Quiz in PHP mit Dreamweaver. Zuerst wählt man die entsprechende Kategorie aus und dann gebe ich die Fragen aus und zu jeder Frage gibt es mehrere Antwortmöglichkeiten. Diese kann man mit Optionsschaltern/Radiobuttons auswählen. Frage, Antwort, Kateogrie und Antwortmöglichkeiten sind in einer MYSQL-Datebank gespeichert. Das Problem ist das die Frage so oft erscheint, wie viele Antwortmöglichkeiten es gibt. Kann mir einer helfen? Vielen Dank!

<?
if(isset($_GET['kategorieNr'])) {
$sql= "SELECT fragentext, antworttext FROM tblfragen, tblantworten WHERE tblfragen.frageNr=tblantworten.frageNr ORDER BY tblfragen.frageNr";
if($_GET['kategorieNr']!="alle") {
$sql="SELECT fragentext, antworttext FROM tblfragen, tblantworten WHERE tblfragen.frageNr=tblantworten.frageNr AND kategorieNr=".$_GET['kategorieNr'];
}

?>
<table border="1">
<?
$res= mysql_query($sql) or die("Fehler in SQL");
while($row=mysql_fetch_assoc($res)) {
?>
<tr>
<td><? echo $row['fragentext'];?></td>
</tr>
<tr>
<td>
<input type="radio" name="antwortNr" value="antwortNr"/><? echo $row['antworttext'];?>
</td>
</tr>
<?
}
?>
</table>
<?
}
?>

Heinrich
17.02.2008, 22:02:31
Zwingt dich doch keiner, die Frage in der gleichen Schleife auszulesen.

denis_89er
17.02.2008, 22:19:58
Zwingt dich doch keiner, die Frage in der gleichen Schleife auszulesen.
Ja klar zwingt mich keiner, aber hättest du eine andere Idee? Sollte ich vielleicht zwei Schleifen machen? Wie würdest du vorgehen?

|Coding
18.02.2008, 13:44:08
Hi!

wenn ich alles korrekt verstanden habe, dann könntest Du Dir so Abhilfe schaffen:

<?
if(isset($_GET['kategorieNr'])) {
$sql= "SELECT fragentext, antworttext FROM tblfragen, tblantworten WHERE tblfragen.frageNr=tblantworten.frageNr ORDER BY tblfragen.frageNr";
if($_GET['kategorieNr']!="alle") {
$sql="SELECT fragentext, antworttext FROM tblfragen, tblantworten WHERE tblfragen.frageNr=tblantworten.frageNr AND kategorieNr=".$_GET['kategorieNr'];
}

?>
<table border="1">
<?
$res= mysql_query($sql) or die("Fehler in SQL");

$firstRun = TRUE; // Nach dem 1. Schleifendurchlauf wird die Variable auf FALSE gesetzt.
while($row=mysql_fetch_assoc($res)) {
?>
<tr>
<td><?
if ( $firstRun )
{
// Ist es der 1. Schleifendurchlauf, dann die Frage
// ausgeben und $firstRun auf FALSE setzen.
echo $row['fragentext'];
$firstRun = FALSE;
}
else
{
// Andernfalls, einfach ein maskiertes Leerzeichen ausgeben.
echo '&nbsp;';
}
?></td>
</tr>
<tr>
<td>
<input type="radio" name="antwortNr" value="antwortNr"/><? echo $row['antworttext'];?>
</td>
</tr>
<?
}
?>
</table>
<?
}
?>

Nur noch eine kleine Anmerkung:

Es ist immer Besser wenn Du nicht mit Shorttags arbeitest sonder mit den regulären PHP-Anfangstags, weil das jenach Serverkonfiguration zu unerwartetem Verhalten führt. Also besser '<?php' statt '<?'.

denis_89er
18.02.2008, 18:48:01
Danke für deine Bemühungen, aber es klappt immer noch nicht. Jetzt wird nur die erste Frage angezeigt und alle Antworten aus der ganzen DB.

|Coding
18.02.2008, 19:15:59
Sorry, da hatte ich gepennt :-)

So dürfte es jetzt aber passen...

<?php
if(isset($_GET['kategorieNr'])) {
$sql= "SELECT fragentext, antworttext FROM tblfragen, tblantworten WHERE tblfragen.frageNr=tblantworten.frageNr ORDER BY tblfragen.frageNr";
if($_GET['kategorieNr']!="alle") {
$sql="SELECT fragentext, antworttext FROM tblfragen, tblantworten WHERE tblfragen.frageNr=tblantworten.frageNr AND kategorieNr=".$_GET['kategorieNr'];
}

?>
<table border="1">
<?php
$res= mysql_query($sql) or die("Fehler in SQL");

$firstQuest = '';
while($row=mysql_fetch_assoc($res)) {
?>
<tr>
<td><?php
if ( $firstQuest == $row['fragentext']; )
{
echo '&nbsp;';
}
else
{
$firstQuest = $row['fragentext'];
echo $row['fragentext'];
}
?></td>
</tr>
<tr>
<td>
<input type="radio" name="antwortNr" value="antwortNr"/><? echo $row['antworttext'];?>
</td>
</tr>
<?php
}
?>
</table>
<?php
}
?>

denis_89er
18.02.2008, 20:15:52
Danke vielmals es funktioniert!!

Mein Problem ist jetzt, dass ich von allen Radiobuttons, nur einen anklicken kann. Wenn ich bei einer Frage einen anklicke und dann bei der nächsten, wird der vorherige wieder deaktiviert.

Heinrich
18.02.2008, 21:35:06
Meine Rede, arbeite alles hübsch getrennt ab, auch wenn dann bisserl mehr Code steht.

Zu den radio-Feldern: Ich sehe bei dir (und bei Coding) nirgends
<form action=.....>
//dann die radio-Felder
// dann einen Submit-Button
</form>
Wenn du das pro Frage (plus Antwortmöglichkeiten machst, ist dein Prob behoben. Dann nur noch - wo sollen denn die Ergebnisse des Optierens hin?

|Coding
18.02.2008, 22:07:02
<?php
if(isset($_GET['kategorieNr'])) {
$sql= "SELECT frageNr, fragentext, antworttext FROM tblfragen, tblantworten WHERE tblfragen.frageNr=tblantworten.frageNr ORDER BY tblfragen.frageNr";
if($_GET['kategorieNr']!="alle") {
$sql="SELECT frageNr, fragentext, antworttext FROM tblfragen, tblantworten WHERE tblfragen.frageNr=tblantworten.frageNr AND kategorieNr=".$_GET['kategorieNr'];
}

?>
<table border="1">
<?php
$res= mysql_query($sql) or die("Fehler in SQL");

$firstQuest = '';
while($row=mysql_fetch_assoc($res)) {
?>
<tr>
<td><?php
if ( $firstQuest == $row['fragentext']; )
{
echo '&nbsp;';
}
else
{
$firstQuest = $row['fragentext'];
echo $row['fragentext'];
}
?></td>
</tr>
<tr>
<td>
<input type="radio" name="frage<?PHP echo $row['frageNr'];?>"
value="<? echo $row['antworttext'];?>"/><? echo $row['antworttext'];?>
</td>
</tr>
<?php
}
?>
</table>
<?php
}
?>

Ich habe in das SELECT-Statement die Spalte "frageNr" noch hinzugefügt und Unten "name" bzw. "value" vom radio-Button angepasst. Wenn du jetzt in die Datei, an die das Formular geschickt, wird ein "print_r ( $_POST );" rein schreibst, dann siehst Du wie die radio-Gruppen jetzt heißen und wie die Antwort zu jeder Frage ist.

Du solltest Dir auch mal, bezüglich Deines SQL-Query, die Funktion mysql_real_escape_string (http://php.net/mysql_real_escape_string) ansehen, denn es ist eine Totsünde, wenn man in seinem SQL-Query, von Außen kommende Variablen, ungeschützt einbindet.

|Coding
18.02.2008, 22:11:59
...Zu den radio-Feldern: Ich sehe bei dir (und bei Coding) nirgends
<form action=.....>
//dann die radio-Felder
// dann einen Submit-Button
</form>...
Er hat sicher nicht den kompletten Code gepostet...

...Wenn du das pro Frage (plus Antwortmöglichkeiten machst...Ich verstehe nicht was Du damit meinst... Was pro Frage? Etwa ein Formular?

Heinrich
18.02.2008, 23:17:27
@Coding

Na, irgendein Form-Tag wird er wohl brauchen. Oder zu was sollen denn die radio-Felder dienen? Die braucht man doch, um irgendwas irgendwo hin zu schicken....

Eine Möglichkeit ist, für jede Frage ein Formular zu machen (ist aber wahrscheinlich nicht sinnvoll).

Da gibt's noch eine andere Möglichkeit (ein Tag), um das Problem zu umgehen, dass die radios aller Antworten (auf alle Fragen) in einem Formular nur alternativ anklickbar sind. Mir fällt's bloß gerade nicht ein....

|Coding
19.02.2008, 01:01:44
...Na, irgendein Form-Tag wird er wohl brauchen...
Bingo, das wir er wohl auch haben, hat er nur bestimmt nicht mit gepostet. Ist ja auch egal wie das form-Tag aussieht (bezüglich der Attribute).

BTW: radio-Buttons gruppiert man an Hand der Bezeichnung (name="gruppe").

denis_89er
19.02.2008, 17:00:44
Danke an euch beide, ihr habt mir sehr geholfen.
Das mit dem Formular muss ich mir noch näher anschauen.

|Coding
19.02.2008, 17:44:37
...ihr habt mir sehr geholfen...
Immer wieder gern :-)

denis_89er
21.02.2008, 17:11:35
Hallo.
Mein Formular für den Test ist jetzt fertig. Wenn ich auf den submit-button klicke, soll in meiner MYSQL DB die auswertung erfolgen. Dazu habe ich zwei wichtige Tabellen:
1. tblergebnisse(ergebnisnr, erreichte punkte, maximalpunkte, note)
2. tblbeurteilung(beurteilungsnr, untergrenze, obergrenze, note)
(Untergrenze und Obergrene sind die Prozent zB 0%-50% =5)

In der tblfragen ist ein Feld "punkte", wo drinnen steht 0 oder 1 bzw. falsch oder richtig. Wie mache ich, dass PHP die Punkte zusammenzählt und in die Tabelle schreibt.

|Coding
21.02.2008, 17:59:28
Hi!

mit "...SUM(`spalten_name`)..." kannst Du die Werte einer Spalte aufsummieren.

denis_89er
21.02.2008, 18:25:27
mit "...SUM(`spalten_name`)..." kannst Du die Werte einer Spalte aufsummieren

Ja, aber ich möchte die Punkte schon in PHP zusammenzählen und dann die erreichten Punkte in die Tabelle schreiben.

|Coding
21.02.2008, 19:05:37
Hi!

Wo liegt das Problem denn genau, beim in die Datenbank Schreiben oder beim Zusammenzählen.

denis_89er
21.02.2008, 19:18:04
Wo liegt das Problem denn genau, beim in die Datenbank Schreiben oder beim Zusammenzählen.
Das Problem liegt bei beiden.

|Coding
21.02.2008, 21:23:24
Hi!

Ok, also das mit dem Zählen ist jetzt nicht so einfach zu erklären/zeigen, weil ich nicht weis, was Du zählen willst oder besser gesagt wo Du zählen willst.

Das Schreiben in die Datenbank ist recht simpel:

Wenn es ein neuer Datensatz sein soll, dann geht das per:
INSERT INTO
`tabelle`
VALUES(
'wert_für_spalte_1',
'wert_für_spalte_2',
'wert_für_s...',
'wert...',
'...'
)


Wenn ein vorhandener Datensatz aktuallisiert werden soll, dann geht das so:
UPDATE
`tabelle`
SET
`spalte1` = 'wert',
`spalte2` = 'wert'
WHERE
`spalte` = 'betreffende_zeile'