Как проверить, существует ли имя пользователя или адрес электронной почты, а затем помещать сообщение об ошибке в мой массив ошибок. Прямо сейчас у меня есть:
$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"; }
Но я хочу проверить, является ли это именем пользователя или существующей электронной почтой, а затем поставить:
error [] = "имя пользователя существует"; // если имя пользователя существует
error [] = «электронная почта существует»; // если письмо существует
Как сделать?
Было бы проще, если бы вы просто выполнили быструю проверку подлинности / ложь в 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 в флагом, который оценивает значение false, поэтому условие 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. Обратите внимание, что предполагается, что все поля являются строками или другими типами экранированных строк (например, дата / время).
Похоже, вы пытаетесь сообщить пользователям, есть ли имя пользователя или электронная почта во время регистрации. Вот что вы можете сделать:
<?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
Вы можете получить одну строку и посмотреть, есть ли у вас тот же адрес электронной почты, который вы ищете, и то же имя пользователя или и то, и другое. Вы можете сделать LIMIT 0,1, если вы можете остановиться после поиска первой строки, соответствующей тому или иному.