Eingabe mit Datenbank vergleichen

Nivek99

Joker !
Hallo,

Ich muss ein Seite aufbauen und habe da einige Probleme:
In meine Seite soll man Vokabeln lernen können.
Zu Wissen: Es gibt mehrer Texte, also enthält meine Seite eine Dropdown-Feld wo alle Texte aufgelistet sind. Nachdem man einen Text ausgewählt hat, werden auf der Seite10 vom Computer zufällig ausgewählte Vokabeln in einer Tabelle angezeigt. Jede Zeile der Tabelle enthält ein Label mit einen enstprechenden Vokabel und ein Texteingabefeld in welche man die Erklärung des Vokabels eingeben muss. Bis da funktioniert alles bei mir.

Am Schluss werden 2 Buttons angezeigt: "Button Check" und "Button Next"

Button Check: Nach drücken werden falsche Eingaben rot markiert (also die Farbe des Randes wird rot gemalt) und die Anzahl richtiger Eingaben angegeben.
Also in klein und dick: Der Button überprüft ob man die richtige Erklärung angegeben hat indem er unsere Erklärung mit der in den Datenbank eingegebene Erklärung vergleicht. Ist unsere Erklärung falsch, färbt sich das Rand rot an wo die falsche Erklärungen eingegeben wurden. Am Ende wird dann schließlich die Anzahl der richitgen Eingaben angegeben.

Button Next: Nach drücken wird eine neue Serie von 10 Vokabeln angefordert.

Kann mir also jemand beim programmieren dieser 2 Buttons hilfen ?

Vielen Dank

Mein Code:
PHP:
<body>
<h1>Vocabulary Trainer</h1>
Text selection
  <form action='index.php' method='post' name='text' > 	
	<select name="text" size="1"  onchange="text.form.submit();">
		<option selected <?php if ($_POST['text'] == 'All') print 'selected '; ?> value="All">All</option>
		<option <?php if ($_POST['text'] == 'Ironman') print 'selected '; ?> value="Ironman">Ironman</option>
		<option <?php if ($_POST['text'] == 'Coincidence') print 'selected '; ?> value="Coincidence">Coincidence</option>
		<option <?php if ($_POST['text'] == 'Memory') print 'selected '; ?> value="Memory">Memory</option>
		<option <?php if ($_POST['text'] == 'Sentenced to Death') print 'selected '; ?> value="Sentenced to Death">Sentenced to Death</option>
		<option <?php if ($_POST['text'] == 'Lizardman Leaps Into US Folklore') print 'selected '; ?> value="Lizardman Leaps Into US Folklore">Lizardman Leaps Into US Folklore</option>
		<option <?php if ($_POST['text'] == 'A Thief’s Lucky Day') print 'selected '; ?> value="A Thief’s Lucky Day">A Thief’s Lucky Day</option>
	</select>
  </form>
	<hr />	
	
<?php
  require_once('verbvars.php');
  $value = $_POST['text'];
  // Mit Datenbank verbinden 
  $db = mysqli_connect(DB_HOST, DB_BENUTZER, DB_PASSWORT, DB_NAME); 
  mysqli_set_charset($db, "utf8"); 

  if ($value == "All") {
    $sql = "SELECT * FROM vokabel_liste ORDER BY RAND() LIMIT 10";}
	else {
		$sql = "SELECT * FROM vokabel_liste WHERE text = '$value' ORDER BY RAND() LIMIT 10";}
  $daten = mysqli_query($db, $sql);

  // Die Daten durchlaufen und als HTML formatieren
  echo '<table border="1">';
  while ($zeile = mysqli_fetch_array($daten)) { 
    echo '<tr><td class="eintrag"><span class="id">' . $zeile['id'] . '</span></td>';
	echo '<td>' . $zeile['vokabel'] . '</td>';
	echo '<td><input name="eingabe" type="text" size="30"></td>';
	echo '</td>';
  }
  echo '</table>';
 
  mysqli_close($db);
?>

  <form action='index.php' method='post'>
    <input type="submit" value="Check" name="submit" />
    <input type="submit" value="Next" name="submit" />
  </form>
</body>

Ich für den Check-Button das probiert:
PHP:
<script type="text/javascript">
	function Check() {  
	var eingabe = document.getElementById("eingabe").value;  
	var erklaerung = ($sql = SELECT erklaerung FROM vokabel_liste WHERE id = "id");

	if(eingabe == erklaerung) {  
	alert("Richtige Erklärung");
	}  
	else {  
	alert("Falsche Erklärung");
	}  
	}
</script>

Natürlich, funktioniert's nicht. :/
 
Java:
<script type="text/javascript">
    function Check() {  
    var eingabe = document.getElementById("eingabe").value;  
    var erklaerung = ($sql = SELECT erklaerung FROM vokabel_liste WHERE id = "id");

    if(eingabe == erklaerung) {  
    alert("Richtige Erklärung");
    }  
    else {  
    alert("Falsche Erklärung");
    }  
    }
