Suchfunktion

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Suchfunktion

    Hallo,
    ich bin neu hier im Forum, aber erhoffe mir hier Hilfe. In Sachen php und mysql bin ich noch ein relativer Anfänger, bringe mir vieles selbst bei durch Bücher und Google.
    Nun habe ich das Problem, dass ich auf meiner Seite eine Suchfunktion einbauen möchte mit einem Suchfeld um eine Adressdatenbank auszulesen. Diese ist auch schon angelegt. Wie schon gesagt habe ich ein Suchfeld und bekomme auch Ergebnisse geliefert bei der Eingabe. Ich arbeite mit MATCH AGAINST. Wenn ich nun z.B. Hans Müller in mein Suchfeld eingebe bekomme ich zwar Hans Müller ausgespuckt, aber auch alle anderen, die Hans heissen. Ich möchte es aber so, dass ich dann nur das Ergebnis Hans Müller auch angezeigt bekomme, weiss aber nicht, wie ich das festlegen kann. Das Prinzip, wieso das so ist, hat mir eingeleuchtet, doch an der Umsetzung haperts noch.... :-)

    echo " <form method=post action='" .$_SERVER['PHP_SELF'] ."'>\n";
    echo "<input class= formular name=suche type=text maxlenght=255 size=20 value='".$_POST['suche']."'>\n";
    echo "<input class= formular type=submit name=Submit value='Senden'>\n</form>";



    mysql_connect("", "", "");
    mysql_select_db("");
    $sql1 = "SELECT * from `Adressverzeichnis` WHERE MATCH (Name,Vorname) AGAINST ('+$suche' IN BOOLEAN MODE) LIMIT $start, $step";
    $result1 = mysql_query($sql1);
    $zeilen = mysql_num_rows($result1);

    Wäre prima, wenn ich hier geholfen bekommen könnte, da ich schon seit Tagen rumgoogel, aber keiner dieses Problem hat, oder ich einfach zu blöd dafür bin, viele arbeiten eben mit einem zusätzlichen eingabefeld oder dropdown - menü, möchte aber alles mit einem suchfeld (wie bei google oder so) realisieren. Vielleicht hat ja jemand einen Plan hier? Wäre nett....

  • #2
    Re: Suchfunktion

    http://www.php-resource.de/forum/sho...threadid=50454

    Und DIE Referenz für die Volltextsuche von mysql ist schlichtweg das Manual von mysql
    http://dev.mysql.com/doc/refman/5.1/...xt-search.html
    Wenn du dein Problem nach Lesen und Verstehen davon nicht lösen konntest, darfst du wieder kommen ^^

    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
    Wie man Fragen richtig stellt

    Kommentar


    • #3
      Die Referenz habe ich mir schon die ganze Zeit zu Gemüte geführt, aber sie hatte mein Problem nicht so gelöst, wie ichs gerne gehabt hätte, weshalb ich ja dann schliesslich hier gepostet habe, da ich mit all dem leider nicht weiter kam...
      Aber danke Dir trotzdem für die Tipps...

      Kommentar


      • #4
        Re: Suchfunktion

        well well ... zu schlecht gelesen ^^,
        Du willst also, dass beide Suchstrings vorkommen, dazu sagt http://dev.mysql.com/doc/refman/5.1/...t-boolean.html folgendens
        +

        A leading plus sign indicates that this word must be present in each row that is returned.

        [...]

        '+apple +juice'

        Find rows that contain both words.
        PHP-Code:
        <?php
        $suche 
        "hans müller";
        $tmp explode(' '$suche);
        foreach (
        $tmp as $key => $value) {
            
        $tmp[$key] = '+' $value;
        }
        $suche implode(' '$tmp);
        $sql1 "SELECT * from `Adressverzeichnis`
          WHERE MATCH (Name,Vorname)
            AGAINST ('
        $suche' IN BOOLEAN MODE) LIMIT $start$step";
        Zuletzt geändert von ghostgambler; 22.07.2006, 00:58.

        Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

        bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
        Wie man Fragen richtig stellt

        Kommentar


        • #5
          +$suche bedeutet +Hans Müller. Das heisst: Hans muss vorhanden sein, und ranks higher when Müller auch vorhanden (was 'rank' immer auch heisst, habe nicht genauer gelesen).

          Du musst aber +Hans +Müller haben, damit Hans UND Müller vorkommen müssen. dh. Du musst dein $suche zuerst selber in die zwei Wörter aufteilen.

          Nachgeschaut im Kapitel 12.7 des mysql manuals->Functions und Operators->Full-Text-Search-Functions

          Kommentar


          • #6
            Der Code mit explode, implode und +$suche ergibt ++Hans +Müller.

            Kommentar


            • #7
              Original geschrieben von heiss
              Der Code mit explode, implode und +$suche ergibt ++Hans +Müller.
              tjo, doppelter Rank xD

              Rank ist übrigens die Relevanz, je höher die Relevanz, desto eher wird der Datensatz per mysql_fetch_* zurückgegeben.
              Eventuell solltest du auf deiner Homepage lieber eine kurze Einführung in + und - machen, als dass von php aus vorzugeben, denn die Operatoren sind bei einer Suchmaschine doch das beste (die funktionieren auch bei google und co)

              Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

              bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
              Wie man Fragen richtig stellt

              Kommentar


              • #8
                Du musst aber +Hans +Müller haben, damit Hans UND Müller vorkommen müssen. dh. Du musst dein $suche zuerst selber in die zwei Wörter aufteilen.
                Genau das ist ja mein Problem, wo ich hängengeblieben bin, da ich die ganze Problematik mit dem +Hans Müller und so schon verstanden habe, mir hapert es leider an der Umsetzung eben, den Code so zu schreiben, das Hans Müller eben aufgesplittet wird und es +Hans +Müller heisst. Und irgendwie scheine ich auch etwas auf dem Schlauch zu stehen bei
                $suche = "hans müller";
                da $suche ja nicht immer "hans müller ist, sondern durch das suchfeld ja auch "willi wurst" eingegeben werden könnte.
                Sorry, nicht böse gemeint, aber ich steh wohl scheinbar wirklich auf´m Schlauch... ,
                aber trotzdem danke wegen Eurer Antworten, ich weiss, mit Anfängern hat mans nicht immer leicht....

                Kommentar


                • #9
                  Original geschrieben von Sphinx0402
                  Und irgendwie scheine ich auch etwas auf dem Schlauch zu stehen bei
                  $suche = "hans müller";
                  da $suche ja nicht immer "hans müller ist, sondern durch das suchfeld ja auch "willi wurst" eingegeben werden könnte.
                  Das war doch nur ein Beispiel ... woher kommt denn $suche bei dir? Per Formular?
                  Ich hoffe mal du hast register_globals off?

                  Wenn du das in deinem Formular hast
                  Code:
                  <input name="suche" value="willi wurst">
                  und das dann abschickst, hast du in php den Wert des Feldes in $_POST['suche'] (oder $_GET, wenn die Daten per get kommen)
                  dann machst du das Codefitzelchen von oben
                  PHP-Code:
                  <?php
                  /*
                    hier wird der reinkommende Suchstring an jedem Leerzeichen 
                    aufgesplittet und in $tmp landet ein Array, pro Element ein Wort
                  */
                  $tmp explode(' '$_POST['suche']);
                  /*
                    hier wird durch das komplette Array gegangen und jedem Value ein 
                    + voran gestellt
                  */
                  foreach ($tmp as $key => $value) {
                      
                  $tmp[$key] = '+' $value;
                  }
                  /*
                    Das Array wird nun wieder zu einem String zusammen geklebt
                  */
                  $suche implode(' '$tmp);
                  //  und alles landet im Query
                  $sql1 "SELECT * from `Adressverzeichnis`
                    WHERE MATCH (Name,Vorname)
                      AGAINST ('
                  $suche' IN BOOLEAN MODE) LIMIT $start$step";

                  Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                  bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                  Wie man Fragen richtig stellt

                  Kommentar


                  • #10
                    Uffz, habs tatsächlich dank Deines Codes hinbekommen...ein Wunder!!!
                    Weiss nicht, wie lange ich an diesem Feinschliff geackert habe, aber mit meinen php - Kenntnissen ist es eben nicht so weit her...(noch nicht, lerne ja noch...). Aber dank Dir gehts jetzt und ein weiterer erleichterter Mensch auf dieser Welt kann jetzt beruhigt schlafen gehen....
                    Danke Dir nochmals....wenn irgendwann wieder Probleme auftauchen, weiss ich wo ich fragen muss....

                    Kommentar


                    • #11
                      sollte man das noch trimmen oder sonstwie robust machen?

                      mir kommt trim, dann preg_split(whitespace,$suche) in den Sinn,
                      oder trim, dann preg_replace(whitespace," +") ?
                      Und ^whitespace durch "+" und whitespace$ gerade durch "" ersetzen?

                      Kommentar


                      • #12
                        Original geschrieben von heiss
                        sollte man das noch trimmen oder sonstwie robust machen?

                        mir kommt trim, dann preg_split(whitespace,$suche) in den Sinn,
                        oder trim, dann preg_replace(whitespace," +") ?
                        Und ^whitespace durch "+" und whitespace$ gerade durch "" ersetzen?
                        Ob man trim auf User Input anwendet bleibt jedem selbst überlassen, mysql wird sich nicht drin stören, preg_slit nach whitespace ist im Endeffekt das gleiche wie explode, nur schneller (wozu nach Umbrüchen und/oder Tabs suchen? Ein input-Feld kann die Zeichen eh nicht akzeptieren! Abgesehen davon, dass ein reines Ersetzen der Whitespace-Zeichen einen String allá "willi+wurst" erzeugen würde, es müsste aber "+willi +wurst" rauskommen (wenn in der Mitte das Leerzeichen fehlt denke ich wird mysql das nicht mögen))

                        Ich würde es mit einer kleinen Einführung in die Booleanen Operatoren dem User komplett selbst überlassen und den String einfach so wie er ist in die Datenbank einfügen, durch das feste Setzen der Operatoren nimmt man viel Funktionalität weg

                        Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                        bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                        Wie man Fragen richtig stellt

                        Kommentar


                        • #13
                          Ich habe eher gedacht, wenn am Anfang oder Schluss ein Leerzeichen ist, oder mittendrin zwei Leerzeichen, das sollte noch irgendwie und irgendwann behandelt werden. Gröberer whitespace ist weniger wahrscheinlich.

                          Zumindest weiss der Frager jetzt, dass er darauf noch achten kann, wenn er es wünscht.

                          nicht allá, sondern à la
                          Zuletzt geändert von heiss; 22.07.2006, 11:16.

                          Kommentar

                          Lädt...
                          X