PHP IN()-Operator mit mysql_real_escape_string

  • Ersteller Ersteller Mr. Snoot
  • Erstellt am Erstellt am
M

Mr. Snoot

Gast
Hio,

wenn ich Werte in einem Array aus einer MySQL-Datenbank auslesen will, mache ich das mit dem IN()-Operator:

PHP:
$auswahl = array("...", "...", "...");
$auswahl = "'".implode("', '", $auswahl)."'";

$abfrage = "SELECT * FROM table WHERE begriff IN ($auswahl)";
$abfrage = mysql_query($abfrage);
while($row = mysql_fetch_object($abfrage))
{
  ...
}
So funktioniert es - aber wenn ich es mit mysql_real_escape_string kombinieren möchte, geht es nicht mehr:
PHP:
$auswahl = array("...", "...", "...");
$auswahl = "'".implode("', '", $auswahl)."'";

$abfrage = sprintf("SELECT * FROM table WHERE begriff IN (%s)", mysql_real_escape_string($auswahl));
$abfrage = mysql_query($abfrage);
while($row = mysql_fetch_object($abfrage))
{
  ...
}
Da bekomme ich nur diesen schönen Fehler:
Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource

Die Abfrage wird aber eigentlich korrekt ausgegeben:
SELECT * FROM table WHERE begriff IN ('...', '...', '...')




Wie muss ich das denn in Verbindung mit m._r._e._s. schreiben?
 
Zuletzt bearbeitet:
Die einfachen Anführungszeichen sind Teil des Operators und werden mit mysql_real_escape_string auch escaped. Du solltest mysql_real_escape_string NUR auf die einzelnen Array-Elemente anwenden, d.h. z.B.:

// nach $auswahl = array("...", "...", "..."); und vor implode()

for($i=0;$i < len($auswahl);$i++)
{
$auswahl[$i] = mysql_real_escape_string($auswahl[$i]);
}

Edit: Steht auch im Handbuch:
mysql_real_escape_string() calls MySQL's library function mysql_real_escape_string, which prepends backslashes to the following characters: \x00, \n, \r, \, ', " and \x1a.
 
So ein Müll :D

Aber danke, das läuft. Ist es denn sicherheitstechnisch egal, wo das mysql_real_escape_string steht - ob vor oder innerhalb des SELECT-Ausdrucks?
 
Es ist nur wichtig, dass jede Nutzereingabe einmal durch diese Funktion läuft, bevor sie in die SQL-Abfrage eingesetzt wird. Wann und wo das geschieht ist egal, solange die so gewonnene Zeichenkette hinterher nicht mehr verändert wird.
 
Zurück
Oben