2016-08-28 3 views
2

Я довольно новичок в MySQL. Учитывая эту таблицу:MySQL эффективный запрос

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) 

Я использую следующие запросы для проверки, существует ли адрес электронной почты или имя пользователя в этой таблице:

$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'; 
} 

Мой вопрос: Есть ли эффективный способ выдавать только один запрос проверить существование обоих?

+2

'WHERE Email = AND User_name =' было бы лучше, так как у вас также есть сложенный индекс для этих столбцов. – Mihai

+2

Я считаю, что ваш код уязвим для SQL-инъекции. Используйте готовые заявления вместо того, чтобы вводить введенное значение прямо в строку запроса. –

+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