2013-02-01 16 views
6

So habe ich ein interessantes Thema, das ich nie gestoßen bin und scheint nicht viele Informationen über die Behebung des Problems zu finden. Ich habe eine riesige Datenbank, die eine riesige Menge an Daten enthält (10 Jahre wert) und versucht, sie zu durchsuchen.Mysql Abfrage Probleme mit LIKE und Apostroph

Jetzt funktioniert die Suche gut, aber vor kurzem hat jemand mich auf einen "Bug" aufmerksam gemacht, wenn Sie so wollen. Ich habe versucht, Probleme zu ertragen, um die erwarteten Ergebnisse zu erzielen, aber ohne Erfolg.

Das ist mein Problem:

Wenn jemand einen Apostroph bei der Suche verwendet wird, ist es nicht, dass die Suchfehler, aber es keine Ergebnisse. So zum Beispiel bei der Suche Pete's die Abfrage ausgeführt wird, aber nichts zurückgibt. Ja, ich stelle sicher, dass die Abfrage den mysql_real_escape_string() hat, so dass Pete'sPete\'s wird.

Selbst wenn ich versuche, es mit der Suchfunktion von phpmysql abzufragen, bekomme ich seltsame Ergebnisse. Die Abfrage soll so sein:

SELECT * FROM `smd_article` WHERE `copy` LIKE '%Pete\'s%' 

Aber wenn ich die Suchfunktion in phpMyAdmin verwenden, es gibt mir:

SELECT * FROM `smd_article` WHERE `copy` LIKE '%Pete''s%' 

Und wenn ich tippen tatsächlich die Abfrage in der SQL-Registerkarte Es gibt immer noch keine Ergebnisse. Aber es gibt einige 17K-Records, die zurückgegeben werden, wenn ich nur Pete und einige 3k-Records verwende, wenn ich nur Petes mache.

So bin ich neugierig, was ich falsch mache, oder fehlt, um es so zu machen, dass es den Apostroph in einer Abfrage mit der LIKE-Anweisung ermöglichen kann. Gedanken?

+5

off topic, aber es ist erwähnenswert, dass Wildcard Abfragen wie folgt zu wissen, sind die langsamste Art und Weise zu abfragen eine Datenbank. Für einen kleinen Tisch mag ich okay sein, aber wenn Sie auch nur einen mäßig großen Tisch haben, kann das die Dinge wirklich verlangsamen. Sei gewarnt. – SDC

Antwort

5

Versuch von mysql_real_escape_string

LIKE '%" . mysql_real_escape_string($find) . "%' 

oder

LIKE '%Pete%27s%' 

oder wenn Sie mit gU Sie tun können, wie

$search ='Pete\'s' 
$stmt = $db->prepare("SELECT * FROM `smd_article` WHERE `copy` LIKE ?"); 
$stmt->bindValue(1, "%$search%", PDO::PARAM_STR); 
$stmt->execute(); 
+0

Weder funktionieren, noch keine Ergebnisse – MrTechie

+1

Was ist also in der Datenbank gespeichert? ist es nicht 'Pete \ 'oder Pete's?wenn es 'Pete's bedeutet es erlaubt' '' mit anderen Worten Ihr Code ist sql Injektion vunerable –

+1

Ich habe nie gedacht, nur einen Blick auf die Rohdaten. Und jetzt, wo ich habe, sehe ich das Problem. Der Titel hat: Pete ' s und im Inhalt hat es Pete ’ s - eh. Ich hasse es, wie die Editoren dieser Seite einfach Inhalte kopieren und einfügen – MrTechie

1

Das Problem ist nicht wegen der ' Apostroph ist. Sie haben es korrekt gemieden. (Wie die Suchfunktion in phpMyAdmin):

String:

MySQL Pete: 'Pete' 's

So ist die folgende Abfrage funktioniert. (Ich habe es getestet)

SELECT * 
FROM `smd_article` 
WHERE copy 
LIKE '%Pete''s%' 

Sie auch einen Blick auf die IN Aussage haben:

SELECT * 
FROM `smd_article` 
WHERE copy 
IN (
'Pete', 'Pete''s' 
) 
+0

mit der In-Anweisung funktioniert nicht – MrTechie

+0

@MrTechie Ich habe die Abfrage mit Beispieldaten getestet und es hat funktioniert. Die Flucht des Zitats ist nicht das Problem. Muss ein anderes Problem sein – hek2mgl