2016-08-28 1 views
2

저는 MySQL을 처음 접했습니다.MySQL 효율적인 질의

$query1 ="SELECT id FROM signup WHERE Email='$Email_Input' LIMIT 1";    
$result1 = mysql_query($query1) 

$query2 = "SELECT id FROM signup WHERE User_name='$User_name' LIMIT 1";   
$result2 = mysql_query($query2); 

if (mysql_num_rows($result2)>0){  
echo '1'; 
} 
else if (mysql_num_rows($result1)>0){ 

echo '1'; 
} 

내 질문 : 내가 이메일 또는 사용자 이름이 테이블에 존재하는지 여부를 확인하려면 다음 쿼리를 사용하고

ID INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    User_name VARCHAR(35) NOT NULL, 
    Full_name VARCHAR(55) NOT NULL, 
    User_vars VARCHAR(255) NOT NULL, 
    BirthDay DATE NOT NULL, 
    password CHAR(70) NOT NULL, 
    Security_hint VARCHAR(27) NOT NULL, 
    Email VARCHAR(225) NOT NULL, 
    userType ENUM ('a','b','c','d') NOT NULL DEFAULT 'a', 
    Signup_Date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    activation TINYINT(1) UNSIGNED NOT NULL, 
    Ip BINARY(16) NOT NULL, 
    PRIMARY KEY (ID), 
    UNIQUE KEY User_name (User_name,Email) 

:이 테이블을 고려하면 하나 개의 쿼리를 실행하기위한 효율적인 방법이 있나요 둘 다의 존재를 확인 하느냐?

+2

WHERE Email = AND User_name ='이 (가) 사용자가 해당 열에 구성된 인덱스를 가지고 있기 때문에 가장 좋을 것입니다. – Mihai

+2

나는 당신의 코드가 SQL injection에 취약하다고 생각한다. 쿼리 문자열에 입력 값을 바로 입력하는 대신 준비된 문을 사용하십시오. –

+0

내 모든 변수는 XSS 및 SQL 주입에 대한 필터링 및 소독 된 데이터를 보유합니다. – Tim

답변

2

예,이 작업을 수행 할 수 있습니다

이 두 개의 서로 다른 레코드가있는 경우입니다
SELECT ID FROM signup WHERE Email ='$Email_Input' LIMIT 1 
UNION ALL 
SELECT id FROM signup WHERE User_name='$User_name' LIMIT 1 

. 동일한 레코드가 두 조건에 모두 응답해야한다면 간단하게 :

SELECT ID FROM signup 
WHERE Email ='$Email_Input' 
    AND User_name='$User_name' 
LIMIT 1