Я пытаюсь создать логин с именем пользователя или электронной почтой
Мой код:
$username=$_REQUEST['login']; $email=$_REQUEST['login']; $password=$_REQUEST['password']; if($username && $password) { $query="select * from user_db where username='$username' and password='$password'"; } else if ($email && $password) { $query="select * from user_db where email='$email' and password='$password'"; }
Войти с именем пользователя успешно, но логин с электронной почтой не работает. Пожалуйста, помогите мне!
Параметр входа одинаковый как для электронной почты, так и для имени пользователя. Не совсем верно, если у вас есть одно окно для входа, которое принимает.
Вы можете поставить условие в самом запросе, если не уверены, что это адрес электронной почты или имя пользователя.
$login=$_REQUEST['login']; $query = "select * from user_db where ( username='$login' OR email = '$login') and password='$password'"
Редактирование: PDO-подобное решение является гораздо более предпочтительным в настоящее время, поскольку вышеупомянутое подвержено SQL-инъекции. Логика остается прежней, но вы бы выглядели примерно так:
$query = " SET @username = :username SELECT * FROM user_db WHERE ( username = @username OR email = @username) AND password = :password "; $statement = $pdoObject->prepare($query); $statement->bindValue(":username", $login, PDO::PARAM_STR); $statement->bindValue(":password", $password, PDO::PARAM_STR); $statement->execute();
Вы устанавливаете одно значение для двух переменных, а затем используете if / else. Оба оператора if эквивалентны.
Вам нужно выяснить, содержит ли $_REQUEST[login]
действительный адрес электронной почты, и если это так, используйте поле электронной почты базы данных. В противном случае используйте поле имени пользователя.
Кроме того, вы не должны помещать переменные непосредственно в запрос. Используйте подготовленные заявления.
$username=$_REQUEST['login']; $email=$_REQUEST['login'];
в$username=$_REQUEST['login']; $email=$_REQUEST['login'];
Это неправильно, вы используете $_REQUEST['login']
для электронной почты и имени пользователя. Почему бы вам просто не использовать электронную почту?
Если $_REQUEST['login']
не имеет адреса электронной почты, конечно, это не принесет вам ничего.
Кроме того, оба ваших оператора if всегда будут выполняться, если поля не пусты. правильно?
Возьмите логин, чтобы пользователи вводили логин с адресами электронной почты. также, возьмите md5 пароля. который хранит сырые пароли в эти дни?
if (validate_username($username)) { $query="select * from user_db where username='".$username".' and password='".validate_password($password)."'"; } else if (validate_email($email)) { $query="select * from user_db where email='".$email."' and password='".validate_password($password)."'"; }
Ну, я знаю, что это старый пост, но я обнаружил, что некоторые люди все еще собираются его просмотреть, поэтому я хотел поставить простой способ разрешить как электронную почту, так и имя пользователя на одном и том же входе
мой код выглядит следующим образом
if (!preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[az]{2,3})$/", $name_of_same_input) ) { $un_check = mysql_query("SELECT uname FROM eusers WHERE uname = '' ") or die(mysql_error()); echo "loging in with username"; //code } elseif (preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[az]{2,3})$/", $name_of_same_input) ) { $un_check = mysql_query("SELECT umail FROM eusers WHERE umail = '' ") or die(mysql_error()); echo "loging in with email"; //code }
$username=$_REQUEST['username'];//I'm assuming your code here was wrong $email=$_REQUEST['email'];//and that you have three different fields in your form $password=$_REQUEST['password']; if (validate_username($username)) { $query="select * from user_db where username='".$username".' and password='".validate_password($password)."'"; } else if (validate_email($email)) { $query="select * from user_db where email='".$email."' and password='".validate_password($password)."'"; } //... elsewhere... function validate_username(&$username) { if (strlen($username) <= 1) { return false; } //return false for other situations //Does the username have invalid characters? //Is the username a sql injection attack? //otherwise... return true; } function validate_email(&$email) { //same deal as with username } function validate_password(&$password) { //same deal as with username }
Обратите внимание: если у вас есть только два поля (логин и пароль), то различие между электронной почтой и именем пользователя не имеет смысла. Обратите внимание, что вы действительно должны использовать PHP PDO для создания и выполнения ваших запросов, чтобы предотвратить нарушения безопасности и облегчить вашу жизнь.