# Eingabe mit Datenbank vergleichen



## Nivek99 (21. Februar 2012)

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:

```
<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:

```
<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. :/


----------



## Yaslaw (21. Februar 2012)

```
<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.


----------



## Nivek99 (21. Februar 2012)

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.


----------



## Lime (21. Februar 2012)

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.


----------



## Nivek99 (21. Februar 2012)

> 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. 




Lime hat gesagt.:


> 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.


```
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


----------



## Yaslaw (21. Februar 2012)

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

```
<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>
```


----------



## ComFreek (21. Februar 2012)

> 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:

```
$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):

```
echo '<td>' . htmlentities($zeile['vokabel']) . '</td>';
```


----------



## Nivek99 (21. Februar 2012)

@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. :/
----------------------------


----------



## Nivek99 (21. Februar 2012)

ComFreek hat gesagt.:


> Und bitte maskiere alle möglichen gefährlichen Zeichen von $_POST['text'] bevor du diese in das MySQL-Query einfügst:
> 
> ```
> $text = mysql_real_escape_string($_POST['text']);
> ...



Ist das für mich ?

Wenn ja, dann habe ich gar nichts verstanden. 

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.


----------



## Yaslaw (21. Februar 2012)

*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


----------



## Nivek99 (21. Februar 2012)

Yaslaw hat gesagt.:


> *item: *Jepp, das ist der ganze Code
> 
> *item: *Ausprobieren: Copy&Paste in eine Datei und diese ausprobieren
> 
> ...



*Item: *Da fehlt aber ein paar Dinge, oder vielleicht hast du es weggelassen um deine Tests auszuführen. Denn du hast nur 3 verschiedene Texts im Auswahl.

*Item: *Habe ich gemacht, funktioniert aber nicht. Ich bekomme diese Fehlemeldung wenn ich meine gesamte Code mit deiner vertausche:


> Warning: Unknown: failed to open stream: Permission denied in Unknown on line 0
> 
> Fatal error: Unknown: Failed opening required '/home/t2if/jeske175/public_html/Help/index2.php' (include_path='.:/usr/share/php:/usr/share/pear') in Unknown on line 0




Ok, sprichst du von dieser Teil "//Simuliere die DB-Abfrage" ? Diese hab ich gar nicht verstanden. Soll ich dieser dann mit meiner DB-Aufruf tauschen ?


```
//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']}');"));
}
```
Hab ich nicht verstanden.


```
//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";
```
Ok, aber wenn die Seite neu geladen werden soll, dann werden ja neue Vokabeln augelistet oder nicht ?



> Was für dich ev. ungewohnt erscheint, ist der abschnitt echo <<<HTML....HTML;


Ja, das war mir ungewohnt, aber ich habe es schon so verstanden, ist ja logisch, dass es die echo's ersetzt. 


Ich habe keine Ahnung was ich damit machen soll, aber naja. Danke, dass ihr alle angewortet habt.


----------



## ComFreek (21. Februar 2012)

Nivek99 hat gesagt.:


> Ist das für mich ?
> 
> Wenn ja, dann habe ich gar nichts verstanden.
> 
> 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.



Ja, das war für dich 
Kurze Erklärung:

Du hast z.B. folgendes Query:

```
SELECT * FROM myTable WHERE text='abc'
```
In PHP ersetzt du 'abc' durch $_GET['text'], also durch Daten von der URL abhängen bzw. vom Nutzer verändert werden können:

```
$sql = "SELECT * FROM myTable WHERE text='".$_GET['text']."'";
```
Normalerweise sieht das Query am Ende so aus:

```
SELECT * FROM myTable WHERE text='hallo'
```
Man kann aber den Parameter _text_ aber auch gezielt verändern:

```
script.php?text='; DROP TABLE myTable
```
Und das Query würde dann so aussehen:

```
SELECT * FROM myTable WHERE text=''; DROP TABLE myTable
```
Und deine Tabelle wäre weg. Es gibt allerdings noch viel mehr Möglichkeiten!​

Ob du es anwendest, musst du entscheiden.
Auf der einen Seite ist es nur ein Schulprojekt, d.h. solange du es nicht online stellst und du es nur präsentiert, passiert nichts großartiges. Wobei das Query oben im Beispiel schon scheitert, wenn der Benutzer im Suchfeld (bzw. für text) u.a. ein einfaches Anführungszeichen verwendet!

Auf der anderen Seiten könntest du natürlich bei deinem Lehrer etwas damit angeben


----------



## Nivek99 (21. Februar 2012)

Ok ok. 
Ist immer gut zu wissen. ^^


----------



## Yaslaw (21. Februar 2012)

> Item: Da fehlt aber ein paar Dinge, oder vielleicht hast du es weggelassen um deine Tests auszuführen. Denn du hast nur 3 verschiedene Texts im Auswahl.


Jepp. Meins ist ja nur ein Beispiel mit Beispieldaten



> Fatal error: Unknown: Failed opening required '/home/t2if/jeske175/public_html/Help/index2.php' (include_path='.:/usr/share/php:/usr/share/pear') in Unknown on line 0


Keine Ahnung was das für ein Fehler ist. Ich habe kein required() in meinem Beispiel. Irgendwas mit irgendwelchen Berechtigungen auf deinem Server scheint das Problem zu sein - das hat jedoch mMn nix mit dem Code zu tun, da sonst ganz andere Fehlermeldungen erscheinen würden.



> Ok, sprichst du von dieser Teil "//Simuliere die DB-Abfrage" ? Diese hab ich gar nicht verstanden. Soll ich dieser dann mit meiner DB-Aufruf tauschen ?


Jepp.



> ```
> //Erstelle in verstecktes Feld mit dem Text. Damit diese Info beim neu laden nicht verloren geht
> echo "<input type='hidden' value='{$_POST['text']}' name='text' />\n";
> ```
> Ok, aber wenn die Seite neu geladen werden soll, dann werden ja neue Vokabeln augelistet oder nicht ?


Gut, ich werte in meinem Beispiel noch nicht unterschiedlich zwischen <next> und <check>. Ich habe mal nur den <check> implementiert. Beim <next> müssen natürlich die Felder nicht neu übergeben werden und auch der hidden-Tag kann man dann weglassen.


----------

