Boolsche Suche und mysql_real_escape_string

Moin Moin.

$sqlsuche = sprintf("SELECT spalte FROM tabelle WHERE MATCH ( spalte ) AGAINST ( '%s' IN BOOLEAN MODE ) ",mysql_real_escape_string($_POST['suche']);

Ich doch bei dieser Art von Suche bestimmte Bedingungen angeben zb. “Wort 1 Wort2” jetzt müssten alle Zeilen gefunden werden die Wort1 und Wort2 (buchstabengleich) enthalten.
Aber da der String “maskiert” wird klappt das nicht.

Wie muss ich hier vorgehen?

Danke Guckstdu

Hallo,
leider verstehe ich nicht ganz genau, was du gerne erreichen willst, kannst du es in anderen Worten vielleicht nochmal deutlich machen?

Ich habe eine Formular mit einem Suchfeld, Volltextsuche
Die Datenbank wird nach dem in das Suchfeld eingegebenen Begriff(en) durchsucht.

Gebe ich in das Suchfeld die zwei Worte: Haus Hund werden alle Datensätze gefunden die Haus oder Hund vorkommen, also alle DS in denen wenigstens einer der beiden Suchausdrücke vorkommt.

Gebe ich in das Suchfeld die zwei Worte: "Haus Hund " innerhalb dieser doppelten Hochkommas ein , dann sollten alle DS gefunden werden die Haus UND Hund enthalten. (eigentlich wie bei Google)

soweit so gut.
Das funktioniert aber nur wenn ich $_Post[‘suche’] ohne mysql_real_escape_string übergebe.
Sobald ich mysql_real_escape_string($_POST[‘suche’] nutze funktioniert das nicht mehr, was ja auch irgendwie logisch ist, da in dem Moment die " maskiert werden.

Muss ich überhaupt mysql_real_escape_string($_POST[‘suche’] verwenden oder kann ich darauf in der Abfrage verzichten?

Danke Guckstdu

Puh, jetzt versteh ichs, aber gute Frage, da müssten wir mal die Datenbankspezis fragen, ich würde ja schon fast sagen, man kanns weglassen, aber das ist nur so eine ganz ganz waage Vermutung, verlass dich bitte nicht darauf und hoffe, das ein Profi den Thread entdeckt :smiley:!

Nein, mysql_real_escape_string muss immer verwendet werden. Außnahme sind prepared statements :wink:
Du kannst die " wieder freigeben, indem du das str_replace verwendest :wink:

Nur bei eingaben wie ‘test " oder so’ funktioniert es nicht korrekt.

Diese Notation dient aber zum Finden exakter Phrasen.

Die Suche nach “haus Hund” würde also Texte finden, in denen die Worte haus und hund direkt nacheinander vorkommen (ggf. noch mit Interpunktions-/nicht-Wort-Zeichen dazwischen).
Es dient aber nicht dazu, Datensätze zu finden, in denen irgendwo die Worte haus und hund vorkommen, mit anderen Worten dazwischen.
Dafür wäre nach +haus +hund zu suchen.

@chrisb
Du hast natürlich recht
MfG

Hallo,

@progandy
ich weis nicht ob ich das jetzt richtig verstanden habe.

$sucheingabe=str_replace("\\\"", '"', mysql_real_escape_string($_POST['suchfeld'])); $sqlsuche = sprintf("SELECT spalte1, spalte2 FROM tabelle WHERE MATCH ( spalte1 spalte2 ) AGAINST ( ('%s') IN BOOLEAN MODE ) ",$sucheingabe);

Wenn ich mir das Feld ausgeben lasse bekomme ich bei der Eingabe in das Suchfeld ‘Kind Haus’ folgende Ausgabe angezeigt : ‘Kind Haus’

MfG
Guckstdu

Du musst ja auch doppelte Anführungzeichen in der Eingabe verwenden. Die einfachen Hochkommatas werden ja sowieso nicht interpretiert :wink: