2016-05-06 14 views
-2

ich diese Linie in PHP, die einen Abfrageparameter in PDO baut:, wie die Konvertierung von% (Anzahl), um Code zu verhindern

$p[':criteria'] = '%' . $search . '%'; 

Die Linie von MySQL in Frage wie folgt aussieht:

d.d_name LIKE :criteria 

Das Problem ist, wenn ich eine Zahl in $ Suche setzen, wandelt es es in ein Zeichen. Zum Beispiel setzen, wenn ich $ Suche:

6008 

Ich will es sein:

%6008% 

aber was ich bekommen ist:

`08% 

Es sieht aus wie es% ist - Codierung der ersten 2 Zeichen. Ich habe versucht, urldecode() zu verwenden, um es rückgängig zu machen, aber es hat nicht funktioniert. Es behielt die Saite als `08%.

Wie kann ich dies verhindern?

+1

"aber was ich bekomme" --- aber Sie bekommen es wo? – zerkms

+0

Verwenden Sie ein Framework, ORM oder eine Abstraktionsschicht? – MonkeyZeus

+1

Weder PHP noch PDO konvertiert Ihre Daten. Es bleibt genau dasselbe. Daher gibt es kein einziges Problem mit Ihrem Code. –

Antwort

0

BIND MECANISM ist zu allgemein, weil es mit vielen Typen umgehen muss und es gibt einige Randfälle wie diese.

Also in diesem Fall, anstatt binden verwenden, montieren Sie Ihre Abfrage als String:

$sql = "...whatever d.d_name LIKE '%" . $search . "%'"; 

Debug $ search sicher zu sein, es keine Anführungszeichen oder etwas vor verketten hat. Wenn es mit Trimm oder ähnliches entfernt wurde.

Überprüfen Sie auch die $ Suche korrekt, da SQL-Injection-Angriffe auftreten.

0

Dies ist nur eine Illusion. Sie versuchen, Ihre Suchanfrage mit einem ungeeigneten Tool wie einem Browser anzuzeigen. Und dieses Tool führt eine Konvertierung durch. Absolut irrelevant für SQL-Sachen.

Während für eine Datenbank Ihre Abfrage genau gleich bleibt. Und es gibt kein einziges Problem mit irgendwelchen Konvertierungen. Führen Sie einfach Ihre Abfrage aus und holen Sie sich das Ergebnis.

+0

interpretiert. Ich möchte darauf hinweisen, dass OP höchstwahrscheinlich ein Framework irgendeiner Art verwendet und die' $ _POST'-Daten manipuliert werden, bevor sie jemals '$ search' zugewiesen werden. Es ist auch möglich, dass OP einen unbekannten JS Code haben könnte, der etwas Ähnliches macht. [Ich hatte ein Problem wie diese zuvor] (http://stackoverflow.com/questions/20081165/some-chars-encoded-during-post-while-othere-are-not) – MonkeyZeus

+0

Ihre Antwort löst nicht Benutzer Problem. –

-1

Ich empfehle Ihnen, über string escape zu lesen, kann es Ihnen helfen, dieses Problem zu lösen, und auch gute Sache zu wissen, wie einige Programmiergrundlagen.

-1

Versuchen Sie eine vorbereitete Anweisung wie im folgenden Beispiel zu verwenden.

$sth = $dbh->prepare("SELECT * 
    FROM `test` 
    WHERE `criteria` LIKE :criteria"); 
$sth->bindParam(':criteria', '%'.$search.'%'); 
$sth->execute(); 
+0

* Genau * die gleiche falsche Antwort wurde bereits gegeben, aber vom Autor wegen starker negativer Abstimmung gelöscht. –

+0

@YourCommonSense, ich denke, dass die Frage bezüglich der bereitgestellten Daten unvollständig ist. Höchstwahrscheinlich @ raphael75 ist URL-Codierung in irgendeiner Weise, da '% 60' in' http://www.w3schools.com/tags/ref_urlencode.asp umgewandelt wird –

+0

Es ist keine Entschuldigung für eine Antwort, die von sich aus falsch ist –