2010-11-30 2 views
0

Как проверить, существует ли имя пользователя или адрес электронной почты, а затем помещать сообщение об ошибке в мой массив ошибок. Сейчас у меня есть:Проверить запись существует db - показать ошибку

$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» – 2010-11-30 18:34:47

+0

Нет, совсем нет, потому что у меня есть: $ username = mysql_real_escape_string ($ _ POST ['username']); и то же самое для электронной почты – Jake 2010-11-30 18:38:46

ответ

1

Было бы проще, если бы вы только что сделали быстрый правда/false проверить в SQL и проверить флаг, который вернулся.

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

Когда он не находит запись, то он вернет NULL в флаге, который оценивает ложь, поэтому условие if прекрасно.

Обратите внимание, что вы могли бы обобщить для списка полей, как это:

$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

Вы можете получить одну строку и посмотреть, есть ли у вас тот же адрес электронной почты, который вы ищете, и то же имя пользователя или и то, и другое. Вы можете сделать 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

Смежные вопросы