</script>
Das ist Javascript und läuft auf Browserseitig. Du kannst von da nicht einfach auf die DB zugreifen

Willst du das ganze mit Ajax lösen? Oder warum Javascript?

Wenn ja, dann rauchst du eine PHP-Seite welche die Eingaben empfängt, mit der DB vergleicht und das Resultat zurückgibt.

Nachtrag: Du solltest in deiner Ausgabe den tr-Tag schliessen.
 
Ah ? Wusse ich nicht.

Warum Javascript ? Keine Ahnung, es scheinte mir als die einfachste Art und Weise zu sein.
Ich habe schon von Ajax gehört, bin aber nur ein kleiner Anfänger, weiß also nicht wirklich um was es handelt.
 
Machs einfach mit Javascript...

Wenn du die Vokabeln / den Text ausgibst, bzw. die Felder für die Vokabeln, speicher da die Lösung für die Vokabeln in eine Variable (Javascript) und später prüfst du, ob der Inhalt des Textfelds mit der Variable übereinstimmt.
Wenn du es noch halbwegs schlau lösen willst, bau eine Verschlüsselung ein... Sonst können "schlaue Köpfe" die Lösung nachschlagen.
 
Wenn ja, dann rauchst du eine PHP-Seite welche die Eingaben empfängt, mit der DB vergleicht und das Resultat zurückgibt.

Nachtrag: Du solltest in deiner Ausgabe den tr-Tag schliessen.

Ich kenn mich mit Ajax nicht aus. Geht's vielleicht nicht einfacher ? :/

Danke für die Fehlerbehebung. :)


Machs einfach mit Javascript...

Wenn du die Vokabeln / den Text ausgibst, bzw. die Felder für die Vokabeln, speicher da die Lösung für die Vokabeln in eine Variable (Javascript) und später prüfst du, ob der Inhalt des Textfelds mit der Variable übereinstimmt.
Wenn du es noch halbwegs schlau lösen willst, bau eine Verschlüsselung ein... Sonst können "schlaue Köpfe" die Lösung nachschlagen.

Ich versteh was du meinst, scheint eine gute Lösung zu sein !
Ich habe mal da versucht die Erklärung aus der DB in eine Variable zu speichern, aber es scheint nicht zu funktionieren.

PHP:
var erklaerung = ($sql = SELECT erklaerung FROM vokabel_liste WHERE id = "id");

Übrigends hir ist die aktuelle Seite:
http://mizar.lte.lu/~jeske175/Help/index.php
 
Zuletzt bearbeitet:
Du kannst mit Java nicht auf die DB zugreifen.
Du kannst mit PHP ein Javscript generieren.

Aber rein mit PHP gehts auch. Es lädt einfach die Seite jedes mal neu

Der folgende Test lief bei mir problemlos durch. Schau ab was da geht und versuche es zu verstehen. Ansonsten frag was du nicht verstehst
PHP:
<body>
<h1>Vocabulary Trainer</h1>
Text selection
  <form action='' method='post' name='text' >     
    <select name="text" size="1"  onchange="text.form.submit();">
        <option selected <?php if ($_POST['text'] == 'All') print 'selected '; ?> value="All">All</option>
        <option <?php if ($_POST['text'] == 'Ironman') print 'selected '; ?> value="Ironman">Ironman</option>
        <option <?php if ($_POST['text'] == 'Coincidence') print 'selected '; ?> value="Coincidence">Coincidence</option>
        <option <?php if ($_POST['text'] == 'Memory') print 'selected '; ?> value="Memory">Memory</option>
    </select>
  </form>
    <hr />   
    
     <form action='' method='post'>
        <table border="1">
        
<?php
//Simuliere die DB-Abfrage
$data[] = array('id' => 1, 'text' => 'Ironman', 'vokabel' => 'abc', 'erklaerung' => 'ABC');
$data[] = array('id' => 2, 'text' => 'Ironman', 'vokabel' => 'def', 'erklaerung' => 'DEF');
$data[] = array('id' => 3, 'text' => 'Coincidence', 'vokabel' => 'ghi', 'erklaerung' => 'GHI');
$data[] = array('id' => 4, 'text' => 'Coincidence', 'vokabel' => 'jkl', 'erklaerung' => 'JKL');
$data[] = array('id' => 5, 'text' => 'Coincidence', 'vokabel' => 'mno', 'erklaerung' => 'MNO');
$data[] = array('id' => 6, 'text' => 'Memory', 'vokabel' => 'pqr', 'erklaerung' => 'PQR');

//Dieser Teil ist bei dir im WHERE -Teil des SQLs 
if($_POST['text'] != 'All'){
    $data = array_filter($data, create_function('$item', "return (\$item['text'] === '{$_POST['text']}');"));
}

//Erstelle in verstekctes Feld mit dem Text. Dmit idese Info beim neu laden nicht verloren geht
echo "<input type='hidden' value='{$_POST['text']}' name='text' />\n";

