2010-11-30 33 views
0

Mon sautées système d'enregistrement des comptes procède ainsi:sur le registre, vérifiez si le nom d'utilisateur existe - problème de capitalisation

  1. formulaire d'inscription complet
  2. vérifier si le nom d'utilisateur existe déjà - rejeter/pass
  3. copie des données à température table utilisateur, envoyez un courriel de confirmation
  4. sur l'utilisation lien dans l'email de confirmation, copier les données de température à la table d'utilisateur actif

L'autre jour, un utilisateur m'a envoyé un e-mail pour me dire qu'il recevait le message d'erreur "Impossible de créer l'utilisateur".

Je ne me souvenais pas avoir jamais entendu ça, donc je creusé dans mon code d'enregistrement et que l'erreur ressorte si la requête pour insérer les données temporaires dans la table d'utilisateur actif échoue.

Il a échoué parce que son nom d'utilisateur, qui a un index unique dans la table, existait déjà dans le tableau utilisateur actif ... mais il avait passé la vérification du nom d'utilisateur existant initial ...?

se sont avérés le nom qu'il avait essayé d'enregistrer était « Utilisateur », mais il y avait déjà un « utilisateur » - donc insensibilité à la casse est entrée en jeu.

Est-ce que le nom d'utilisateur existe? chaîne de requête:

SELECT username FROM user_basic_data WHERE username='$cleanTempUsername' 

confirmé, insérez maintenant en chaîne de table active: (! "Utilisateur" = "user")

INSERT INTO user_basic_data (username, ...) VALUES ('$activeUsername', ...) 

Ainsi, le sensibilité à la casse applique apparemment lorsque je lance une instruction select mais ne s'applique pas lorsque je lance un insert.

est important de capitalisation de nombreux utilisateurs, alors quel est mon solution de moindre résistance d'ici?

Répondre

0

meilleure solution serait probablement d'utiliser un classement sensible à la casse pour vos tables.

Peut-être essayer latin1_bin ou utf8_bin.

+0

Est-ce que le changement de classement affecte maintenant mes données? Ou est-ce un genre de chose qui n'est pas sûr, qui vérifie et vérifie? – Drew

+0

Il devrait convertir automatiquement les données au nouveau classement sans le modifier. La seule fois où vous rencontrez des problèmes, c'est que vous passez d'une sensibilité à la casse à l'insensibilité. –

0

si vous voulez les noms d'utilisateur majuscules sensibles utilisent un type de données varbinary ...

create table users 
(
user_id int unsigned not null auto_increment primary key, 
username varbinary(32) unique not null, 
... 
) 
engine=innodb; 

insert into users (username) values ('foo'),('Foo'),('FOO'); 
0

Vous pouvez faire pour l'entrée d'un nom en minuscule quel que soit l'entrée php strtolower() ou MySQL BAS(). De cette façon, ils peuvent utiliser n'importe quel cas, mais la base de données traite toujours les noms d'utilisateur en minuscules. Bien sûr, cela signifie que vous ne pouvez avoir qu'un seul nom d'utilisateur avec le nom 'utilisateur', mais cela résout le problème d'insensibilité à la casse et permet aux utilisateurs de taper n'importe quel cas pour leur nom d'utilisateur avec un seul changement. Ne fais pas ça avec le mot de passe.