2012-05-02 27 views
5

tôi đang cố gắng để tạo ra một đăng nhập với Tên truy nhập hoặc emailđăng nhập với tên truy cập hoặc địa chỉ email trong php

Mã của tôi là:

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

Đăng nhập với tên người dùng là thành công nhưng đăng nhập với email không hoạt động. Làm ơn giúp tôi!

+0

$ email = $ _ YÊU CẦU ['đăng nhập']; đây có phải là email thực sự không? –

+0

vâng tôi có email trong bảng user_db –

+0

Kiểm tra xem $ _REQUEST ['login'] được đặt - isset ($ _ REQUEST ['login']) và chỉ đặt $ username cho nó nếu nó được đặt. – dweiss

Trả lời

19

Thông số đăng nhập giống nhau cho cả email và tên người dùng. Không chính xác không chính xác nếu bạn có một hộp đăng nhập duy nhất chấp nhận một trong hai.

Bạn có thể đặt điều kiện trong truy vấn nếu bạn không chắc chắn đó là email hay tên người dùng.

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

Edit: Một giải pháp PDO-like được nhiều ưa thích hiện nay như ở trên là tùy thuộc vào SQL injection. Logic vẫn như cũ, nhưng bạn muốn có nó trông giống như thế này:

$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

Nó hoạt động tốt ...... Cảm ơn bạn đã chia sẻ –

+0

Chỉ số nào sẽ là nơi .. hoặc – Alien

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

Điều này sai, bạn đang sử dụng $_REQUEST['login'] cho cả email và tên người dùng. Tại sao bạn không chỉ sử dụng email?

Nếu $_REQUEST['login'] không có địa chỉ email, tất nhiên điều này sẽ không trả lại cho bạn bất cứ điều gì.

Ngoài ra, cả hai câu lệnh if của bạn sẽ luôn thực thi, trừ khi các trường trống. đúng?

Đăng xuất, yêu cầu người dùng đăng nhập bằng địa chỉ email. cũng, lấy md5 của mật khẩu. người lưu trữ mật khẩu thô những ngày này?

+0

@ Darth Vader tôi muốn cung cấp một tùy chọn cho người dùng chỉ với một tham số hoặc để đăng nhập bằng tên người dùng hoặc email –

2

Bạn đang đặt cùng một giá trị cho hai biến và sau đó sử dụng if/else. Cả hai câu lệnh if đều tương đương nhau.

Bạn cần tìm hiểu xem $_REQUEST[login] có chứa địa chỉ email hợp lệ không và nếu có thì hãy sử dụng trường email của cơ sở dữ liệu. Nếu không, hãy sử dụng trường tên người dùng.

Ngoài ra, bạn không nên đặt biến trực tiếp vào truy vấn. Sử dụng báo cáo đã chuẩn bị.

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

Lưu ý, nếu bạn chỉ có hai lĩnh vực (đăng nhập và mật khẩu), sau đó sự khác biệt giữa email và tên người dùng là vô nghĩa . Lưu ý thêm rằng bạn thực sự nên sử dụng PHP PDO để xây dựng và thực hiện các truy vấn của mình, để ngăn chặn các vi phạm an ninh và làm cho cuộc sống của bạn trở nên dễ dàng hơn.

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

Điều gì là các phương thức xác thực, bạn cần giải thích chúng. Bên cạnh đó bạn không nên concat biến vào truy vấn. Điều này không an toàn. – scriptmonster

0

Vâng tôi biết đây là một bài cũ nhưng tôi đã phát hiện ra rằng một số người vẫn đang đi để xem nó vì vậy tôi muốn đặt một cách dễ dàng để cho phép cả email và tên người dùng trên cùng một đầu vào

mã của tôi như sau

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 

    } 
Các vấn đề liên quan