MYSQL-Abfrage will nicht

medokin

Mitglied
Ich habe hier so einen kleines Script zum erstellen von "Seiten"...
Es funktioniert,
aber sobald ich die Datensätze spezifizieren möchte (mit "WHERE genre = $genre"), kommt folgender Fehler....

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\stream\te.php on line 16

Hier mein Code;
PHP:
   		include("mysql_connect.php");
		
		$genre = $_GET['genre'];
		
        $result = mysql_query("SELECT * FROM stream");
        $eintragsanzahl = mysql_num_rows($result);
		
		$maxEinträge = 7;
        $seitenanzahl = ceil($eintragsanzahl/$maxEinträge);
        

if($_GET['page'] == 1)
    {
        $result2 = mysql_query("SELECT * FROM stream WHERE genre = $genre LIMIT 0,$maxEinträge");
        while ($row = mysql_fetch_assoc($result2)) {
            echo "Der Film: ".$row['title']." hatte <br>\n";
            echo $row['views']." Views<br> \n";
            }
        for($i = 1;$i<($seitenanzahl +1);$i++)
            {
                echo "<a href='te.php?page=".$i."'>Seite ".$i."</a><br>";
            }
    }
if ($_GET['page'] >1)
    {
        $start=($_GET['page']*$maxEinträge)-$maxEinträge;
        
            $result2 = mysql_query("SELECT * FROM stream WHERE genre = $genre LIMIT $start,$maxEinträge");
            while ($row = mysql_fetch_assoc($result2)) {
          	  echo "Der Film: ".$row['title']." hatte <br> \n";
           		 echo $row['views']." Views<br> \n";
                }
            for($c = 1;$c<($seitenanzahl +1);$c++)
            {
                echo "<a href='te.php?page=".$c."'>Seite ".$c."</a><br>";
            }
    }
 
Hi,

dann schlägt die Abfrage fehl und Du musst debuggen:

PHP:
$sql = "...";
$result = mysql_query($sql) or die(mysql_error() . '<br>' . $sql);

Ich vermute, $genre ist ein String und gehört in Hochkommata. Außerdem solltest Du niemals Benutzerdaten ungeprüft in Datenbankabfragen stecken. Das Stichwort hierzu lautet SQL-Injection.

LG
 
@ Chumper

Es ist ein einfacher Textstring.

@ kuddeldaddeldu

Das hört sich weise an, aber deine Erklärung ist mir ein Rätsel.
Könntest Du versuchen es "anders" zu sagen? Oder mit einem ausführlicherem Bespiel?



Vielen dank für Eure Hilfe,
Mit freundlichen Grüßen

medokin
 
Alles was du nicht verstanden hast kannst du auch googlen:
  • debuggen
  • sql-injection
  • mysql_error
Zu all diesen Begriffen wird dir Google sicher helfen.

Das jemand eine Variable mit Umlauten definiert habe ich auch noch nie gesehen!

Zu den Hochkommas. Damit ist folgendes gemeint:

Code:
$string = 'blub';
bzw.
Code:
genre = '$genre'

Die Hochkommas schützen auch teilweise vor SQL-Injections! Siehe dazu auch eine kleinen Beitrag unter:

http://www.online-tutorials.net/security/sql-injection/tutorials-t-93-218.html#gegenmanahmen
 
Hi knuddeldaddeldu,

bei dieser Aussage habe ich mich auf das Tutorial berufen, das über den Link erreichbar ist. Keineswegs machen Sie Funktionen wie intval oder mysql_real_escape_string überflüssig, das habe ich auch nicht gesagt ;)

* Beschreibung: MySQL gibt einen Text, und den Titel aus.

Bugs: Das Script überprüft die Variablen überhaupt nicht, und macht keine Anführungszeichen in den Abfragen.

Code:
      $test = $_GET['test'];

      //Der Benutzer ist in diesem Fall 2
      $UserID = 2;

      $Query = "SELECT
                        artikel_text, artikle_title
                FROM
                        artikel
                WHERE
                        artikel_id = $test;

      echo('Mysql Query: 
      ').$Query.'

      ';

      $test = mysql_fetch_array($Query);

      echo('Text: '.$test['artikel_text'].' Title:'.$test['artikel_title']);
Wenn jetzt http://url.xyz/index.php?test=1 aufgerufen wird, wird der Artikel ganz normal ausgegeben, http://url.xyz/index.php?test=1 UNION SELECT user_password, user_username FROM user WHERE user_id = 1/* gibt uns aber das Passwort, und den usernamen aus.

Gegenmaßnahmen

Die wichtigste Verteidigung gegen Mysql-Injections ist das überprüfen der Eingangsvariablen. Des weiteren können Strings, die nicht escaped sind, wie im letzten Kapitel gezeigt, Probleme bereiten. Hier sind einige Maßnahmen gegen Mysql Injection aufgelistet:

* Anführungsstriche verwenden

Anführungsstriche werden dazu verwendet um Variablen in SQL-Queries zu benutzen.

Beispiel:
Code:
      SELECT z FROM xyz WHERE id = '$Test'
Ein Angreifer, der $Test verändert kann nicht aus den Anführungsstrichen ausbrechen, mit der Voraussetzung das $Test so geparst wurde, dass alle ' mit \' maskiert sind. Man sollte sich allerdings nicht zu stark darauf verlassen, diese Methode ist nur ein Teil von den Massnahmen die getroffen werden sollten.

Wobei ich auch sagen muss, dass das Tutorial nicht ganz fehlerfrei zu sein scheint. Die Idee dahinter erschien mir aber plausibel, was hälst du davon?
 
Hi,

mir war schon bewusst, dass Du Dich auf dieses Tutorial beziehst.

Wobei ich auch sagen muss, dass das Tutorial nicht ganz fehlerfrei zu sein scheint. Die Idee dahinter erschien mir aber plausibel, was hälst du davon?

Nicht besonders viel, um ehrlich zu sein (zumindest nicht von dem Teil, alles habe ich mir nicht angeschaut). Einiges ist sehr unglücklich formuliert und irreführend, einiges schlichtweg falsch.
Anführungszeichen werden nicht dazu verwendet, um Variablen in Abfragen zu verwenden, sie haben in SQL einfach die gesonderte Bedeutung, dass sie Strings begrenzen. Deshalb muss man sie innerhalb eines Strings auch maskieren, damit man überhaupt Zeichenketten, die Hochkommata enthalten, in einer Abfrage verwenden kann (und bei Werten, die vom Benutzer kommen, natürlich um SQL-Injections zu vermeiden).
Den Wert in einer Abfrage auf ein numerisches Feld in Hochkommata zu setzen, ist dagegen Blödsinn. MySQL toleriert das zwar und Deine Abfrage liefert auch das Gewünschte, aber mit erhöhter Sicherheit hat das rein gar nichts zu tun und ist komplett überflüssig. Hier gilt es nur, die Gültigkeit des Wertes sicherzustellen.

LG
 
Zurück