2012-11-05 85 views
1

目前,我有这个代码,我写了:不过它似乎只是完全忽略这一点,即使用户名是相同的(资本和这样)检查,如果用户名已存在

$username = $_POST['username']; 
$password = $_POST['password']; 
$rpassword = $_POST['rpassword']; 
$usrip = $_SERVER['REMOTE_ADDR']; 
$email = $_POST['email']; 
$errors = array(); 
$checkUsername = $odb -> prepare("SELECT COUNT(*) FROM `users` WHERE `username` = :username"); 
$checkUsername -> execute(array(':username' => $username)); 
$countUsername = $checkUsername -> fetchColumn(0); 
if ($checkUsername != 0) 
{ 
$errors['Username is already taken']; 
} 

它仍将允许用户注册制作2个相同的用户。我的数据库看起来是这样的:

http://puu.sh/1mTcZ/9b2ff3b68f44b4cc486beacc2d2b88fd

我似乎无法得到这个工作的。数据库结构如下所示: 精确(dbname)>用户(表)>用户名(行)

任何帮助非常感谢。

编辑:

一些变化,这是我有后,但我仍然似乎有同样的问题。

$checkUsername = $odb->prepare("SELECT COUNT(*) FROM `users` WHERE LOWER(`username`) = :username"); 
$checkUsername -> execute(array(':username' => $username)); 
$countUsername = $checkUsername -> fetchColumn(0); 
if ($checkUsername != 0) 
{ 
$errors['Username is already taken']; 
} 

用户名行现在也utf8_general_ci

+3

您的IF语句评估($ checkUsername!= 0)。不应该这样($ countUsername!= 0)? –

回答

2

好吧,我会后我的评论作为一个答案。

你的IF语句评估不正确的变量。它应该评估$ countUsername,而不是$ checkUsername。

而且,你似乎是不正确初始化你的错误阵列。尝试:

if ($countUsername != 0) 
{ 
    $errors[] = 'Username is already taken'; 
} 

我测试了这个在我的数据库,它的工作原理。

Collation = latin1_general_cs (cs = case sensitive) 
0

尝试表归类设置为 'utf8_general_ci'。 此外您可以在SQL查询更改为

$checkUsername = $odb->prepare("SELECT COUNT(*) FROM `users` WHERE LOWER(`username`) = :username"); 
+0

如果用户名拥有大写字母,这是否会导致它认为尚未注册的问题?我们当前的数据库在用户名中混合使用caps/nocaps。 – user1372896

+0

函数LOWER将在它将检查发布的值之前将该字段中的所有数据设置为小写,您也可以将其转换为小写字母 – DTukans

+0

示例:table包含3个带值的字段 - 登录,loGIN,登录时将它们转换为lowarcase它会是相同的'登录' – DTukans

相关问题