//Anstelle von foreach kommt bei dir hier der while-Block.  
//while ($zeile = mysqli_fetch_array($daten)) {  
foreach($data as $zeile){
    //Überprüfen ob die Eingabe richtig ist.
    $richtig = ($zeile['erklaerung'] == $_POST['eingabe'][$zeile['id']]) ? 'Richtig' : '';
    //Zeile generieren:
    // - Der Name muss ein Array sein damit du nachher alle Eingaben auslesen kannst
    // - Der Input-Tag habe ich noch um vlaue ersetzt, damit die Eingabe erneut vergelegt wird
    // - Ich habe hier einfach nur ein weiteres Feld gemacht in dem 'Richtig' angezeigt wird wenns stimmt 
    echo <<<HTML
        <tr>
            <td class='eintrag'><span class='id'>{$zeile['id']}</span></td>
            <td>{$zeile['vokabel']}</td>
            <td><input name='eingabe[{$zeile['id']}]' type='text' size='30' value='{$_POST['eingabe'][$zeile['id']]}'></td>
            <td>{$richtig}</td>
        </tr>
HTML;
}
?>

    </table>
    <input type="submit" value="Check" name="submit" />
    <input type="submit" value="Next" name="submit" />
  </form>
</body>
 
Du kannst mit Java nicht auf die DB zugreifen.
Du meinst wohl JavaScript ;)

Es geht darum, dass JavaScript clientseitig abläuft, wohingegen PHP serverseitig ausgeführt wird. Und die Datenbank ist nunmal auf dem Server.

Und bitte maskiere alle möglichen gefährlichen Zeichen von $_POST['text'] bevor du diese in das MySQL-Query einfügst:
PHP:
$text = mysql_real_escape_string($_POST['text']);
Bei der Ausgabe würde auch noch ein [phpf]htmlentities[/phpf] empfehlen, sofern du dir nicht 100% sicher bist, dass die vokabel-Daten nie HTML enthalten (werden):
PHP:
echo '<td>' . htmlentities($zeile['vokabel']) . '</td>';
 
@Yaslaw
Ich habe da zimlich gar nichts verstanden. Wie gesagt, ich bin ein Anfänger. PHP ist nicht ganz mein Ding.

Soll das, der ganze Code sein ? Wie kann ich ihn mal ausprobieren ?
Könntest du vielleicht mithilfe meinen Code, den Check-Button ohne viele Änderungen zu machen, programmieren oder mal erklären wenn es zu lange dauert ?
Denn ich sehe bei deinen Code ganz schwarz. :/
----------------------------
 
Zuletzt bearbeitet:
Und bitte maskiere alle möglichen gefährlichen Zeichen von $_POST['text'] bevor du diese in das MySQL-Query einfügst:
PHP:
$text = mysql_real_escape_string($_POST['text']);
Bei der Ausgabe würde auch noch ein [phpf]htmlentities[/phpf] empfehlen, sofern du dir nicht 100% sicher bist, dass die vokabel-Daten nie HTML enthalten (werden):
PHP:
echo '<td>' . htmlentities($zeile['vokabel']) . '</td>';

Ist das für mich ?

Wenn ja, dann habe ich gar nichts verstanden. :confused:

Meine Seite soll nicht eine offizielle Seite werden. Ist "nur" ein Schulprojekt. Ich habe da ein paar Monate PHP in der Schule gelernt, jetzt soll ich diese Seite erstellen. Ich habe z.B. niemals von Ajax in der Schulunterricht gehört, sondern einbisschen im Internet während ich nach Hilfe suchte.
 
item: Jepp, das ist der ganze Code

item: Ausprobieren: Copy&Paste in eine Datei und diese ausprobieren

item: Nope, ich mach dir deinen Code nicht fertig

Also, vergleich mal mein Beispiel mit deinem. Es hat in meinem einen Teil den ich zu Testzwecken gesetzt habe. Aber das steht da ja als Kommentar drin. Da geht es nur darum, dass ich zum Test keine DB eingebunden habe sondern die Daten direkt im Script habe. Dort musst du dein DB-Aufruf so machen wie du ihn bereits hast.

Und den Rest habe ich im Code bereits erläutert. Frag genauer was du darin nicht verstehst. Ich habe keine Lust meinen Code jetzt ein zweites mal komplett zu beschreiben, da ich dies bereits getan hab. Also frag nach Details die du nicht verstehst und mittels Doku von php.net nicht nachvollziehen kannst.


Was für dich ev. ungewohnt erscheint, ist der abschnitt echo <<<HTML....HTML; und die {} darin.
Der Vrteil daran, man kann sauberen HTML-Code schreiben ohne jede Zeile mit echo zu beginnen und dauernd den String mit Punkten zusammenzusetzen
Dazu kann ich dir diese 2 Seiten der PHP-Daku nahelegen
a) Die komische <<<HTML...HTML: Heredoc-Syntax
b) Und der Teil über die {} Complex (Curly) Syntax
 
Zurück