Lammy: gePOSTeten Variablenwert in MySQL Select Abfrage übernehmen

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>";

?>

  1. versuche mal statt

    $_POST[kategorie]

    '.$_POST[kategorie].'

    zu schreiben

    1. 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 ;-).

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

    --
    Bitte keine Mails mit Fachfragen - dafuer gibt es das Forum!
    Ich mag es, wenn URLs verlinkt sind (</faq/#Q-19>).
    Oft gestellte PHP-Fragen beantwortet die dclp-FAQ bestens: http://www.dclp-faq.de/
    1. 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

    2. Hallo Thomas,

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

      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

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

    --
    >> Dass in eine if Schleife zu packen schafft mein 10 jähriges Patenkind. [...]
    > Mhhh, wenn man if in Schleifen packt, muss man sich auch nicht wundern, wenn die Patenkinder verwöhnte Luder werden. [...]
    [TomIRL und Tom in ?t=64084&m=364291]
    ss:) zu:} ls:} fo:| de:[ va:| ch:| sh:( n4:& rl:° br:& js:| ie:| fl:| mo:}
    1. 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

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

        --
        >> Dass in eine if Schleife zu packen schafft mein 10 jähriges Patenkind. [...]
        > Mhhh, wenn man if in Schleifen packt, muss man sich auch nicht wundern, wenn die Patenkinder verwöhnte Luder werden. [...]
        [TomIRL und Tom in ?t=64084&m=364291]
        ss:) zu:} ls:} fo:| de:[ va:| ch:| sh:( n4:& rl:° br:& js:| ie:| fl:| mo:}