wörter in DB suchen?

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

  • wörter in DB suchen?

    Ich suche ein TUT wie man mehrere eingegebene Begriffe (wie bei einer suchmaschine) in einer DB durchsucht.

    Ich denk mal der inhalt des eingabefeldes in eine variable gespeichert werden muß, dann jedes wort in eine array speichern (bei 5 wörtern also: [0],[1],[2],[3],[4])

    und dann die suchanfrage per schleife.
    also erst
    [0]
    dann suchen mit
    [1]
    usw.
    ich lasse 1 spalte in der DB durchsuchen (TEXT-Feld, sind inhalte von dokumenten die gespeichert werden sollen)!

    dann müßte, wenn das wort gefunden wurde incl 2. spalte mit seitenzahl in ein andere array gespeichert werden und dann geht die schleife nach oben zu [2]

    am ende erfolgt die ausgabe!

    is mein gedankengang so richtig?

    gibts dafür ein TUT irgendwo?

    hab net das richtige gefunden bis jetzt im Netz!

  • #2
    Na ich weiß nicht ob ich DICH richtig verstehe, aber
    Die sache mit dem Array is schon mal nicht schlecht.
    Damit kannst du mit foreach
    z.B einfach den nächsten Suchstring an das Query anhängen.

    Code:
    SELECT * FROM `tabelle` WHERE `feld` = <arraywert> OR `feld` = <arraywert> etc.
    gruss Chris

    [color=blue]Derjenige, der sagt: "Es geht nicht", soll den nicht stoeren, der's gerade tut."[/color]

    Kommentar


    • #3
      Beachte aber, dass der 0815-User gewohnt ist, daß seine Suchwörter AND-verknüpft werden. Hat den Effekt, dass man zu lange Trefferlisten durch hinzufügen weiterer Suchwörter verfeinern/verkürzen kann.

      PHP-Code:
      // Annahme: 1.Wort kein AND oder OR
      $sql "SELECT * FROM tabelle WHERE feld='".mysql_real_escape_string($search[0])."'";
      for (
      $i=1$i<count($search); $i++) {
        switch (
      strtoupper($search[$i])) {
          case 
      'OR':
              
      $sql .= ' OR ';
              
      $i++;   // um nach switch das nächste Suchwort anzuhängen
              
      break;
          case 
      'AND':
              
      $sql .= ' AND';
              
      $i++;   // um nach switch das nächste Suchwort anzuhängen
              
      break;
          default:
              
      $sql .= ' AND';  // Standard: AND-verknüpft
        
      }
        
      $sql .= " feld LIKE '%".mysql_real_escape_string($search[$i])."%'";  // Substringsuche
        //$sql .= " feld='".mysql_real_escape_string($search[$i])."'";  // exakte Suche
      }
      echo 
      $sql

      Kommentar


      • #4
        Ich nehme an es soll eine Volltextsuche werden, dann empfehle ich doch dringend MATCH

        Die gewünschten AND OR etc kann man vorher durch php ein wenig in Form bringen (preg_replace)


        onemorenerd's Ansatz ist nicht schlecht aber gerade bei vielen Suchbegriffen mit (am besten noch hierarchischer ) Logik (z.B ((Bed1 OR Bed 2) AND (Bed3 OR Bed4)) AND Bed5 OR Bed6) wirds echt haarig und dein Pseudoparser brauch mehr Zeit die Query zu erstellen als es sinn macht.

        Mit Match gehen evtl. kurze Wörter verloren (Suche nach die, in, und, es macht schliesslich auch wenig sinn) aber dass könnte man durch gekonntes Parsen und einsetzen von Like für diese Fälle auch abfangen, wenns denn notwendig ist
        chansel0049
        ----------------------------------------------------
        if you've reached the bottomline - dig further!
        Übersetzer gesucht? http://www.babelport.com

        Kommentar


        • #5
          erstmal vielen dank, war ne schwere geburt für mich als anfänger!

          mit MATCH geht es nur zum teil!

          hab schon gelesen das es, wie bei mir, zu keiner aushgabe kommt, wenn das gesuchte wort in 50% der datensätze vorkommt.


          deshalb habe ich es anders gelöst:

          $Zeichenkette = $eingabe;
          $Zeichenkette = explode(" ",$Zeichenkette);
          $Summe=count($Zeichenkette);

          for ($x=0;$x<$Summe;$x++)
          {
          //Ausgabe von Datensätzen
          $aus = mysql_query("SELECT * FROM DBSuche WHERE Begriffe LIKE '%$Zeichenkette[$x]%'");
          while($i = mysql_fetch_array($aus))
          {

          $KAT=$i['Kategorie'];
          ..........................................................


          Zuletzt geändert von Gamer20; 24.06.2005, 12:06.

          Kommentar


          • #6
            Damit führst du aber unnötig viele Abfragen ab und eine Verknüpfung von Daten hast Du auch nicht :

            Suche nach "bed1 bed2"
            Ergibt bei deinem Ansatz lediglich 2 Ergebnissätze jeweils1 für jede
            Bedingung, was man will ist jedoch ! Ergebnissatz der beidie Bedingungen erfüllt, oder ?

            Bsp. :
            mysql> use test
            Database changed
            mysql> DROP TABLE IF EXISTS test;
            CREATE TABLE IF NOT EXISTS `test` (
            Query OK, 0 rows affected, 1 warning (0.00 sec)
            `id` INT NOT NULL AUTO_INCREMENT ,
            `feld` VARCHAR( 255 ) NOT NULL ,

            PRIMARY KEY ( `id` )
            mysql> CREATE TABLE IF NOT EXISTS `test` (
            -> `id` INT NOT NULL AUTO_INCREMENT ,
            -> `feld` VARCHAR( 255 ) NOT NULL ,
            -> PRIMARY KEY ( `id` )
            -> ) TYPE = MYISAM ;
            Query OK, 0 rows affected, 1 warning (0.02 sec)

            mysql> INSERT INTO test (feld) VALUES ('test');
            Query OK, 1 row affected (0.00 sec)

            mysql> INSERT INTO test (feld) VALUES ('test verfehlt');

            Query OK, 1 row affected (0.00 sec)

            mysql> INSERT INTO test (feld) VALUES ('test mit erfolg abgeschlossen');
            Query OK, 1 row affected (0.01 sec)

            mysql> INSERT INTO test (feld) VALUES ('erfolg hat sich eingestellt');

            Query OK, 1 row affected (0.00 sec)

            mysql> SELECT * FROM test;
            +----+-------------------------------+
            | id | feld |
            +----+-------------------------------+
            | 1 | test |
            | 2 | test verfehlt |
            | 3 | test mit erfolg abgeschlossen |
            | 4 | erfolg hat sich eingestellt |
            +----+-------------------------------+
            4 rows in set (0.00 sec)

            mysql>
            mysql> SELECT id FROM test WHERE feld LIKE '%test%';
            +----+
            | id |
            +----+
            | 1 |
            | 2 |
            | 3 |
            +----+
            3 rows in set (0.00 sec)

            mysql> SELECT id FROM test WHERE feld LIKE '%erfolg%';
            +----+
            | id |
            +----+
            | 3 |
            | 4 |
            +----+
            2 rows in set (0.00 sec)

            mysql>
            mysql> SELECT id FROM test WHERE feld LIKE '%test%' AND feld
            LIKE '%erfolg%';
            +----+
            | id |
            +----+
            | 3 |
            +----+
            1 row in set (0.01 sec)
            Das Beispiel zeigt was passiert, wenn Du nach "test erfolg" suchst
            zu erhälst insgesamt 5 Zeilen aus zwei Abfragen wobei eine
            Doppelt Erscheint, was Du jedoch wahrscheinlich willst ist eine
            Abfrage mit x richtigen Ergebnissen , also müssen alle Bedingungen
            in einer Query abgefragt werden.


            PHP-Code:
            $Zeichenkette $eingabe;
            $Zeichenkette explode(" ",$Zeichenkette);

            $sql "SELECT * FROM DBSuche WHERE  1 "
            $bool " AND ";
            foreach  (
            $Zeichenkette AS $string)
            {
                if (
            stroupper($string) == "AND" ) {
                   
            $bool " AND "; continue;
               } 

                if (
            stroupper($string) == "OR" ) {
                   
            $bool " OR "; continue;
               }     
             
            $sql .= $bool begriff LIKE '%$string%'";
            }

            // Abfrage ausführen und Weitermachen 

            $res mysql_query($sql);
            while(
            $i mysql_fetch_array($res))
            {
            $KAT=$i['Kategorie'];
            ....................................................... 
            --ADDED ---

            Jetzt ist onemorenerd's Boolsche Verknüpfung auch drinn, allerdings ist die nur schwach geparst (evtl Klammerungen, hierarische ordnungen, AND vor OR / OR vor AND wird nicht behandelt)
            Zuletzt geändert von chansel0049; 25.06.2005, 11:28.
            chansel0049
            ----------------------------------------------------
            if you've reached the bottomline - dig further!
            Übersetzer gesucht? http://www.babelport.com

            Kommentar


            • #7
              Das ist doch der selbe Ansatz, den ich oben schon vorgeschlagen habe, lediglich beschnitten um die Möglichkeit der Oder-Verknüpfung.

              Kommentar


              • #8
                Richtig -- aber der Code den er gepostet hat zeigt dass er es mit Mehrfachqueries versucht

                Deshalb nochmal zur verdeutlcihung

                Will hier nicht deine Loorbeeren einheimsen
                chansel0049
                ----------------------------------------------------
                if you've reached the bottomline - dig further!
                Übersetzer gesucht? http://www.babelport.com

                Kommentar


                • #9
                  hmm mal schauen, kann es erst wieder am mo. in der firma testen!


                  aber stimmt, daran hab ich net gedacht, das der nutzer ja auch nach AND sucht und net nur nach 1 begriff. danke für die hinweise.

                  test es am mo. durch, geb dann bescheid wie es geklappt hat, wenn ich es schaffe!

                  Kommentar


                  • #10
                    will net klappen!

                    wenn ich den code kopiere, kommt folgende fehlermeldung nach dem klick auf "suchen":

                    Fatal error: Call to undefined function: stroupper() in /usr/web/suche/ausgabe.php on line 85

                    Kommentar


                    • #11
                      Sollte strtoupper sein nicht stroupper, t vergessen

                      P.S. Im Handbuch steht sowas
                      chansel0049
                      ----------------------------------------------------
                      if you've reached the bottomline - dig further!
                      Übersetzer gesucht? http://www.babelport.com

                      Kommentar

                      Lädt...
                      X