Search function SQL

  • Goedemiddag,


    Ik ben bezig met het maken van een search function binnen mijn eigen website.


    Je kan op dit moment zoeken op voornamen. (in de database staan de namen met een hoofdletter opgeslagen) Gezien het feit dat namen opgeslagen zijn met een hoofdletter krijg ik niet het gewenst resultaat.


    Zodra ik bijvoorbeeld 'Anja' probeer te zoeken kan dit alleen met 'A', 'An', 'Anj' etc. Maar het lijkt me ook logisch dat ik 'Anja' krijg zodra ik zoek met 'anj' (zonder hoofdletter). Dit gebeurt alleen niet.


    Mijn Query:


    Code
    "SELECT * FROM user WHERE voornaam LIKE '%".$_SESSION['keyword']."%'"


    Kort gezegd:
    - De query die ik momenteel gebruik zoekt hoofdletter gevoelig. Kan dit zo gemaakt worden dat ik met én zonder hoofdletters een gewenst resultaat kan krijgen.



    Alvast bedankt,



    Corné

  • Guest, wil je besparen op je domeinnamen? (ad)
  • Normaal zijn tekstvergelijkingen zoals LIKE case-insensitive, tenzij je database, tabel of kolom een case-sensitive collation heeft (of je kolom de toevoeging BINARY heeft).


    Je collation geeft aan hoe tekst vergeleken en gesorteerd wordt. Om expliciet een case-insensitive vergelijking te doen geef je dit als volgt aan (er vanuit gaande dat je een utf8 character encoding gebruikt):

    SQL
    SELECT *
    FROM table
    WHERE case_sensitive_column LIKE '%search_term%' COLLATE utf8_general_ci

    Overigens doe je er altijd verstandig aan user input te escapen in je queries met de daarvoor bestemde functie.


    EDIT: voorbeeld

  • Andere, maar over het algemeen minder kwalitatieve, oplossingen zijn:


    • Mogelijkerwijs is het voor het systeem sneller om binnen PHP gewoon de eerste letter die uppercasen. Dit is wel nadelig voor de onderhoud en foutgevoelig.
    • Binnen de search query LOWER of UPPER gebruiken. Nadeel is dat dit trager is dan de oplossing van FangorN en je dient de string ook te uppen of te lowren.
  • Bedankt voor je reactie @FangorN.


    Het probleem zat inderdaad in de database. De collatie van de kolom stond op 'utf8_bin' en heb dit veranderd naar 'utf8_general_ci'.

    Andere, maar over het algemeen minder kwalitatieve, oplossingen zijn:


    • Mogelijkerwijs is het voor het systeem sneller om binnen PHP gewoon de eerste letter die uppercasen. Dit is wel nadelig voor de onderhoud en foutgevoelig.
    • Binnen de search query LOWER of UPPER gebruiken. Nadeel is dat dit trager is dan de oplossing van FangorN en je dient de string ook te uppen of te lowren.

    Hier had ik ook aan gedacht. Dan zou ik veel stukken code moeten veranderen. En een tabel moeten converten (waar alles met een of meerdere hoofdletters er in staat). Iets in me zei dat het makkelijker kon worden opgelost. Het is op de manier van @FangorN gelukt :)



    Corné

  • Uhm, in het algemeen is het eigenlijk wel oké als een username-kolom (van zich)zelf case-sensitive is, dus ik weet niet of het aanpassen van de kolomdefinitie de beste oplossing is, dat zul je zelf moeten uitmaken (maar houd wel rekening met de consequenties).


    Tenzij je in je login je username IN CAPS wilt kunnen intypen, of in BrEeZaH-stijl.


    Hangt ook een beetje van je query af waarmee logingegevens worden opgehaald, natuurlijk.


    En als de controle bij registratie van nieuwe gebruikers ook case-INsensitive is (ik neem aan dat je gebruikersnamen uniek wilt laten zijn).


    Let dus wel op de gevolgen van dit besluit tot structuurwijziging.

Participate now!

Heb je nog geen account? Registreer je nu en word deel van onze community!