2012-05-02 2 views
5

Próbuję utworzyć login z nazwą użytkownika lub e-mailZaloguj się podając nazwę użytkownika lub adres e-mail w php

Mój kod to:

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

Zaloguj się podając nazwę użytkownika jest sukcesem, ale Zaloguj się e-mail nie działa. Proszę pomóż mi!

+0

$ email = $ _ REQUEST [ 'login']; czy to naprawdę e-mail? –

+0

Tak, mam adres e-mail w tabeli user_db –

+0

Sprawdź, czy ustawiony jest $ _REQUEST ['login'] - isset ($ _ REQUEST ['login']) i ustaw dla niego tylko nazwę $ user, jeśli jest ustawiony. – dweiss

Odpowiedz

19

Parametr logowania jest taki sam dla adresu e-mail i nazwy użytkownika. Niezupełnie niepoprawny, jeśli masz jedno pole logowania, które akceptuje.

Możesz umieścić warunek w samym zapytaniu, jeśli nie masz pewności, czy jest to e-mail lub nazwa użytkownika.

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

Edycja: PDO podobne rozwiązanie jest o wiele bardziej korzystne, ponieważ obecnie powyżej podlega iniekcji SQL. Logika pozostaje taka sama, ale trzeba to wyglądać mniej więcej tak:

$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

Działa świetnie ...... Dzięki za udostępnianie –

+0

Co będzie indeks dla gdzie .. lub – Alien

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

To jest złe, używasz $_REQUEST['login'] zarówno dla e-maila, jak i nazwy użytkownika. Dlaczego po prostu nie skorzystasz z e-maila?

Jeśli adres $_REQUEST['login'] nie ma adresu e-mail, oczywiście nie spowoduje to zwrotu.

Również obie twoje instrukcje if będą zawsze wykonywane, chyba że pola są puste. dobrze?

Wyloguj się, wymuś na użytkownikach logowanie przy użyciu adresów e-mail. również, weź md5 hasła. kto przechowuje surowe hasła w tych dniach?

+0

@ Darth Vader Chciałbym zapewnić opcję dla użytkownika tylko z jednym parametrem, czy zalogować się przy użyciu nazwy użytkownika lub e-mail –

2

Ustawiasz tę samą wartość na dwie zmienne, a następnie za pomocą znaku if/else. Obie instrukcje if są równoważne.

Musisz dowiedzieć się, czy $_REQUEST[login] zawiera poprawny adres e-mail, a jeśli tak, użyj pola e-mail bazy danych. W przeciwnym razie użyj pola nazwy użytkownika.

Ponadto, nie powinieneś umieszczać zmiennych bezpośrednio w zapytaniu. Użyj przygotowanych wyciągów.

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

Uwaga, jeśli masz tylko dwa pola (login i hasło), a następnie rozróżnienie między email i nazwę użytkownika nie ma sensu . Należy również pamiętać, że naprawdę należy używać PHP PDO do konstruowania i wykonywania zapytań, aby zapobiec naruszeniom bezpieczeństwa i ułatwić sobie życie.

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

Co są metody sprawdzania poprawności, musisz je wyjaśnić. Poza tym nie powinieneś dodawać zmiennych do zapytań. To nie jest bezpieczne. – scriptmonster

0

Dobrze wiem, że to stary post, ale odkryłem, że niektórzy ludzie są nadal w toku, żeby go zobaczyć więc chciałem umieścić łatwy sposób, aby umożliwić zarówno e-mail i nazwę użytkownika na samym wejściu

mój kod wygląda następująco

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 

    } 
Powiązane problemy