Ankündigung

Einklappen
Keine Ankündigung bisher.

Suche ohne Groß-/Kleinschreibung

Einklappen

Neue Werbung 2019

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

  • Suche ohne Groß-/Kleinschreibung

    Hallo,

    ich hab da ein kleines Problem. Und zwar geht es um die Suche.
    Ich habe ein Suchformular erstellt. Dort gibt man einen Suchbegriff ein
    und wenn man will eine Kategorie.

    Danach wird die Suche ausgeführt. Mein Quelltext sieht so aus:
    PHP-Code:
    $sql="SELECT id, name, Kategorie, art, beschreibung FROM tips WHERE (name LIKE '%$suchwort%' OR beschreibung LIKE '%$suchwort%')";
    if(
    $art!="0"$sql.= "AND art LIKE '%$art%'"
    Jetzt ist mir aber ein Problem aufgefallen.
    Und zwar mit der Groß- und Kleinschreibung. Suche ich z.B. nach "sie",
    wird nur ein DS gefunden. Suche ich aber nach "Sie", so sind es 4.

    Scheinbar liegt das an der Schreibweise.
    Hat jemand ne Idee was da falsch läuft?

  • #2
    Du könntest eine Kollation mit der Endung _ci auswählen (case insensitive), z.B. utf8_unicode_ci.
    [URL]http://hallophp.de[/URL]

    Kommentar


    • #3
      Zitat von Asipak Beitrag anzeigen
      Du könntest eine Kollation mit der Endung _ci auswählen (case insensitive), z.B. utf8_unicode_ci.
      Interessante Sache, schon wieder was neues gelernt..!
      Frage: Kann man die Collation einfach "mal so" bei einer gefüllten Tabelle umstellen, oder ist da mehr notwendig?


      Zitat von pfump Beitrag anzeigen
      Danach wird die Suche ausgeführt. Mein Quelltext sieht so aus:
      PHP-Code:
      $sql="SELECT id, name, Kategorie, art, beschreibung FROM tips WHERE (name LIKE '%$suchwort%' OR beschreibung LIKE '%$suchwort%')";
      if(
      $art!="0"$sql.= "AND art LIKE '%$art%'"
      Die Vergleiche in der Datenbank beim LIKE sind Case-Sensitiv. Also "Sie" != "sie".

      Eine alternative Lösung (zu der von @Asipak) wäre es, alle Vergeichswerte temporär entweder auf Gross- oder Kleinschrift umzuwandeln.

      Beispiel für Umwandlung auf klein...

      PHP-Code:
      $suchwort strtolower($suchwort);
      $art strtolower($art);

      $sql="SELECT id, name, Kategorie, art, beschreibung FROM tips WHERE (LOWER(name) LIKE '%$suchwort%' OR LOWER(beschreibung) LIKE '%$suchwort%')";
      if(
      $art!="0"$sql.= "AND LOWER(art) LIKE '%$art%'"
      so, hoffe mich nicht vertippt zu haben..

      Grüße
      Thomas

      Kommentar


      • #4
        Also ich hab das jetzt so:

        PHP-Code:
        $suchwort=strtolower($suchwort);

        $sql="SELECT id, name, Kategorie, art, beschreibung FROM tips WHERE ((LOWER(name) LIKE '%$suchwort%' OR LOWER(beschreibung) LIKE '%$suchwort%')";
        if(
        $art!="0"$sql.= "AND (art LIKE '%$art%')";  
        $sql.=")"
        Jetzt ist es aber genau umgekehrt. Also gebe ich sie ein werden 4 Ds gefunden, gebe ich Sie ein gar keiner

        Hat sich erledigt. Hatte einen Schreibfehler drin
        Vielen Dank für die Hilfe. Jetzt klappts

        Kommentar


        • #5
          Es gibt doch noch ein Problem.
          Und zwar wenn ich als Suchwort z.B. öffnen eingebe.
          Dann wird nichts gefunden, obwohl öffnen vorkommt.
          Ich hab mir mein sql Statement mal ausgeben lassen:
          Code:
          SELECT id, name, Kategorie, art, beschreibung FROM tips WHERE  ((LOWER(name) LIKE '%�ffnen%' OR LOWER(beschreibung) LIKE '%�ffnen%'))
          Obwohl ich
          PHP-Code:
          header('Content-Type: text/html; charset=utf-8');
          <
          meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
          angegeben habe.
          Oder liegt das am POST?

          Kommentar


          • #6
            Wohl eher am strtolower().

            PHP: mb_strtolower - Manual

            Ebenfalls brauchbar: http://de.php.net/mysql_set_charset.
            [URL]http://hallophp.de[/URL]

            Kommentar


            • #7
              Also das mit den Umlauten funktioniert jetzt.
              Jetzt ist aber das Problem, das wenn ich nach öffnen suche,
              alle Einträge die öffnen oder Öffnen enthalten gefunden werden. Soweit so gut.
              Jetzt will ich aber das das Suchwort farblich hervorgehoben wird. Das mache ich so:
              PHP-Code:
              preg_replace("#($suchwort)#i","<span style='font-weight:bold;background-color:yellow;'>\\0</span>",htmlspecialchars($row2["name"])) 
              Das funktioniert auch an sich wunderbar. Nur bei den Umlauten nicht.
              Suchwort = "öffnen"
              Fehlende Hervorhebung bei "Öffnen"

              Wenn kein Umlaut vorhanden ist, funktioniert es.

              Kommentar


              • #8
                Hast du auch den Zeichensatz für die Datenbankverbindung mit Hilfe von mysql_set_charset() auf utf8 gesetzt?

                Vermutlich kann dir auch der u-Modifier helfen.
                [URL]http://hallophp.de[/URL]

                Kommentar


                • #9
                  Meine Datenbank hat als Kollation utf8_bin.
                  Brauch ich dann das mysql_set_charset() überhaupt?

                  Was meinst du mit
                  u-Modifier? Wo setze ich den ein?

                  Kommentar


                  • #10
                    Also ich hab das jetzt so geschrieben:

                    PHP-Code:
                    preg_replace("#($ersatz)#ui","<span style='font-weight:bold;background-color:yellow;'>\\0</span>",htmlspecialchars($row2["name"])) 
                    Das scheint auch zu funktionieren

                    Kommentar


                    • #11
                      Ja, das war gemeint.

                      Beim Vergleich könntest du dir - wie gesagt - den Umweg über strtolower() sparen, wenn du anstelle von utf8_bin z.B. utf8_unicode_ci als Kollation wählen würdest.
                      [URL]http://hallophp.de[/URL]

                      Kommentar


                      • #12
                        Hallo.
                        Erst mal vielen Dank für die Hilfe

                        Ich hatte schon mal auf utf8_general_ci umgestellt.
                        Aber leider brachte das das selbe Ergebnis.
                        Liegt wohl am LIKE.

                        Kommentar

                        Lädt...
                        X