2012-05-02 15 views
5

Estoy tratando de crear un inicio de sesión con nombre de usuario o correo electrónicode inicio de sesión con nombre de usuario o dirección de correo electrónico en php

Mi código es:

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

Entrar con nombre de usuario es el éxito, sino sesión con el correo electrónico no está funcionando. ¡Por favor, ayúdame!

+0

$ email = $ _ REQUEST ['login']; ¿Es esto realmente correo electrónico? –

+0

sí, tengo un correo electrónico en la tabla user_db –

+0

Compruebe si $ _REQUEST ['login'] está configurado - isset ($ _ REQUEST ['login']) y solo configure $ username para eso si está configurado. – dweiss

Respuesta

19

El parámetro de inicio de sesión es el mismo tanto para el correo electrónico como para el nombre de usuario. No es exactamente incorrecto si tiene un solo cuadro de inicio de sesión que acepta cualquiera.

Puede poner la condición en la consulta si no está seguro de si se trata de un correo electrónico o un nombre de usuario.

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

Editar: Una solución PDO-como es mucho más preferido hoy en día como el anterior está sujeta a la inyección de SQL. La lógica sigue siendo el mismo, pero que tendría que ser algo como esto:

$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

Está funcionando muy bien ...... Gracias por compartir –

+0

¿Qué va a ser el índice de donde .. o – Alien

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

Esto está mal, está utilizando $_REQUEST['login'] tanto para el correo electrónico y nombre de usuario. ¿Por qué no solo usas el correo electrónico?

Si $_REQUEST['login'] no tiene dirección de correo electrónico, por supuesto, esto no le devolverá nada.

Además, ambas sentencias if se ejecutarán siempre, a menos que los campos estén vacíos. ¿derecho?

Anote la sesión y haga que los usuarios inicien sesión con las direcciones de correo electrónico. también, tome md5 de la contraseña. ¿quién almacena contraseñas sin procesar en estos días?

+0

@ Darth Vader me gustaría ofrecer una opción de usuario sólo con un parámetro, ya sea para iniciar sesión con nombre de usuario o correo electrónico –

2

Está configurando el mismo valor para dos variables y luego usa if/else. Ambas declaraciones if son equivalentes.

Necesita averiguar si $_REQUEST[login] contiene una dirección de correo electrónico válida, y si es así, utilice el campo de correo electrónico de la base de datos. De lo contrario, use el campo de nombre de usuario.

Además, no debería incluir variables directamente en la consulta. Use declaraciones preparadas.

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

Nota, si usted tiene sólo dos campos (nombre de usuario y contraseña), entonces la distinción entre el correo electrónico y el nombre de usuario no tiene sentido . Además, tenga en cuenta que realmente debería estar usando PHP PDO para construir y ejecutar sus consultas, para evitar violaciones de seguridad y facilitar su vida.

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

Lo son los métodos de validación, debes explicarlos. Además, no debe concatar variables en las consultas. Esto no es seguro. – scriptmonster

0

Bien sé que esto es una entrada antigua, pero me he dado cuenta que algunas personas todavía van a verla, así que quería poner un camino más fácil para permitir que tanto el correo electrónico y el nombre de usuario en la misma entrada

mi código es el siguiente

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 

    } 
Cuestiones relacionadas