2015-02-04 1 views
1

중복 된 사용자 이름을 확인하고 데이터베이스에 이미 존재하는지 확인해야합니다. 그럴 경우 오류 메시지가 표시됩니다.

나는 사용자 이름으로하고 있지만 전자 메일 주소로도해야합니다.

여기 내 코드는 지금까지의 :

if(isset($_POST['submit'])){ 
    $first_name = $_POST['first_name']; 
    $last_name = $_POST['last_name']; 
    $username = $_POST['username']; 
    $password = $_POST['password']; 
    $email = $_POST['email']; 
    $IP = $_SERVER['REMOTE_ADDR']; 

    $query = mysql_query("SELECT username FROM Users WHERE username='".$username."'"); 

...

else if (mysql_num_rows($query) != 0) 
    { 
     echo "<p><b><center> <font color=\"red\">Username already exists.<br> </b>If you already have an account, please<a href = '../user/login.php'> click here </a> to login.</font></center></p>"; 
    } 

내 질문은 내가 이메일을 동일한 작업을 수행 할 수있는 방법입니까? $query = mysql_query("SELECT email FROM Users WHERE email='".$email."'"); 같은 이메일에 대한 다른 검색어가 필요하며 위 코드의 첫 번째 검색어 다음에 추가해야하나요?

나는 그것을 시도했다. 그러나 그것은 나에게 오류를 준다. 감사합니다. .

+1

** 외부 변수를 사용하여 SQL 문을 작성하면 코드가 SQL 삽입 공격에 취약 해집니다. ** 또한 "O'Malley"와 같이 작은 따옴표가있는 입력 데이터는 쿼리를 폭파시킵니다. 웹 응용 프로그램을 보호하기 위해 PDO 모듈을 사용하여 매개 변수가있는 쿼리에 대해 알아보십시오. [이 질문] (http://stackoverflow.com/questions/60174)에는 많은 상세한 예제가 있습니다. 위험의 대안 및 설명은 http://bobby-tables.com/php를 참조하십시오. 외부 데이터로 작성된 SQL 문을 실행하는 것은 문앞에서 발견 된 재료로 만든 스프를 먹는 것과 같습니다. –

+0

그냥 레코드를 삽입하지 않으시겠습니까? 아는 제약 조건으로 인해 실패하면 이미 그러한 레코드가 있습니다. 여기서는 고유 한 제약 조건이 이미 설정되어 있다고 가정합니다. –

답변

0
foreach ($fields as $field => $value) { 
$value = mysql_real_escape_string($value); 
$query = mysql_query("SELECT COUNT({$field}) AS n FROM Users WHERE {$field}='{$value}';"); 
$tuple = mysql_fetch_assoc($query); 
if ($tuple['n'] > 0) { 
    $dup = true; 
    break; 
} 

귀하가 찾고 계신 것입니다. 그러나주의해서 SQL 인젝션에 취약합니다.

+0

내 자신의 대답에서'$ fields'의 정의를 복사하여 붙여 넣어야합니다. 그렇지 않으면 코드가 제대로 작동하지 않을 수 있습니다. "$ fields is undefined"라는 메시지와 스크립트가 멈추지 않으면 SQL 오류가 발생합니다. – LSerni

1

아마도 가장 좋은 방법은 여러 쿼리를 실행하는 것입니다. 당신은 색인 생성과보다 나은 유지 보수의 이점을 누릴 수 있습니다.

mysql_ * 함수를 사용하면 안됩니다. 그들은 더 이상 사용되지 않으며 곧 제거 될 것입니다. 대신 을 사용하십시오 (또는 mysqli). D' Artagnan, 또는 오브라이언 - 누군가가 견적에 이름이있는 경우 적어도 피하기 SQL 주입, 또는 선의의 오류를 위해 당신의 가치를 탈출했다

. 아래 코드는 모두 문제에 대한 증거가 아니지만 가장 일반적인 문제를 가로 챌 수 있습니다.

// Fields to check for duplicate. 
$fields = array(
    'username' => $username, 
    'email' => $email 
); 

$dup = false; 
foreach ($fields as $field => $value) { 
    $value = mysql_real_escape_string($value); 
    $query = mysql_query("SELECT COUNT({$field}) AS n FROM Users WHERE {$field}='{$value}';"); 
    $tuple = mysql_fetch_assoc($query); 
    if ($tuple['n'] > 0) { 
     $dup = true; 
     break; 
    } 
} 

if ($dup) { 
    echo "<p><b><center> <font color=\"red\">{$field} already exists.<br> </b>If you already have an account, please<a href = '../user/login.php'> click here </a> to login.</font></center></p>"; 
} 

대신 쿼리 수를 검색 COUNT()의 사용은 색인에 따라 약간 더 효율적이 될 수 : 다시, PDO와 준비 쿼리는 당신에게 끝을 도울 것입니다.

+0

정말 고마워요! 정말 감사. 당신은 사이트의 첫 번째 사람으로, 실제로 코드와 자료에 넣음으로써 나를 도왔습니다. 감사합니다 :) – user2453646

+0

당신이 가장 환영합니다. 그러나 PDO로 전환하는 것을 고려하십시오. 우리는 멋진, 정직하게 보이라고 말하지 않습니다 :) - 그리고 나를 믿으세요, ** 그렇게하지 마세요. ** _POST 또는 _GET 변수를 곧바로 쿼리에 * * 삽입하십시오. @AndyLester - http://bobby-tables.com/에서 제안한 사이트를 확인하십시오. – LSerni