Einschränkung erlaubter Zeichen in Formularfeld/Suchfunktion

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

  • Einschränkung erlaubter Zeichen in Formularfeld/Suchfunktion

    Ich bin dabei, die Inhalte einer MySQL-Datenbank durchsuchbar zu gestalten und zerbreche mir den Kopf, wie man die Suchfunktion in Zukunft besser nutzen kann.


    Zur Veranschaulichung:
    http://kingssingers.rockmusic-web.de/search.php

    Die Variablen werden mit POST an result.php übergeben, und zur Zeit werden nur bestimmte Zeichen überhaupt akzeptiert:
    PHP-Code:
    if (!(eregi("^[a-z0-9äöüß '-]{2,100}$"$suchtext))) {
        echo 
    "<h3>Bitte geben Sie einen Suchbegriff mit mehr als zwei
             Buchstaben und ohne Sonderzeichen ein.</h3><br><br>"
    ;
        echo 
    "<input type=\"button\" value=\"Zurück\" onClick=history.back()>";
        include(
    "template/footer.php");
        exit;

    Die durchsuchbaren Begriffe sind auch in anderen Sprachen geschrieben, die Akzente enthalten. Daher gibt es z.B. bei einer Suche nach "congié" eine Fehlermeldung, da das "é" nicht erlaubt ist.
    1. Gibt es eine Möglichkeit, nicht bestimmte Zeichen explizit zu erlauben, sondern die gängigen Buchstaben von bestimmten Sprachen oder Zeichensätzen?
    2. Gibt es eine Möglichkeit, auch eine Suche zum Erfolg führen zu lassen, die ohne Umlaute oder Buchstaben nicht-deutscher Zeichensätze ausgeführt wird? Ich denke da an Leute mit einer englischen Tastatur, die gar keine Umlaute auf einfachen Knopfdruck produzieren können, sondern erst den Umweg über die Zeichentabelle, Alt+xxxx oder die Installation eines deutschen Tastatur-Layouts gehen müßten.


    Technische Daten:
    - zu Hause MySQL 3.23.51-nt und PHP 4.2.1
    - online MySQL 3.23.55-Max-log und PHP4.x (Genaueres nicht bekannt)

  • #2
    Eine Variante wäre mittels RegExp die "kritischen Zeichen " zu erstezen

    Schaumal nach

    preg_match()
    chansel0049
    ----------------------------------------------------
    if you've reached the bottomline - dig further!
    Übersetzer gesucht? http://www.babelport.com

    Kommentar


    • #3
      Die Suche eines "gültigen" Strings an sich funktioniert ja wunderbar, von daher ist mir nicht klar, inwiefern preg_match helfen kann.

      Für RegExp gilt wohl mehr oder weniger dasselbe, denn meine Abfrage (sehr gekürzt, da diverse Tabellen einbezogen werden)
      Code:
      select *
      from songs
      where song_title like '%$suchtext%'
      hat mit korrekt (im Sinne der oben vorgegebenen Regel) eingegebenen Strings keine Probleme.

      Das einzige, was ich mir für RegExp vorstellen könnte, wäre daß man alle nicht regelkonformen Zeichen durch z.B. andere Zeichen ersetzt und dann damit sucht. Aber das kann man anscheinend auch mit LIKE machen.

      http://dev.mysql.com/doc/mysql/en/Pattern_matching.html
      "To find names containing exactly five characters, use five instances of the `_' pattern character" müßte sich ja übertragen lassen. So würde dann aus "congié" -> "congi_", und danach läßt sich ja anscheinend suchen. Hmm, aber hübsch finde ich das nicht.
      Zuletzt geändert von Maschenka; 09.05.2004, 00:16.

      Kommentar


      • #4
        OffTopic:
        Schau mal im MySQL-Manual nach FULLTEXT-suche... ist IMHO etwas schöner, auch wenn langsamer
        Die Musikreview Seite

        hi, i'm a signature virus. copy me into your signature to help me spread.

        Kommentar


        • #5
          FULLTEXT ist schick, danke. Vor allem scheint dadurch zumindest das Problem der "ähnlichen" Buchstaben wie é, ê, è gelöst zu sein. Damit bleibt nur die Frage, ob es bei der Überprüfung nach Eingabe eines Suchbegriffes eine elegantere Lösung gibt als alle Buchstaben, die momentan vorkommen können, einzeln zu benennen:

          if (!(eregi("^[a-z0-9äöüßáàâéèêíìîóòô etc...

          Da kann ganz schön was zusammenkommen, und am liebsten wäre es mir, wenn ich angeben könnte "Akzeptiere alle alphanumerischen Zeichen des deutschen, spanischen, französischen, englischen Alphabets".

          Wäre es sonst vielleicht einfacher, grundsätzlich alle Zeichen zu erlauben und nur bestimmte Zeichen auszuschließen?
          Zuletzt geändert von Maschenka; 09.05.2004, 09:34.

          Kommentar


          • #6
            die Suche nach "Test" per MATCH AGAINST mit Fulltextindex bringt auch "Tést" als Ergebniss
            TBT

            Die zwei wichtigsten Regeln für eine berufliche Karriere:
            1. Verrate niemals alles was du weißt!


            PHP 2 AllPatrizier II Browsergame

            Kommentar


            • #7
              Ja, das weiß ich, hatte ich auch oben schon geschrieben.
              Jetzt geht es mir nur noch darum, die Benutzereingaben zu überprüfen, bevor sie für eine Suche verwendet werden. Oder bin ich paranoid, wenn ich denke "never trust user input"?

              Edit: http://www.php.net/manual/en/function.ereg.php
              "A mistake will be to use [[:alpha:]] to detect a valid string for non US people. The reason is that all characters using circumflex (eg: â), tilde (ã), umlaut (ä), ring (å), grave (à) and acute (á) will be ignored!
              My solution is to change [[:alpha:]] to [A-Za-zÀ-ÖØ-öø-ÿ]"

              Das klingt doch schonmal vernünftig.

              Edit2: Zur Zeit teste ich nur lokal, aber das gefällt mir schon mal seeeehr gut.
              Zuletzt geändert von Maschenka; 09.05.2004, 10:31.

              Kommentar


              • #8
                warum guckst du dir den regulären ausdruck nicht von den variablen-bezeichnern in php ab ?

                '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'

                den unterstrich und die buchstaben könntest ja rauslassen ..
                vorauf ich hinaus will: variablennamen drüfen in php auch aus umlauten, etc bestehen
                mfg,
                [color=#0080c0]Coragon[/color]

                Kommentar


                • #9
                  Jetzt weiß ich wieder, was mir an FULLTEXT mißfiel: Man kann nur nach kompletten Wörtern suchen, nicht nach Wortteilen, im Gegensatz zu LIKE. Aber da die Suche mit LIKE Akzente u.ä. zu ignorieren scheint, werde ich dabei wohl bleiben.

                  Danke an alle für die Denkanstöße!


                  Edit:
                  Interessant, wenn das Ergebnis den String "congié" enthält, dann erhalte ich dieses Ergebnis für all diese Suchwörter: congié, congie, congiè, congiê, congië

                  Wenn ich hingegen als Ergebnis den String "ständchen" erhalten möchte, dann erhalte ich für folgende Suchwörter ein leeres Ergebnis: stándchen, standchen, stàndchen, stândchen

                  Gibt es dafür eine Erklärung?


                  Edit2:
                  Werden die deutschen Umlaute ä, ö und ü anders behandelt als andere Buchstaben mit Zeichen drüber oder drunter?

                  Wenn das Ergebnis den String "comáis" enthält, dann erhalte ich dieses Ergebnis für all diese Suchwörter: comáis, comàis, comais, comâis
                  Aber das Suchwort comäis liefert kein Ergebnis.
                  Zuletzt geändert von Maschenka; 09.05.2004, 13:23.

                  Kommentar

                  Lädt...
                  X