Stephan: Suchfunktion für mehrere Worte

Hallo,

ich mache jetzt schon ewigkeiten damit rum, aber ich bekomme es nicht hin. Ich übergebe per GET eine Variable. Es funktioniert alles, wenn ich nur einen Begriff eingebe, allerdings nicht, wenn ich zwei eingebe. Ich mache das in der SELECT Abfrage mit %$suche%. Hierbei ist $suche die Variable, die ich übergeben habe. Mit zwei Worten geht das nicht, egal ob es diese Kombination gibt oder nicht.

Wie geht eine professionelle Suchfunktion wie bei Goolge, dh mit "" und +?

Danke schon mal

Stephan

  1. hallo stephan,

    nun zu nächst musst du php mitteilien wieviel worte in der suche überhaupzt vorhanden sind, dazu zählst du die einträge in einer schleife aus.

    for($x = 0; $x < count($query); $x++) {
                        $abfrage .= "((suchfeld1 LIKE '%" . $query[$x] . "%') OR (suchfeld2 LIKE '%" . $query[$x] . "%'))";
             if (count($query) > 1 && $x < count($query) -1) {
                    $abfrage .= " OR ";
                      } else {
                         $abfrage .= " ";
                   }
          }

    dabei wird für jedes wietere wort eine neue abfrage initalisiert.
    $abfrage wird vorher definiert und über die schleife erweitert, dies ist dann die eigentlich mysql-abfrage.

    franek

    Hallo,

    ich mache jetzt schon ewigkeiten damit rum, aber ich bekomme es nicht hin. Ich übergebe per GET eine Variable. Es funktioniert alles, wenn ich nur einen Begriff eingebe, allerdings nicht, wenn ich zwei eingebe. Ich mache das in der SELECT Abfrage mit %$suche%. Hierbei ist $suche die Variable, die ich übergeben habe. Mit zwei Worten geht das nicht, egal ob es diese Kombination gibt oder nicht.

    Wie geht eine professionelle Suchfunktion wie bei Goolge, dh mit "" und +?

    Danke schon mal

    Stephan

    1. Hi,

      for($x = 0; $x < count($query); $x++) {
                          $abfrage .= "((suchfeld1 LIKE '%" . $query[$x] . "%') OR (suchfeld2 LIKE '%" . $query[$x] . "%'))";
               if (count($query) > 1 && $x < count($query) -1) {
                      $abfrage .= " OR ";
                        } else {
                           $abfrage .= " ";
                     }
            }

      wer sagt denn, dass $query ein Array mit den Einzelbegriffen ist? Ich habe es so verstanden, dass in einem Suchformular z.B. "auto kaufen neu" eingegeben wird und dann nach diesen drei Begriffen gesucht werden soll...

      viele Grüße
        Achim Schrepfer

      --
      http://reskit.speedesign.de/ - PHP-Bibliothek zum automatischen Erzeugen von HTML-Tabellen, -Formularen und -Baummenüs anhand von MySQL-Tabellen
      Selfcode: sh:) fo:| ch:| rl:° br:> n4:{ ie:% mo:} va:| de:< zu:| fl:( ss:) ls:& js:|
    2. Hi,

      dann ist $x doch das Suchwort oder?

      Danke schon mal

      Stephan

      PS: WO bringe ich denn ORDER BY ein?

  2. Hi,

    soweit ich weiss, bietet MySQL sogar eine Volltextsuche an, ich habe die nur noch nie benutzt. Wenn Du eine Suche nach mehreren Wörtern machen willst, muss Du zunächst den Suchbegriff anhand der Leerzeichen splitten (z.B. mit explode()), und dann einzelne per AND bzw. OR verknüpfte LIKE-Klauseln bauen. Hier mal ein Quick-And-Dirty-Code ausm Kopf (ungetestet):

    $begriffe = explode(' ', $_GET['suche']);
    foreach ($begriffe AS $key => $value) {
      $begriffe[ $key ] = "suchspalte LIKE '%".addslashes( $value )."%'";
    }
    $suchsql = 'SELECT * FROM foo WHERE ('.implode(') AND (',$begriffe).')';

    Zunächst spalte ich den Suchstrin in die einzelnen Begriffe auf. Danach durchlaufe ich die Liste der Begriffe, füge die LIKE-Klausel dazu und lasse den Wert per addslashes() so umschreiben, dass er gefahrlos in ein SQL-Statement eingebaut werden kann. Anschließend wird das komplette SQL-Statement geschrieben und die einzelnen Klauseln per implode() wieder zusammen gesetzt.

    viele Grüße
      Achim Schrepfer

    --
    http://reskit.speedesign.de/ - PHP-Bibliothek zum automatischen Erzeugen von HTML-Tabellen, -Formularen und -Baummenüs anhand von MySQL-Tabellen
    Selfcode: sh:) fo:| ch:| rl:° br:> n4:{ ie:% mo:} va:| de:< zu:| fl:( ss:) ls:& js:|