Toon posts:

[PHP+mysql] Probleem met hoofdletter gevoeligheid

Pagina: 1
Acties:
  • 163 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik heb een probleempje met de hoofdletter gevoeligheid van mijn login script.

Als een nieuwe gebruiker zich aanmeld kan hij bv opgeven als username: gebrUiker
Nu is er bv al iemand die heet: Gebruiker

Wat is het probleem...... Het script ziet dit dus als een andere user en laat dit toe omdat deze hoofdletter gevoelig is. En dat wil ik dus niet.
(hier kom ik nu achteraf pas achter nu het script al onlne is)

Ik wil dat de username niet hoofdletter gevoelig is.

Ik heb dit getracht op te lossen met wat aangepaste zoek queries:
code:
1
2
3
4
5
6
$result = mysql_query("SELECT username FROM ".$prefix."_users WHERE STRCMP(username,'$newusername')");
en deze:
$result = mysql_query("SELECT username FROM ".$prefix."_users WHERE NOT STRCMP(username,'$newusername')");

origineel is het deze:
$result = mysql_query("SELECT username FROM ".$prefix."_users WHERE username='$newusername'");

Al deze querys werken niet zoals ik wil, ik kan bij elke query nog steeds dezelfde username aanmaken maar telkens met andere hoofdletters.

Het veld username is een varchar, welke dus hoofdletter gevoelig is.

Welke query kan ik nu het beste gebruiken zodat ie zoekt in mijn database waar het niet uitmaakt of de nieuwe username nu met hoofdletters of kleine letter of een combinatie ervan is gebruikt.

Op dit moment kan ik dus meerdere users hebben met allemaal dezelfde username alleen ieder met andere hoofdletters, dit wil ik dus niet.

Het gaat dus niet om het inloggen maar puur op het verifieren of de nieuwe gewenste gebruikersnaam al in gebruik is of niet.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Zoiets?
SQL:
1
2
3
SELECT `username`
FROM `users`
WHERE LCASE(username) = LCASE('$newusername')

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • JeRa
  • Registratie: Juni 2003
  • Laatst online: 30-04-2025
SQL:
1
2
3
SELECT `username`
FROM `users`
WHERE `username` LIKE '$newusername'

Waarbij je moet opletten dat de inhoud van $newusername geen % of _-tekens bevat, dat zijn immers speciale tekens in een LIKE-clause.

[ Voor 6% gewijzigd door JeRa op 09-10-2005 07:59 ]


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Gewoon gaan voor een lcase functie zoals nme al zegt, alhoewel ik meestal alleen de userinput lcase en niet de waarde in de dbase. Dan kan ik namelijk een user blokkeren door gewoon 1 hoofdletter in zijn naam te zetten. Plus dat door mijn invoer scripts controle toch niemand een hoofdletter in de db krijgt. Dus alle hoofdletters in de Db zijn bewust gedaan.

Nadeel van like vind ik de performance, plus dat like volgens mij best een keertje een andere user kan vinden. Als deze hetzelfde wachtwoord heeft heb je de poppen aan het dansen.

[ Voor 21% gewijzigd door Gomez12 op 09-10-2005 16:16 ]


  • pietje63
  • Registratie: Juli 2001
  • Laatst online: 23:24

pietje63

RTFM

Hmm, als je met een gewone select controleert of de naam al bestaat gaat het ook al goed, omdat een gewone select niet hoofdlettergevoelig is (kwam ik laatst helaas achter, want bleek een veiligheids probleem in een script van mij te zijn)

zie ook http://dev.mysql.com/doc/mysql/en/case-sensitivity.html

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
pietje63 schreef op zondag 09 oktober 2005 @ 16:48:
Hmm, als je met een gewone select controleert of de naam al bestaat gaat het ook al goed, omdat een gewone select niet hoofdlettergevoelig is (kwam ik laatst helaas achter, want bleek een veiligheids probleem in een script van mij te zijn)

zie ook http://dev.mysql.com/doc/mysql/en/case-sensitivity.html
Hmm ok, afi. Er is 1 goede methode in dit topic gegeven, door -nme-. Deze methode werkt op bijna alle dbases. Maar nee, laten we nog even een vage mysql "error"/snelheidshack gaan gebruiken, zodat als je een andere dbase wilt gebruiken je deze query ook nog eens mag opschonen.

P.S. Deze "functie" van mysql is gewoon een grote error in mijn ogen, niet gebruiken. Deze heeft mij al tig keer door allerlei query's lopen zoeken die niet goed draaiden totdat ik ze op een andere dbase dan mysql draaide. Als ik zeg dat ik "a" zoek, zoek ik geen "A".

P.P.S. Dit was even een leuke uitlaatklep.
Pagina: 1