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

  • litterauspirna
    hat ein Thema erstellt [Erledigt] Suche in Mysql genauer machen.

    [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

  • David
    antwortet
    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";
      }

    Einen Kommentar schreiben:


  • litterauspirna
    antwortet
    Wieso ist das Quark?

    Einen Kommentar schreiben:


  • David
    antwortet
    mysql_real_escape_string(+$suche1 +$suche2)
    Das ist schon mal Quark.

    Einen Kommentar schreiben:


  • litterauspirna
    antwortet
    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

    Einen Kommentar schreiben:


  • litterauspirna
    antwortet
    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.

    Einen Kommentar schreiben:


  • David
    antwortet
    Also kein +, keine anderen Operatoren, also
    [no operator] implies OR

    Einen Kommentar schreiben:


  • litterauspirna
    antwortet
    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.

    Einen Kommentar schreiben:


  • David
    antwortet
    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?

    Einen Kommentar schreiben:


  • litterauspirna
    antwortet
    Nun bleibt noch das Problem wenn er Nokia 5230 eingibt das er auch andere Nokias bringt. Irgendwie ein kleiner Teufelskreis.

    Einen Kommentar schreiben:


  • David
    antwortet
    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?

    Einen Kommentar schreiben:


  • litterauspirna
    antwortet
    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.

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


  • litterauspirna
    antwortet
    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?

    Einen Kommentar schreiben:


  • David
    antwortet
    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]

    Einen Kommentar schreiben:

Lädt...
X