2012-05-02 5 views
5

Я пытаюсь создать систему с именем пользователя или адрес электронной почтыВойти с именем пользователя или адрес электронной почты в PHP

Мой код:

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

Войти с именем пользователя является успех, но войти в систему с электронной почтой не работает. Пожалуйста, помогите мне!

+0

$ email = $ _ REQUEST ['login']; это действительно электронная почта? –

+0

yes У меня есть адрес электронной почты в таблице user_db –

+0

Проверьте, установлен ли $ _REQUEST ['login'] - isset ($ _ REQUEST ['login']) и установите для него только $ username, если оно установлено. – dweiss

ответ

19

Параметр входа одинаковый как для электронной почты, так и для имени пользователя. Не совсем верно, если у вас есть одно окно для входа, которое принимает.

Вы можете поместить условие в запрос, если вы не уверены, что это адрес электронной почты или имя пользователя.

$login=$_REQUEST['login']; 
$query = "select * from user_db where (username='$login' OR email = '$login') and password='$password'" 

Редактировать: Раствор ПДО типа является гораздо более предпочтительным в настоящее время, как указано выше, подлежит инъекции 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(); 
+0

Он отлично работает ...... Спасибо за обмен –

+0

Что будет индексом для где .. или – Alien

0
$username=$_REQUEST['login']; 
$email=$_REQUEST['login']; 

Это неправильно, вы используете $_REQUEST['login'] как для электронной почты и имя пользователя. Почему бы вам просто не использовать электронную почту?

Если $_REQUEST['login'] не имеет адреса электронной почты, конечно, это не принесет вам ничего.

Кроме того, оба ваших оператора if всегда будут выполняться, если поля не пусты. правильно?

Выполните вход в систему, чтобы пользователи вводили логин с адресами электронной почты. также, возьмите md5 пароля. который хранит сырые пароли в эти дни?

+0

@ Darth Vader Я хотел бы предоставить возможность для пользователя только с одним параметром либо для входа с именем пользователя, либо по электронной почте –

2

Вы устанавливаете одно значение в две переменные, а затем используете if/else. Оба оператора if эквивалентны.

Вам необходимо выяснить, содержит ли $_REQUEST[login] действительный адрес электронной почты, и если да, используйте поле электронной почты базы данных. В противном случае используйте поле имени пользователя.

Кроме того, вы не должны помещать переменные непосредственно в запрос. Используйте подготовленные заявления.

-1
$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 для создания и выполнения своих запросов, чтобы предотвратить нарушения безопасности и облегчить вашу жизнь.

0
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)."'"; 
} 
+0

Что это методы проверки, вам нужно их объяснить. Кроме того, вы не должны указывать переменные в запросах. Это не безопасно. – scriptmonster

0

Ну я знаю, что это старый пост, но я нашел, что некоторые люди все еще собираются его увидеть, так что я хотел поставить простой способ, чтобы как адрес электронной почты и имя пользователя на тот же вход

мой код выглядит следующим образом

if 
    (!preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{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-]+)*(\.[a-z]{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 

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