2010-11-30 3 views
0

사용자 이름이나 이메일이 있는지 확인한 다음 오류 배열에 오류 메시지를 넣으십시오.검사 기록이 존재합니다. db - error 표시

$sql = "SELECT username, email FROM users WHERE username = '" . $username . "' OR email = '" . $email . "'"; 

$query = mysql_query($sql); 

if (mysql_num_rows($query) > 0) 
{ 
echo "That username or email already exists"; 
} 

그러나 나는 그것이 사용자 이름이나 넣어 다음 기존되고 이메일 있는지 확인하려면 : 지금은이

오류 [] = "사용자 이름이 존재한다"; // 사용자 이름이 존재하는 경우

오류 [] = "전자 메일이 있음"; // 이메일이있는 경우

어떻게 작성합니까?

+0

나는 "SQL Injection"냄새가 난다. –

+0

나는 $ username = mysql_real_escape_string ($ _ POST [ 'username']); 이메일 주소는 동일합니다. – Jake

+0

죄송합니다. 코드를 볼 수 없습니다. –

답변

1

당신이 그냥 빨리 진실을했다면 그것은 쉽게 될 것입니다/false를 SQL에 체크인하고 돌아온 플래그를 확인하십시오. 이 항목을 찾을 수없는 경우 if 조건이 괜찮 있도록

$sql = "SELECT " 
    . "(SELECT 1 FROM `users` WHERE `username` = '" . mysql_real_escape_string($username) . "'), " 
    . "(SELECT 1 FROM `users` WHERE `email` = '" . mysql_real_escape_string($email) . "')"; 

$query = mysql_query($sql); 

if (mysql_num_rows($query) > 0) { 
    $foundFlags = mysql_fetch_assoc($query); 
    if ($foundFlags['username']) { 
    $error[] = "username is existing"; 
    } 

    if ($foundFlags['email']) { 
    $error[] = "email is existing"; 
    } 
} else { 
    // General error as the query should always return 
} 

, 그것은, false로 평가 플래그에 NULL을 반환합니다. 이 같은 필드 목록을 일반화 할 수

참고 :

$fieldMatch = array('username' => $username, 'email' => $email); 

$sqlParts = array(); 
foreach ($fieldMatch as $cFieldName => $cFieldValue) { 
    $sqlParts[] = "(SELECT 1 FROM `users` WHERE `" . $cFieldName . "` = '" . mysql_real_escape_string($cFieldValue) . "')"; 
} 


$sql = "SELECT " . implode(", ", $sqlParts); 

$query = mysql_query($sql); 

if (mysql_num_rows($query) > 0) { 
    $foundFlags = mysql_fetch_assoc($query); 
    foreach ($foundFlags as $cFieldName => $cFlag) { 
    if ($foundFlags[$cFieldName]) { 
     $error[] = $cFieldName . " is existing"; 
    } 
    } 
} else { 
    // General error as the query should always return 
} 

NB. 모든 필드가 문자열이거나 다른 문자열 이스케이프 된 유형 (예 : 날짜/시간) 인 것으로 가정합니다.

+0

두 쿼리를 결합하는 방법을 좋아합니다. @jake 어떤 경우에는 쿼리를 분리해야 할 수도 있습니다. 이점은 신속한 오류 처리이며, MySQL로드가 적습니다. 최고 –

+0

@OV 보통 내 자신의 코드에서 여러 개의 쿼리로 코딩했을 수 있습니다. 그러나 OP는 더 짧고보다 포괄적 인 솔루션을 따를 것으로 보입니다. 서버 설정에 따라 기능이 가장 많이 달라집니다. 이러한 쿼리는 독립적이므로 서버와 내부적으로는 결과를 결합하기 위해 약간의 오버 헤드가있을 수 있지만 별도로 쿼리를 수행합니다. 그러나 클라이언트 인터페이스를 통해 두 개의 개별 쿼리를 수행하는 것보다 훨씬 적은 오버 헤드가 있습니다. 절약의 대부분은 이미 가지고있는 값이 아니라 1이나 NULL을 반환합니다. – Orbling

+0

동의합니다. 서버 설정은 어떤 솔루션을 구현하는 것이 가장 중요한 역할을 할 수 있습니다. 훌륭한 일자리는 정확히 필요한 것을 게시합니다. 베스트 –

0

하나의 행을 가져 와서 검색하는 이메일과 동일한 이메일이 있는지 또는 동일한 사용자 이름 또는 둘 다를 볼 수 있습니다. 이 중 하나와 일치하는 첫 번째 행을 찾은 후 중지 할 수 있으면 LIMIT 0,1을 수행 할 수 있습니다.

1

등록 할 때 사용자 이름이나 이메일이 이미 있는지 알려주는 것처럼 들립니다. 수행 할 수있는 작업은 다음과 같습니다.

<?php 
//---------------------------------------- 
// Create first query 
$usernameQuery = 'SELECT username FROM users WHERE username="'.mysql_real_escape_string($username).'"'; 

//---------------------------------------- 
// Query db 
$usernameResult = mysql_query($userNameQuery); 

//---------------------------------------- 
// Check if result is empty 
if(mysql_num_rows($usernameResult) > 0){ 

    //---------------------------------------- 
    // Username already exists 
    $error[] = 'Username already exists'; 

    //---------------------------------------- 
    // Return error to user and stop execution 
    // of additional queries/code 
} else { 

    //---------------------------------------- 
    // Check if email exists 

    //---------------------------------------- 
    // Create query 
    $emailQuery = 'SELECT email FROM users WHERE email="'.mysql_real_escape_string($email).'"'; 

    //---------------------------------------- 
    // Query the db 
    $emailResult = mysql_query($emailQuery); 

    //---------------------------------------- 
    // Check if the result is empty 
    if(mysql_num_rows($emailResult) > 0){ 

    //---------------------------------------- 
    // Email already exists 
    $error[] = 'Email already exists'; 

    //---------------------------------------- 
    // Return error to user and stop execution 
    // of additional queries/code 
    } else { 

    //---------------------------------------- 
    // Continue with registration... 
    } 
} 
?> 

실제 검색어를 실행하기 전에 항상 값을 이스케이프해야합니다.

추가 자료 :
http://us.php.net/manual/en/function.mysql-real-escape-string.php http://us.php.net/manual/en/function.mysql-escape-string.php

관련 문제