2009-11-07 6 views
0

J'essaie de faire un formulaire d'inscription. Lorsque l'utilisateur publie les champs, je vérifie USER_NAME. S'il existe alors ne pas insérer la ligne à MYSQL.Case Requête sensible dans php

Après post:

$check = "SELECT name FROM test WHERE name='".$_POST['user_name']."'; 
$result = mysql_query($check) or die (mysql_error()); 
$numrows = mysql_num_rows($resutl); 
if ($numrow != 0){ 
    echo "exist"; exit;   
}else{ 
    insert..... 
}  

Dans la base de données que j'ai une ligne avec user_name = Test

Si la valeur affichée est test, ok, mais si je poste "test" ou "test" ou quelque chose d'autre, puis la rangée iserted.

Comment peut-il être insensible à la casse? Je pense que je devrais utiliser str en minuscule à la valeur affichée, mais dans la requête ... comment puis-je faire cela?

Merci

Répondre

2

Si la collation de votre champ est un insensible à la casse (comme utf8_general_ci ou latin1), vous pouvez utiliser l'opérateur LIKE pour faire un match insensible à la casse.

"SELECT * FROM test WHERE name LIKE '$username';" 
+0

j'ai changé le classement de UTF-8 à Latin2 et fonctionne maintenant très bien. Je vous remercie. – Holian

2

essayez SELECT name FROM test WHERE UPPER(name)='".strtoupper($_POST['user_name'])."'

sachez que vous devez correctement échapper affiché le nom d'utilisateur (voir php mysql_real_escape_string fonction)

+1

Méfiez-vous des menaces XSS potentielles que ce morceau de code pourrait causer. Vous devriez définitivement filtrer votre entrée. – pestaa

+0

@pestaa: J'étais en train d'éditer pour ajouter un avertissement –

+0

Cela ne fonctionne pas avec les caractères latins. UPPER et STRTOUPPER donnent des résultats différents aux caractères latins. – Holian

1

La sensibilité à la casse dépend aussi du type de données de la colonne. Vous pouvez probablement résoudre le problème sans le surcoût supplémentaire des conversions de chaîne (c'est-à-dire et strtoupper()) en changeant le type de colonne en VARCHAR.

From the MySQL Manual:

Pour les chaînes non binaires (CHAR, VARCHAR, TEXT), les recherches de chaînes utilisent le classement des opérandes de comparaison. Pour les chaînes binaires (BINARY, VARBINARY, BLOB), les comparaisons utilisent les valeurs numériques des octets dans les opérandes; cela signifie que pour les caractères alphabétiques, les comparaisons seront sensibles à la casse.

Une comparaison entre une chaîne non binaire et une chaîne binaire est traitée comme une comparaison de chaînes binaires.

Les opérations de comparaison simples (> =,>, = <, < =, le tri et le regroupement) sont basées sur la «valeur de tri» de chaque caractère. Les caractères ayant la même valeur de tri sont traités comme le même caractère. Par exemple, si "e" et "é" ont la même valeur de tri dans un classement donné, ils se comparent comme égaux.

+0

le type de données était "texte". Je l'ai changé en varchar (30), mais ne fonctionne toujours pas .. – Holian