HP-User: Ungenaue Suche formulieren

Abend Leute

Ich habe dieses Unter-Auswahlmenü:

---------------------------------------------------------------
+-----------------------------------------------------+
| Einschlafzeit / Daten-Verwaltungs-Programm (EZ-DVP) |
+-----------------------------------------------------+

Kunden suchen <<

+-----------------------------------------------------+
| [1] Kunden suchen nach KD-Nummer...                 |
|                                                     |
| [2] Kunden suchen nach KD-Namen...                  |
|                                                     |
| [0] Zurück...                                       |
+-----------------------------------------------------+

Bitte Aufgabe wählen [x]:
---------------------------------------------------------------

Punkt "1" ist abgehakt und funktionsfähig. Wie Mach ich das bei Punkt "2", wenn man als Nutzer den Kundennamen nur so ungefähr weiss. Das resultiert wieder in einer Abfrage der DB:

"SELECT * FROM kunden WHERE kdfirma LIKE '$kdfirma'"

Wenn der Inputskalar $kdfirma ist, und ich nach zwei bis drei Buchstaben ein "%" eingebe, müsste das doch die DB schnallen. Da in Reinschrift ja auch
"SELECT * FROM kunden WHERE kdnummer LIKE 'Muster%'" alle Firmen mit Muster-irgendwas findet.

Das dumme ist, das alle Leute nur den Stern "*" als Jokerzeichen kennen. Rentiert da eine Umprogrammierung. Nach dem Motto wenn Eingabe gleich "*" bitte intern in "%" umschreiben und in die Select-Abfrage reinbuttern.

Ein Fall für Würmchencodes? (RegEX) *lol*

Wie würdet ihr das machen?

Gruss HP-User

  1. hi,

    die sache mit dem * fange ich als immer mit einer if ab und lasse dann das WHERE komplett weg. Das Spart dir rechenzeit. Je nach dem wie du die query zusammen baust, tut das auch nicht weh (wenn da noch mehr passiert als gezeigt).

    für deine abfrage
    "SELECT * FROM kunden WHERE kdfirma LIKE '$kdfirma'"
    würde ich empfehlen, einfach generell davor und danach das % zu setzen.
    Du unterstellst somit einfach direkt, dass die leute suchen möchten.
    Mit %suche% hast du alles gefangen, was irgendwie "suche" enthält.
    Sollte doch ausreichen oder?

    Gruß Niklas

    --
    Man muss nicht alles wissen, man sollte aber wissen, wo das nicht gewusste zu finden ist.
    1. Hi Niklas

      Mit %suche% hast du alles gefangen, was irgendwie "suche" enthält.
      Sollte doch ausreichen oder?

      Ja, die Variante gefällt mir ganz gut. Was ist bei:

      "Musterworx GmbH", wenn man dann mit "%muster%" sucht oder mit "%Muster%"?
      Quasi wenn vornedran nichts mehr ist. Findet er es dann trotzdem?
      Und Gross- und Kleinschreibung? Relevant für Suche mit "%"?

      Gruss HP-User

      1. Tach!

        Was ist bei: "Musterworx GmbH", wenn man dann mit "%muster%" sucht oder mit "%Muster%"?
        Quasi wenn vornedran nichts mehr ist. Findet er es dann trotzdem?

        MySQL findet solche Dinge. Irgendein anderes, glaube ich mich zu erinnern, fand sowas nicht. Aber die Beschreibungen von MySQL, Oracle und MS SQL Server sagen alle, dass % auch 0 Zeichen findet. Vielleicht war das auch ein anderes Szenario. Schau am besten in das Handbuch, das klärt solche Fragen auf direktem Weg.

        Und Gross- und Kleinschreibung? Relevant für Suche mit "%"?

        Die ist unabhängig von %/_ relevant oder auch nicht. Das kommt auf das DBMS an. Für MySQL ist hier die Kollation (Collation) entscheidend.

        dedlfix.

  2. Tach!

    Das dumme ist, das alle Leute nur den Stern "*" als Jokerzeichen kennen. Rentiert da eine Umprogrammierung. Nach dem Motto wenn Eingabe gleich "*" bitte intern in "%" umschreiben und in die Select-Abfrage reinbuttern.

    Suchen von * und Ersetzen durch % ist ein Funktionsaufruf. Den kannst du pauschal über den Eingabewert laufen lassen, ohne irgendwelche ifs und elses.

    Beachte, dass du deine Benutzereingaben nicht einfach so ins SQL-Statement reinschreiben darfst. Nimm die von Perl sicherlich angebotenen Prepared Statements oder behandle die Werte zu Fuss.

    dedlfix.

    1. Hi dedlfix

      Beachte, dass du deine Benutzereingaben nicht einfach so ins SQL-Statement reinschreiben darfst. Nimm die von Perl sicherlich angebotenen Prepared Statements oder behandle die Werte zu Fuss.

      I always use "prepare ;-)

      Merci trotzdem für den Hinweis.

      Gruss HP-User