gePOSTeten Variablenwert in MySQL Select Abfrage übernehmen
Lammy
- datenbank
0 Jens0 Lammy
0 Thomas Luethi0 Thomas Luethi0 Lammy
0 AlexBausW
Folgendes Problem:
Ich habe eine Spielesammlung in einer MySQL-Datenbank mit den Tabellen "spiele" und "kategorien". In der Tabelle "spiele" sind Titel und Beschreibung in der Tabelle 'kategorien', die jeweiligen Kategorien abgespeichert.
Jetzt möchte ich über ein Formular eine Abfrage starten, z.B. alle Spiele der Kategorie "Energie" ausgeben.Die Kategoriebezeichnung soll über $_POST[kategorie] an die MySQL-Abfrage übergeben werden. Leider funktioniert das nicht.
Wenn ich den Kategorienamen, direkt eingebe also Kategorie="Energie" klappt es. Was ist falsch bzw. wie übernehme ich den geposteten Variablenwert in die Abfrage?
Hier der relevante Teil des Codes:
Formular:
<form action="improspiele.php" method="POST">
<table>
<tr>
<td>
<select name="kategorie" size="3">
<option value="Dissoziation">Dissoziation</option>
<option value="Emotion">Emotion</option>
<option value="Energie">Energie</option>
<option value="Erzählen">Erzählen</option>
</select>
</td>
</tr>
<tr>
<td>
<input type=submit name="submit" value="Anzeigen">
</td>
</tr>
</table>
</form>
php-Skript:
<?php
$res=$_POST[kategorie];
$ergebnis = mysql_query ('select spiele.SplNr, Titel, Beschreibung, Kategorie from spiele, kategorien where spiele.SplNr=kategorien.SplNr and Kategorie =$_POST[kategorie]');
$anzahl=mysql_num_rows($ergebnis);
echo "<p>Es sind $anzahl Einträge in der Kategorie $res vorhanden</p>";
$zaehler=0;
echo "<table align="left" border="0" style="color:darkblue; font-weight:500; font-size:10pt" cellspacing="2" cellpadding="2">";
while ($zaehler<=$anzahl && $datenArray = mysql_fetch_array($ergebnis)) {
$Titel=$datenArray['Titel'];
$Beschreibung=$datenArray['Beschreibung'];
$zaehler++;
echo "<tr><td align="right">$zaehler.)</td> <td><strong>$Titel</strong></td></tr>";
echo "<tr><td> </td><td>$Beschreibung</td></tr>";
}
echo "</table>";
?>
versuche mal statt
$_POST[kategorie]
'.$_POST[kategorie].'
zu schreiben
versuche mal statt
$_POST[kategorie]
'.$_POST[kategorie].'
zu schreiben
klappt leider auch nicht und gibt nur folgende Fehlermeldung:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource
Es sind Einträge in der Kategorie Energie vorhanden
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource
d.h. er erkennt die Kategorie nicht.
aber trotzdem Danke ;-).
Hallo,
$ergebnis = mysql_query ('select spiele.SplNr, Titel, Beschreibung, Kategorie from spiele, kategorien where spiele.SplNr=kategorien.SplNr and Kategorie =$_POST[kategorie]');
Setze die Query in einer eigenen Variable zusammen, bevor Du sie
in mysql_query() verwendest, und lass sie Dir mal anzeigen.
Lass Dir auch die MySQL-Fehlermeldung anzeigen.
$sql='select spiele.SplNr, Titel, Beschreibung, Kategorie from spiele, kategorien where spiele.SplNr=kategorien.SplNr and Kategorie =$_POST[kategorie]';
echo "Die Query lautet: $sql";
$ergebnis = mysql_query ($sql);
if (!$ergebnis)
{ echo "DB-Fehler: ".mysql_error(); }
Auf den ersten Blick sehe ich zwei moegliche Fehlerquellen:
1. Zwischen einfachen Anfuehrungzeichen werden keine Variablen ersetzt (PHP).
2. String-Werte muessen in einfachen Anfuehrungszeichen stehen (MySQL).
http://www.php.net/manual/de/language.types.string.php bzw.
http://www.php.net/manual/en/language.types.string.php (mehr Beispiele)
Versuch mal folgendes:
$sql="select spiele.SplNr, Titel, Beschreibung, Kategorie from spiele, kategorien where spiele.SplNr=kategorien.SplNr and Kategorie ='$_POST[kategorie]'";
Alternative Schreibweisen:
$sql="select spiele.SplNr, Titel, Beschreibung, Kategorie from spiele, kategorien where spiele.SplNr=kategorien.SplNr and Kategorie ='{$_POST['kategorie']}'";
$sql='select spiele.SplNr, Titel, Beschreibung, Kategorie from spiele, kategorien where spiele.SplNr=kategorien.SplNr and Kategorie =''.$_POST['kategorie'].'';
u.s.w.
Gruesse,
Thomas
Hallo,
$sql='select spiele.SplNr, Titel, Beschreibung, Kategorie from spiele, kategorien where spiele.SplNr=kategorien.SplNr and Kategorie =''.$_POST['kategorie'].'';
oops, muss am Schluss heissen:
$sql='select ...and Kategorie =''.$_POST['kategorie'].''';
Sorry + Gruesse,
Thomas
Hallo Thomas,
Auf den ersten Blick sehe ich zwei moegliche Fehlerquellen:
- Zwischen einfachen Anfuehrungzeichen werden keine Variablen ersetzt (PHP).
- String-Werte muessen in einfachen Anfuehrungszeichen stehen (MySQL).
danke für die schnelle Hilfe.
Es ist in der Tat ein Problem der Anführungszeichen, denn so funktioniert es:
$ergebnis = mysql_query ("select spiele.SplNr, Titel, Beschreibung, Kategorie from spiele, kategorien where spiele.SplNr=kategorien.SplNr and Kategorie ='$_POST[kategorie]'");
Gruß
Lammy
Hallo Lammy,
[...}
<?php
$res=$_POST[kategorie];
Zeichenketten schreibt man, auch wenn sie als Index eines assoziativen Arrays dienen, immer in Anführungsstrichen.
$ergebnis = mysql_query ('select spiele.SplNr, Titel, Beschreibung, Kategorie from spiele, kategorien where spiele.SplNr=kategorien.SplNr and Kategorie =$_POST[kategorie]');
Schreib mal Dein Statement in eine Variable und gib diese aus. Dann siehst Du, warum ein Datenbankanfrage damit keinen gültigen Wert zurückliefern kann:
$sql = 'select spiele.SplNr, Titel, Beschreibung, Kategorie from spiele, kategorien where spiele.SplNr=kategorien.SplNr and Kategorie =$_POST[kategorie]';
echo $sql;
Wie Zeichenketten und Variableninterpolation funktionieren, kannst Du unter http://www.php.net/manual/de/language.types.string.php nachschlagen. Und in einem SQL-Statement müssen Zeichenketten immer gequotet werden (wimre).
Nebenbei bemerkt sollte man Usereingaben nicht ungeprüft, bzw. unbearbeitet weiterverwenden (besonders in einem SQL-Statement nicht). Denn sonst kann Dir jemand durch Eingabe von "' or 1 = 1" die komplette Tabelle auslesen. Das ist hier noch nicht schlimm. Wenn die Tabelle aber Kundendaten enthält ist dies äußerst kritisch.
$anzahl=mysql_num_rows($ergebnis);
[...]
while ($zaehler<=$anzahl && $datenArray = mysql_fetch_array($ergebnis)) {
Die Überprüfung des Zählers ist unnötig, da die Zuweisung rechts vom && false ist, sobald kein Datensatz mehr "gelesen" werden kann.
$Titel=$datenArray['Titel'];
$Beschreibung=$datenArray['Beschreibung'];
Auch die Zuweisung zu gesonderten Variablen kannst Du Dir imho sparen, wenn Du den obigen Link verfolgt, und die vorgefundene Seite gelesen hast. :))
[...]
Gruß Alex
Hallo Alex,
vielen Dank für die ausführlichen Hinweise und Tipps. Das hilft mir wirklich weiter zu lernen und nicht nur dieses Problem zu lösen.
Nebenbei bemerkt sollte man Usereingaben nicht ungeprüft, bzw. unbearbeitet weiterverwenden (besonders in einem SQL-Statement nicht). Denn sonst kann Dir jemand durch Eingabe von "' or 1 = 1" die komplette Tabelle auslesen. Das ist hier noch nicht schlimm. Wenn die Tabelle aber Kundendaten enthält ist dies äußerst kritisch.
Wie prüfe oder bearbeite ich die Usereingaben? Hast du da auch noch einen Link zum Nachschlagen und selbst erarbeiten?
Gruß
Lammy
Hallo Lammy,
vielen Dank für die ausführlichen Hinweise und Tipps. Das hilft mir wirklich weiter zu lernen und nicht nur dieses Problem zu lösen.
Gern geschen, auch wenn Thomas kurz vor mir fast genau das gleiche gepostet hat. :))
[...]
Wie prüfe oder bearbeite ich die Usereingaben? Hast du da auch noch einen Link zum Nachschlagen und selbst erarbeiten?
Lies mal ab [pref:t=71991&m=415033] ff. In PHP gibt es Funktionen, um Usereingaben für bestimmte Zwecke zu entschärfen. Zusätzlich kann man mit Funktionen wie preg_match() (http://php.net/preg_match) den Inhalt auf Übereinstimmung mit gewünschten Werten prüfen. Aber Obacht. Das muss gut durchdacht sein, damit nicht doch unerwünschte Werte durchdringen. Ein einfaches "if ($usereingabe == 'wert')" tut es zusammen mit "switch($usereingabe)" (http://de2.php.net/manual/de/control-structures.switch.php) gelegentlich auch. :)
Gruß Alex