PHP Ähnlichkeitsabfrage (MySQL, LIKE)

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

  • PHP Ähnlichkeitsabfrage (MySQL, LIKE)

    Hallo zusammen,

    Folgendes Szenario: Anhand eines Strings soll überprüft werden in welcher Spalte einer MySQL-Tabelle sich ein solcher (ähnlicher) befindet. Er kann (und sollte) sich in einer von 7 Möglichen Spalten befinden. Die Spaltennamen sind durchnummeriert (pu_1 - pu_7).

    Die Ähnlichkeitsabfrage habe ich mittels LIKE versucht zu lösen, bei manchen Testläufen klappt es, bei anderen klappt es selbst dann nicht wenn der String und der Tabelleninhalt identisch sind.

    So sieht der PHP-Code aus:
    PHP-Code:
    for($i=1;$i<=7;$i++) {

        
    $sql_gi "SELECT * FROM Preistab_u WHERE (    pu_".$i." LIKE '%".$zi_art_clean."%' AND objektID = '".$_POST["objektID"]."')";
        
    $res_gi mysql_query($sql_gi);
        
    $num_gi mysql_num_rows($res_gi);
        if(
    $num_gi != 0) {    $typ$i; break;    }
    }

    // $typ ist entscheidende Variable
    // $zi_art_clean is der Suchstring und ist in einigen Fällen identisch mit dem Tabelleninhalt 
    Nun meine Frage ist wieso liefert SQL-Like bei einigen Versuchen einen Treffer und bei anderen nicht? Gibt es vielleicht eine elegantere Lösung für mein Problem?

    Beispiel-Suchstrings wären:
    - "2-Zi. Whg. 4 Betten"
    - "4_zi whg 6 Betten"

    Hoffe jemand kann mir helfen und im Voraus vielen Dank!

    Viele Grüße,
    gen

  • #2
    Die Spaltennamen sind durchnummeriert (pu_1 - pu_7).
    Stichwort Normalisierung, dann haste solche Probleme nicht...

    Nun meine Frage ist wieso liefert SQL-Like bei einigen Versuchen einen Treffer und bei anderen nicht?
    Zeig mal eine Query die deiner Meinung nach treffen sollte und den zugehörigen Datensatz den du erwartest.

    Gibt es vielleicht eine elegantere Lösung für mein Problem?
    Layoute deine Datenbank vernünftig. S.o.

    Beispiel-Suchstrings wären: [...] - "4_zi whg 6 Betten"
    Dem Unterstrich kommt bei LIKE eine besondere Bedeutung zu. Wird aber wahrscheinlich nicht dein "Problem" verursachen.

    Kommentar


    • #3
      Hi TobiaZ ,
      Original geschrieben von TobiaZ
      Stichwort Normalisierung, dann haste solche Probleme nicht...
      Layoute deine Datenbank vernünftig. S.o.
      Auf die Datenbankstruktur habe ich leider keinen Einfluss. Muss es halt irgendwie anders schaffen.

      Zeig mal eine Query die deiner Meinung nach treffen sollte und den zugehörigen Datensatz den du erwartest.
      Ok für folgendes Setting müsste eigentlich eine Übereinstimmung gefunden werden, da Suchvariable und Tabelleninhalt identisch sind. Funktioniert aber nicht.

      PHP-Code:
      $sql_gi "SELECT * FROM Preistab_u WHERE (    pu_".$i." LIKE '%".$zi_art_clean."%' AND objektID = '".$_POST["objektID"]."')";

      // $i = 1 -> pu_1
      // $zi_art_clean = "3-Zi.whg. 4 Betten";
      // Inhalt pu_1 = "3-Zi.whg. 4 Betten"; 
      Danke für die Hilfe.

      Viele Grüße,
      gen

      Kommentar


      • #4
        Zeig mal eine Query die deiner Meinung nach treffen sollte und den zugehörigen Datensatz den du erwartest.
        Falls du es noch nicht kennst, echo hilft bei Testausgaben.

        Wenn du schon aus so ner verkorksten Umgebung entwickelst, dann verzichte wenigstens auf die For-schleife und pack das alles in eine Bedingung.
        Zuletzt geändert von TobiaZ; 15.11.2007, 18:06.

        Kommentar


        • #5
          Original geschrieben von TobiaZ
          Wenn du schon aus so ner verkorksten Umgebung entwickelst, dann verzichte wenigstens auf die For-schleife und pack das alles in eine Bedingung.
          Ich denke mal du meinst dann die einzelnen pu_ in eine "OR" Bedingung packen? Aber woher weis ich dann welche von den Bedingungen zum Result geführt hat?

          Viele Grüße,
          gen

          Kommentar


          • #6
            Das könnte man entweder über einzelne IF()s machen, oder einfach nachher in PHP mittels array_search()

            Alles Performanter als die Query 7 mal auszuführen...

            Kommentar


            • #7
              Ich habe momentan das Problem, dass beispielsweise x% und %x funktionieren, %x% allerdings nur etwas ausgibt, wenn der Wert x exakt so in der Datenbank vorhanden ist!
              Vermutlich liegt es an der folgenden Fehlermeldung in PhpMyAdmin:
              Your PHP MySQL library version 5.0.37 differs from your MySQL server version 5.0.45. This may cause unpredictable behavior.
              Vielleicht hast du ja dasselbe Problem!

              Kommentar

              Lädt...
              X