Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Suche in Mysql genauer machen

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Suche in Mysql genauer machen

    Hallo Leute und schönen 3 Advent.

    Und zwar ist mir grad aufgefallen das ich ein Problem bei meiner Shopsuche habe. Habe auch schon gegoogelt und im Handbuch geschaut aber nicht wirklich was hilfreieches gefunden.

    Ich hbae zum Beispiel zwei Nokia Handys im Sortiment ein Nokia 5110 und ein Nokia 5230.

    So wenn ich nun in die Suche eingebe das Handy Nokia 5230 dann bringt der mir auch das Nokia 5110. Wenn ich nun aber nur 5230 ohne das Wort Nokia eingebe dann bringt er mir gewünscht nur das Nokia 5230.

    Wie kann ich es machen das wenn Nokia 5230 eingegeben wird auch nur dieses erscheint und kein anderes Nokia?

    Hier mein momentaner Code.

    PHP-Code:
    if(isset($_POST['suche_x']) && isset($_POST['suche_y']))
      {
       
    $sqlbefehl ="
          Select
           a.id_artikel,
           a.cat_id,
           a.art_name,
           a.art_nummer,
           a.status,
           a.mwst,
           a.preis_euro,
           a.preis_dollar,
           a.preis_sfr,
           a.bestand,
           a.gewicht,
           a.angebot,
           a.lieferzeit,
           a.hersteller,
           a.artikel_bild,
           a.farbe,
           a.groese,
           k.id_cat,
           k.cat_name
          From
           artikel a
          Left Join
           kategorien k
          ON
           (a.cat_id = k.id_cat)
          Where
           MATCH (art_name) AGAINST ('"
    .mysql_real_escape_string($_POST['suchtext'])."' IN BOOLEAN MODE)
          OR
           MATCH (cat_name) AGAINST ('"
    .mysql_real_escape_string($_POST['suchtext'])."' IN BOOLEAN MODE)
          "
    ;
       
    $erg_suche mysql_query($sqlbefehl)or die(mysql_error().$sqlbefehl);
       while(
    $suche mysql_fetch_assoc($erg_suche)){
        include(
    'suche_list.php');
       }
    //ende while
      
    }//ende isset suche 
    Danke für eure Tipps und hilfe.

    mfg der litter
    Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
    [URL]http://www.lit-web.de[/URL]

  • #2
    MySQL :: MySQL 5.1 Reference Manual :: 11.8.2 Boolean Full-Text Searches
    The + and - operators indicate that a word is required to be present or absent, respectively, for a match to occur.
    ...
    [no operator] implies OR
    Wenn Du also
    Code:
    MATCH (...) AGAINST ('Nokia 5230')
    hast, bedeutet das [i]Nokia or 5230[/code]

    Kommentar


    • #3
      Wie kann ich das aber nun genauer machen? Weil ich ja den Wert aus einem Postfeld bekomme.

      Wäre da eine Lösung den String aus dem Postfeld mit explode aufzulösen oder gibts etwas eleganteres?
      Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
      [URL]http://www.lit-web.de[/URL]

      Kommentar


      • #4
        oder gibts etwas eleganteres?
        Nicht dass ich wüsste...
        Aber lies Dir doch einfach mal die Doku durch.

        Kommentar


        • #5
          Die Doku habe ich mir ja durchgelesen darum fragte ich nach und den Post String per explode aufzulösen scheint mir da die beste Lösung.

          Nur eben kann es dann das Problem geben weil ja da nur das 5230 ausgewertet wird,wenn es nun ein Samsung 5230 gibt dann würde es das auch anzeigen. Weist wie ich meine?

          Das ist das einzige was mir da Kopfzerbrechen bereitet.
          Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
          [URL]http://www.lit-web.de[/URL]

          Kommentar


          • #6
            Zitat von litterauspirna
            Weist wie ich meine?
            Nö, verstehe ich nicht.
            Wenn ich nur 5230 eintippe und es gibt ein "Nokia 5230" und ein "Samsung 5230" dann erwarte ich doch beide Suchergebnisse oder etwa nicht?

            Kommentar


            • #7
              Nun bleibt noch das Problem wenn er Nokia 5230 eingibt das er auch andere Nokias bringt. Irgendwie ein kleiner Teufelskreis.
              Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
              [URL]http://www.lit-web.de[/URL]

              Kommentar


              • #8
                PHP-Code:
                echo '<pre>Debug: 'htmlspecialchars($sqlbefehl), "</pre>\n";
                $erg_suche mysql_query($sqlbefehl)or die(mysql_error().$sqlbefehl); 
                Wie sieht eine konkrete Abfrage aus?

                Kommentar


                • #9
                  Das sieht dann so aus

                  Code:
                  Where
                  							MATCH (art_name) AGAINST ('Nokia 5320' IN BOOLEAN MODE)
                  						OR
                  							MATCH (cat_name) AGAINST ('Nokia 5320' IN BOOLEAN MODE)
                  Also steht drin was ich erwarte aber er bringt eben das Nokia 5110 auch mit.
                  Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
                  [URL]http://www.lit-web.de[/URL]

                  Kommentar


                  • #10
                    Also kein +, keine anderen Operatoren, also
                    [no operator] implies OR

                    Kommentar


                    • #11
                      Also werde ich den Post String wohl doch mit explode auflösen müssen und dann die beiden Variablen in die Abfrage einbauen müssen. Ich werde das mal probieren um zum Ziel zu kommen. Das mit explode zu lösen scheint mir die einzige Möglichkeit zu sein.
                      Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
                      [URL]http://www.lit-web.de[/URL]

                      Kommentar


                      • #12
                        Ich habe nun das Problem gelöst,ob es die beste und eleganteste Lösung ist sei mal dahin gestellt aber sie funktioniert.

                        Hier der Code
                        PHP-Code:
                        if(isset($_POST['suche_x']) && isset($_POST['suche_y']))
                          {
                           
                        $sqlbefehl ="
                              Select
                               a.id_artikel,
                               a.cat_id,
                               a.art_name,
                               a.art_nummer,
                               a.status,
                               a.mwst,
                               a.preis_euro,
                               a.preis_dollar,
                               a.preis_sfr,
                               a.bestand,
                               a.gewicht,
                               a.angebot,
                               a.lieferzeit,
                               a.hersteller,
                               a.artikel_bild,
                               a.farbe,
                               a.groese,
                               k.id_cat,
                               k.cat_name
                              From
                               artikel a
                              Left Join
                               kategorien k
                              ON
                               (a.cat_id = k.id_cat)
                              "
                        ;
                           
                        //string durchsuchen
                           
                        $string $_POST['suchtext'];
                           
                        $such_string " ";
                           
                        $such_wert strpos($string,$such_string);
                           
                        //wenn ein leerzeichen eintritt dann string für sucher zerlegen
                           //und folgende where clausel ausführen
                           
                        if($such_wert !== false)
                           {
                            
                        $suche explode(" ",$_POST['suchtext']);
                            
                        $suche1 $suche[0];
                            
                        $suche2 $suche[1];
                         
                            
                        $sqlbefehl .="
                               Where
                                MATCH (art_name) AGAINST ('"
                        .mysql_real_escape_string(+$suche1 +$suche2)."' IN BOOLEAN MODE)
                               "
                        ;
                           }
                           
                        //wenn kein leerzeichen auftritt einfache suche ausführen
                           
                        elseif($such_wert === false)
                           {
                            
                        $sqlbefehl .="
                               Where
                                MATCH (art_name) AGAINST ('"
                        .mysql_real_escape_string($string)."' IN BOOLEAN MODE)
                               "
                        ;
                           }
                           
                        //nach eingegebener kategorie suchen
                           
                        else
                           {
                            
                        $sqlbefehl .="
                               Where
                                MATCH (cat_name) AGAINST ('"
                        .mysql_real_escape_string($string)."' IN BOOLEAN MODE)
                               "
                        ;
                           }
                           
                        $erg_suche mysql_query($sqlbefehl)or die(mysql_error().$sqlbefehl);
                           
                        //echo '<pre>Debug: ', $sqlbefehl, "</pre><br>";
                           
                        while($suche mysql_fetch_assoc($erg_suche)){
                            include(
                        'suche_list.php');
                           }
                        //ende while
                          
                        }//ende isset suche 
                        Jetzt muss ich das ganze noch bei der erweiterten Suchmaske machen und dann passt es.

                        Dank David mfg der litter
                        Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
                        [URL]http://www.lit-web.de[/URL]

                        Kommentar


                        • #13
                          mysql_real_escape_string(+$suche1 +$suche2)
                          Das ist schon mal Quark.

                          Kommentar


                          • #14
                            Wieso ist das Quark?
                            Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
                            [URL]http://www.lit-web.de[/URL]

                            Kommentar


                            • #15
                              Weil Du da mindestens die doppelten Anführungszeichen vergessen hast.
                              In der Form wandelt PHP beide Variablen in Zahlen um und addiert sie.

                              Außerdem wirkt das alles so unnötig kompliziert.
                              Ungetestet:
                              PHP-Code:
                              if( isset($_POST['suchtext']) )
                              {
                                
                              $mysql mysql_connect('localhost''localuser''localpass') or die(mysql_error());
                                
                              mysql_select_db('test'$mysql) or die(mysql_error());

                                
                              $words explode(' '$_POST['suchtext']);
                                
                              $match '';
                                foreach(
                              $words as $w) {
                                  
                              $match .= ' +'.mysql_real_escape_string($w$mysql);
                                }
                                
                                
                              $sql ="
                                  SELECT
                                    a.id_artikel, a.cat_id, a.art_name,
                                    a.art_nummer, a.status, a.mwst,
                                    a.preis_euro, a.preis_dollar, a.preis_sfr,
                                    a.bestand, a.gewicht, a.angebot,
                                    a.lieferzeit, a.hersteller, a.artikel_bild,
                                    a.farbe, a.groese, k.id_cat, k.cat_name
                                  FROM
                                    artikel a
                                  LEFT JOIN
                                    kategorien k
                                  ON
                                    a.cat_id = k.id_cat
                                  WHERE
                                    MATCH (art_name,cat_name) AGAINST ('
                              $match' IN BOOLEAN MODE)
                                "
                              ;
                                echo 
                              $sql;
                                
                              $result mysql_query($sql$mysql) or die(mysql_error());
                                while( 
                              false!==($row=mysql_fetch_array($resultMYSQL_ASSOC)) ) {
                                  echo 
                              join(','$row), "<br />\n";
                                }

                              Kommentar

                              Lädt...
                              X