PHP mysql_real_escape_string verursacht Fehler in der Datenbank-Abfrage

raven16

Lieutenant
Registriert
Nov. 2008
Beiträge
580
Hallo,

ich möchte mich durch mysql_real_escape_string() schützen, erhalte aber folgende Fehlermeldung:
Code:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND Reset='' LIMIT 1' at line 3

Ich führe folgenden Quelltext aus:
PHP:
$uid = mysql_real_escape_string($_GET['uid']);
$r = mysql_real_escape_string($_GET['r']);
$newpw = mysql_real_escape_string($_POST['pw2']);
dbconnect();
$sql_get_reset = mysql_query("SELECT Reset FROM User 
				WHERE Uid=".$uid." 
				AND Reset='".$r."'
				LIMIT 1") or die("Abfrage sql_get_reset fehlgeschlagen<br><br>".mysql_error());
												
if(mysql_num_rows($sql_get_reset) == 1)
{
    //Hier steht noch mehr
}

Komisch ist, dass wenn ich den mysql_real_escape_string()-Befehl weglasse, dann funktioniert die Abfrage...
 
$r scheint leer zu schein.
Lass dir doch mal die zusammengebaute SQL-Abfrage ausgeben und führe sie eventuell händisch aus und schau was dabei rauskommt, dann wirst du schnell auf den Fehler stoßen!
 
Was steht in den Daten drin? Lies dir auch mal die Doku zu mysql_real_escape_string durch, besonders den zweiten Parameter.
 
System01 schrieb:
$r scheint leer zu schein.
Lass dir doch mal die zusammengebaute SQL-Abfrage ausgeben und führe sie eventuell händisch aus und schau was dabei rauskommt, dann wirst du schnell auf den Fehler stoßen!

Hab den Fehler gefunden, verstehe ihn aber nicht:
habe im WHERE-Teil uid=123 geschrieben und dies versursacht bei der mysql_real_escape-string()-Funktion einen Fehler.
Wenn ich uid='123' (also mit Hochkommata) mache, dann funktioniert es seltsamerweise.

Ich dachte immer bei zahlen muss man dies nicht?!

Hmmm... okay jetzt hab ich zwar keinen Fehler mehr aber die Abfrage liefert immernoch kein richtiges Ergebnis.
 
Zuletzt bearbeitet:
Muss nicht, gut wäre es aber. Sonst steht in $_GET['uid'] bald 0;DELETE FROM xy; o.ä. drin und hast du Probleme.
 
Den zweiten Parameter von mysql_real_escape_string verstehe ich nicht so ganz.
Allgemein sollte doch nach meinem Verständnis nichts mit den Variableninhalten passieren weil keine Sonderzeichen vorhanden sind.

Wenn ich mysql_real_escape_string bei den Variablen weglasse, dann funktioniert die Abfrage so wie sie soll komischerweise. Das hab ich noch nie erlebt. Meine Erklärung dafür ist, dass ich dass zum ersten mal bei $_GET statt sonst $_POST einsetze.
 
PHP:
$int = 123;
$string = mysql_real_escape_string($int);

var_dump(is_int($int));
var_dump(is_int($string));

var_dump(is_string($int));
var_dump(is_string($string));

string im sql query immer im ''
 
Danke jetzt komme ich glaub ich erst mal klar :)
 
Yuuri schrieb:
Muss nicht, gut wäre es aber. Sonst steht in $_GET['uid'] bald 0;DELETE FROM xy; o.ä. drin und hast du Probleme.
Nein, er hätte kein Problem, außer er hat eine wirklich steinalte PHP-Installation. Jede leidlich aktuelle Version führt pro mysql_query() nur einen Query durch, nicht mehrere.

Die korrekte Antwort auf das Problem lautet aber eh: Finger weg von der alten mysql_query() - Notation. Verwende PDO mit Prepared Statements. Das Zeug ist nicht nur performanter, es ist auch immun gegen SQL Injections.
 
Zurück
Oben