2012-11-05 124 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

相關問題