PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [MYSQL] Regexp findet Zahlen 2, 3 und 4 (obwohl vorhanden) nicht?!


M@tes
2009-05-11, 10:47:50
Hoi!
Stehe gerad vor einem kuriosem Problem..
Habe hier ein Sucheingabefeld. Der Wert wird direkt über $_GET['id'] in mein MySQl Code eingefügt.
In der Testphase noch unberührt und ohne Sicherheitsabfragen..
Und zwar suche ich nach Werten in der "id" Spalte (welche auto_increment ist und entsprechend Resultate vorhanden sein müssen!) nach Zahlen, welche irgendwo enthalten sind.
Z.B. suche ich nach "41", soll er mir auflisten: 41,141, 411, 1411,...
Was soweit auch funktioniert.
Suche ich jetzt aber nach "42", oder "2" oder "3" oder "4" findet er rein garnix.
Häng ich dann aber eine Zahl, die nicht 4, 2 oder 3 ist, kommen aufeinmal wieder Resultate :|:confused::P
Das macht doch keinen Sinn?!?! Hab ich geradn Rad ab oder was ist da los??

Hab schon folgende Schreibweisen getestet:
$Query=mysql_query("SELECT * FROM $DBTable WHERE id REGEXP '".$_GET['id']."' ORDER BY id");
$Query=mysql_query("SELECT * FROM $DBTable WHERE id REGEXP '.*".$_GET['id'].".*' ORDER BY id");
$Query=mysql_query("SELECT * FROM $DBTable WHERE id LIKE '%".$_GET['id']."%' ORDER BY id");

Gast
2009-05-11, 11:34:00
Der Wert wird direkt über $_GET['id'] in mein MySQl Code eingefügt.
[...]
Hab ich geradn Rad ab [...]??
Definitv: JA

Schau dir mal die PHP Data Objects und insbesondere PDOStatement->bindValue (http://de2.php.net/manual/de/pdostatement.bindvalue.php) an, damit lässt sich sowas schön sauber erledigen.

Tommes
2009-05-11, 11:45:23
id ist sicher ein Int in der Tabelle...

Gast
2009-05-11, 11:47:33
zum eigentlichen problem:
das könnte daran liegen, dass du string-operationen auf integers anwendest. versuch es mal mit einem expliziten cast, also
SELECT * FROM $DBTable WHERE CAST(id AS CHAR) LIKE '%42%' ORDER BY id

Abnaxos
2009-05-11, 12:02:15
Und nochmal zum anderen Problem, nach dem der TS gar nicht gefragt hat: ;)

Damit:
Der Wert wird direkt über $_GET['id'] in mein MySQl Code eingefügt.
… umschreibst du wunderbar den Begriff “SQL-Injection” (http://de.wikipedia.org/wiki/SQL-Injection). Nicht machen!

RMC
2009-05-11, 12:33:35
Und nochmal zum anderen Problem, nach dem der TS gar nicht gefragt hat: ;)

Damit:

… umschreibst du wunderbar den Begriff “SQL-Injection” (http://de.wikipedia.org/wiki/SQL-Injection). Nicht machen!


Richtig. Bitte nach Möglichkeit prepared statements verwenden :)

M@tes
2009-05-11, 13:47:37
Hi!
Danke erstmal, hab mir die Sachen mal angeguckt, aber wirklich weiterhelfen tuts mir nicht :(
Muss vielleicht nochmal betonen, das ich in der Testphase extra keine Sicherheitsabfragen drin habe, um den Code klein zu halten und Fehler so schneller finden zu können. Später kommen diese denn schon rein! Aber trotzdem Danke! Hat für später ein paar gute Punkte dabei. Aber in diesem Stadium hilft es mir leider nicht weiter..
@Tommes: Ja ist ein INT. Wieso?
@Gast: Daran lags leider auch nicht.

Gast
2009-05-11, 14:05:24
Muss vielleicht nochmal betonen, das ich in der Testphase extra keine Sicherheitsabfragen drin habe, um den Code klein zu halten und Fehler so schneller finden zu können.
Das ist unzweckmäßig und absolut fahrlässig. Sowas sollte man von vorne herein sicher implementieren und nicht versuchen nachträglich die Löcher zu flicken.

Wie gesagt: Schau dir PDO an. Das ist seit Version 5.1 fester Bestandteil von PHP und bietet mit prepared statements einen zuverlässigen Schutz gegen Injections.

Tommes
2009-05-11, 15:42:43
Weil die Regex und Like Abfragen nur für Strings funktionieren.

Berni
2009-05-11, 20:52:22
Du müsstest beim Insert der Datensätze ein zusätzliches Textfeld anlegen, das den Wert des Primärschlüssels (als String) erhält. Das ist zwar alles andere als elegant aber wohl das Einfachste.

robobimbo
2009-05-11, 23:01:50
zum eigentlichen problem:
das könnte daran liegen, dass du string-operationen auf integers anwendest. versuch es mal mit einem expliziten cast, also
SELECT * FROM $DBTable WHERE CAST(id AS CHAR) LIKE '%42%' ORDER BY id
also das nachgestgellt funktioniert bei mir wunderbar, du solltest es nochmal ordentlich testen

M@tes
2009-05-12, 13:16:21
Hmm ob das an der MyISAM Datenbank liegt?
SELECT * FROM $DBTable WHERE CAST(id AS CHAR) LIKE '%42%' ORDER BY id
funktioniert def. nicht :(

M@tes
2009-05-12, 14:29:19
*bullshit*

/edit: Hab den Fehler gefunden:
Das Problem lag beim AJAX bzw. dem XML-Interpreter. Habe hier eine schon vorhandene Tabelle, aber übersehen, das da & Zeichen vorhanden sind, welche der Interpreter nciht leiden konnte.
Entsprechend sind rein zufällig gerad die 3, 4 und 5 Ids nicht auf gelistet worden.
Gruss und Danke! Jetzt kommen die Sicherheitsabfragen ;)