확인

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

확인에 SQL 쿼리를 변경할 수 있습니다.

IF 문이 잘못된 변수를 평가 중입니다. 그것은 $ checkUsername이 아니라 $ countUsername을 평가해야합니다.

오류 배열을 잘못 초기화하는 것처럼 보입니다. 시도 :

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

나는 이것을 데이터베이스에서 테스트했으며 작동한다.

Collation = latin1_general_cs (cs = case sensitive) 
0

시도 utf8_general_ci. 은 또한 당신은 내가 대답으로 내 댓글을 게시 할 수 있습니다,

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

사용자 이름에 자본이 있으면 등록되지 않았다고 생각되면서 문제가 발생합니까? 우리의 현재 데이터베이스는 사용자 이름에 대문자/nocaps가 섞여 있습니다. – user1372896

+0

함수 LOWER는 해당 필드의 모든 데이터를 소문자로 설정하여 게시 된 값으로 확인합니다. 또한 소문자로 변환 할 수 있습니다. – DTukans

+0

예 : 테이블에 값이있는 3 개의 필드가 있습니다 - 로그인, loGIN, 로그인하면 lowarcase로 변환됩니다. 같아요 '로그인' – DTukans