2013-05-08 9 views
6

Próbuję umożliwić moim użytkownikom logowanie przy użyciu adresu e-mail lub nazwy użytkownika. W tej chwili akceptowana jest tylko nazwa użytkownika. My SQL pracy wygląda następująco:Zaloguj się przy użyciu nazwy użytkownika lub adresu e-mail

$sql = "SELECT * FROM customers WHERE login = '".$username."' AND password = '".$password."'"; 

Info:

  • $username ma wartość $_POST['username']
  • $password ma wartość md5($_POST['password'])

Teraz chciałbym go przedłużyć na adres e-mail, który klient może wprowadzić w swoim profilu. My SQL wygląda następująco:

$sql = "SELECT * FROM customers WHERE (login = '".$username."' OR email = '".$username."') AND password = '".$password."'"; 

będę sprawdzić to z SQL:

$result = mysql_query($sql);  
mysql_num_rows($result) 

Ale w tej chwili nie działa. Jeśli używam OR w moim SQL, mysql_num_rows zwraca 0. Jaki może być problem? Czy istnieje inny i lepszy sposób, aby to osiągnąć?

+5

Twój kod jest w porządku, więc coś innego jest nie tak. Aby ustalić, co to jest, należy uruchomić kwerendy bezpośrednio w bazie danych za pomocą narzędzia phpMyAdmin. Nigdy też nie zapominaj o sprawdzeniu wyniku wywołania 'mysql_query' dla sukcesu i uruchom' mysql_error', aby określić problem, jeśli taki istnieje. –

+3

Wszystkie funkcje 'mysql_' są przestarzałe. Również twój kod jest otwarty na [SQL injections] (http://xkcd.com/327/). A hasła md5 są tylko trochę lepsze niż przechowywanie ich w postaci zwykłego tekstu. – Arjan

+1

Co oznacza "Nie działa"? Podaj więcej szczegółów. Ponadto, podczas pobierania problemów z zapytaniem, zawsze 'echo $ your_query', aby dokładnie wiedzieć, co jest wysyłane do bazy danych. – Jocelyn

Odpowiedz

-1

Może problem dotyczy postaci?

SELECT * FROM `customers` WHERE (LOWER(`login`)='" . strtolower($username) . "' OR 
LOWER(`email`)='" . strtolower($username) . "') AND `password`='" . $password . "'" 
+0

Nie można jednak ustalić, kiedy hasło jest nieprawidłowe lub po prostu podać dane logowania. –

+0

Dlaczego? 'if (mysql_num_rows ($ result) == 0) echo" Niepoprawna nazwa użytkownika lub hasło! ";" –

+0

, jeśli "=" rozróżnia małe i wielkie litery, lub "LIKE" rozróżnia duże i małe litery. http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html – dognose

0

Spróbuj tego: Nazwa użytkownika może mieć zarówno nazwę użytkownika, jak i identyfikator e-mailowy, prawda? Najpierw sprawdź, czy w łańcuchu nazwy użytkownika znajduje się symbol "@".

To

if(stripos($username,'@') !== FALSE){ 
$sql = "SELECT * FROM customers WHERE email = '".$username."' AND password = '".$password."'"; 
}else{ 
$sql = "SELECT * FROM customers WHERE login = '".$username."' AND password = '".$password."'"; 
} 

Więc jeśli warunek uda następnie e-mail zostanie zatwierdzone. Nazwa użytkownika zostanie zweryfikowana:

+0

Zakładasz, że nazwa użytkownika nie może zawierać znaku "@"? Wydaje się, że to niewłaściwe podejście. – Hirnhamster

-1
$sql = "SELECT * FROM customers 
     WHERE EXISTS(select 1 from customers where login = '".$username."' 
         OR email = '".$username."') 
       AND password = '".$password."'"; 

Spróbuj tego, mam nadzieję, że Twój problem zostanie rozwiązany.

0

Spróbuj tego, jestem pewien, że to będzie działać: „.. $ Nazwa.

$ sql = "SELECT * FROM klienci WHERE logowanie =" " '| e ='" $ username . "" I hasło = "". $ Hasło. "" ";

i określić, kiedy hasło jest błędne, lub po prostu dane logowania:

dodać to:

if (mysql_num_rows ($ result) == 0) {echo „Błędna nazwa użytkownika lub hasło ';!}

+0

Czy udało mi się to naprawić? Czy używasz bitowego operandu (| - bitwise OR) wewnątrz SQL? Zdecydowanie brakuje mi czegoś. – Yaronius

+0

Czy naprawiłeś problem lub nadal masz problemy? – Stormix

-1

można po prostu użyć 2 zapytań i or w stanie

$query=mysql_query("select * from customers where user='$username' and password='$password'"); 
$query1=mysql_query("select * from customers where email='$username' and password='$password'"); 
if(mysql_num_rows($query)==1 || mysql_num_rows($query1)==1) 
{ 
//YOUR CODE 
} 
else 
{ 
//YOUR CODE 
} 
+0

Dlaczego miałbyś składać 2 wnioski, gdy potrzebujesz tylko jednego? – Hirnhamster

Powiązane problemy