2012-03-26 9 views
1

Ich versuche herauszufinden, warum, wenn ich einen Punkt (.) In meine Suche einfüge, jedes einzelne Zeichen der Suchergebnisse hervorhebt (es umschließt jedes Zeichen in einem <span class="search-highlight"></span>) und es zeigt auch nur 3 Tickets, was seltsam ist alle von ihnen haben mindestens einen Punkt in ihnen:Was soll ein Punkt (.) In MySQL-Abfragen tun?

screenshot

die Abfrage, die die eigentliche Suche hat (zusammen mit den Variablen) ist:

$q = mysql_real_escape_string($_GET['q']); 
$query = trim(strtoupper($q)); 
$query = htmlentities($query, ENT_QUOTES, "UTF-8"); 
$construct = $is_employee==false ? "user='$userid' AND" : ""; 
$tickets_result = mysql_query("SELECT `id`, `subject`, `message`, `timestamp`, `user` FROM `tickets` WHERE $construct (upper(subject) LIKE '%".$query."%' OR upper(message) LIKE '%".$query."%')") or trigger_error(mysql_error()); 

Und meine highlight Klasse:

Weiß jemand, warum oder wie ein einfacher Punkt (.) Würde dies verursachen und ist es möglich, zu beheben?

Vielen Dank für jede Hilfe im Voraus.

+0

Sounds mag die Suche funktionieren, aber die Hervorhebung ist drunter und drüber. ('.' ist ein beliebiges Zeichen in regulären Ausdrücken, fragen Sie sich, ob es irgendwo im Auszeichnungscode einen regulären Ausdruck gibt?) preg_replace() sieht verdächtig aus. –

+0

Verwenden Sie http://php.net/manual/en/function.mysql-real-escape-string.php, um Ihre Anfrage zu umgehen. Siehe http://php.net/manual/en/security.database.sql-injection.php für weitere Informationen – Maz

+0

@Maz ich benutze das bereits. – Nathan

Antwort

3

muß nur eine Alternative hinzuzufügen hier zu entkommen sucht regulären Ausdruck:

Vielleicht, was Sie wollen, ist ein nicht-regex ersetzen?

http://us3.php.net/str_replace

str_replace - Ersetzen Sie alle Vorkommen des Suchbegriffs mit der Ersatz-String

Für eine genaue Übereinstimmung, dass die meisten Sinn macht für mich ...

+0

Nun, das hat am besten funktioniert, weil ich mir keine Sorgen mehr um die regulären Ausdrücke machen muss und da ich immer noch die "foreach" -Schleife benutze, scheint es, dass es genauso funktioniert. Aber weißt du, was könnte das verursachen, wenn ich "das ist ein Test" eingeben: http://screencast.com/t/D6gdkexso Wirklich seltsam ... – Nathan

+0

Ja, einfache Zeichenfolge Suche Tokens nicht die Worte zu entsprechen. (DOH!) Wenn Sie zu regulären Ausdrücken zurückkehren, können Sie Ihren Ausdruck mit der Wortgrenze '\ b' auf jeder Seite umschließen. –

+0

Oh. Ich habe nie davon gehört. :/Wenn ich also zu regulären Ausdrücken zurückkehre, die ich wirklich nicht tun will, kann ich das einfach hinzufügen und es wird korrekt funktionieren und nicht nach 4 Wörtern oder was auch immer durcheinander bringen? – Nathan

1

. (Punkt) hat eine besondere Bedeutung in regulären Ausdrücken - es passt zu jedem Zeichen - und deshalb sind Ihre gesamten Daten hervorgehoben. Sie sollten escape verwenden und nach \. statt nur einem Punkt suchen.

2

Sie verwenden preg_replace, das eine Suche mit regulärem Ausdruck ist.

Die. in regulären Ausdrücken entspricht einem beliebigen Zeichen. Eigentlich hat das nichts mit MySQL zu tun.

4

Es ist die preg_replace, die hier "fehlerhaft" ist. . ist ein Platzhalterzeichen, also passt es zu allem.

Möglicherweise möchten Sie preg_quote auf Ihre Eingabezeichenfolge ausführen, bevor Sie es in die Regex setzen.

+0

Ich habe 'preg_quote' in die Highlight-Klasse eingefügt und es funktioniert. Vielen Dank!Es gibt noch ein kleines Problem, ich bin mir sicher, dass es etwas mit dem regulären Ausdruck zu tun hat, aber wenn ich 'This is a test' eintrage, werden alle hervorgehoben (es scheint mehr als 3 Wörter zu haben). Weißt du, ob das ein Problem mit der Abfrage oder dem regulären Ausdruck wäre? – Nathan

Verwandte Themen