2013-05-08 4 views
6

Ich versuche, meine Benutzer mit einer E-Mail oder einem Benutzernamen anmelden zu ermöglichen. Im Moment wird nur der Benutzername akzeptiert. Meine Arbeits SQL sieht wie folgt aus:Login mit Benutzername oder E-Mail

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

Info:

  • $username hat den Wert von $_POST['username']
  • $password hat den Wert von md5($_POST['password'])

Nun würde Ich mag es zu verlängern an die E-Mail-Adresse kann ein Kunde in seinem Profil angeben. My SQL sieht wie folgt aus:

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

Ich werde überprüfen Sie diese SQL mit:

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

Aber im Moment ist es nicht funktioniert. Wenn ich in meinem SQL OR verwende, gibt mysql_num_rows0 zurück. Was könnte das Problem sein? Oder gibt es einen anderen und besseren Weg, dies zu erreichen?

+5

Ihr Code ist in Ordnung, also stimmt etwas anderes nicht. Sie müssen Ihre Abfragen direkt in der Datenbank ausführen, indem Sie phpMyAdmin verwenden, um festzustellen, was das ist. Vergessen Sie auch nie, das Ergebnis eines 'mysql_query'-Aufrufs auf Erfolg zu prüfen, und führen Sie' mysql_error' aus, um das Problem zu ermitteln, falls es einen gibt. –

+3

Alle mysql_-Funktionen sind veraltet. Auch Ihr Code ist offen für [SQL-Injektionen] (http://xkcd.com/327/). Und md5-Passwörter sind nur geringfügig besser als sie im Klartext zu speichern. – Arjan

+1

Was bedeutet "Es funktioniert nicht"? Gib mehr Details an. Wenn Sie Probleme mit einer Abfrage haben, sollten Sie immer "echo $ your_query" angeben, um genau zu wissen, was an die Datenbank gesendet wird. – Jocelyn

Antwort

-1

Vielleicht ist das Problem im Falle der Charaktere?

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

Sie können jedoch nicht feststellen, wann das Passwort falsch ist oder nur Anmeldedaten eingeben. –

+0

Warum? 'if (mysql_num_rows ($ result) == 0) echo 'Falscher Benutzername oder falsches Passwort!';' –

+0

Wenn '=' Groß-/Kleinschreibung beachtet oder 'LIKE' die Groß- und Kleinschreibung beachtet, hängt von der verwendeten Sortierung ab. http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html – dognose

0

Versuchen Sie Folgendes: Benutzername kann entweder Benutzername oder E-Mail-ID richtig haben? Prüfen Sie also zunächst, ob in der Username-Zeichenfolge ein "@" - Symbol steht.

Das

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

Also, wenn Bedingung gelingt, dann werden E-Mail bestätigt werden. Anderer Login-Name wird validiert

+0

Sie nehmen also an, dass Benutzernamen nicht '@' enthalten können? Fühlt sich wie der falsche Ansatz an. – Hirnhamster

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

Versuchen Sie dies, ich hoffe, dass Ihr Problem gelöst wird.

0

versuchen diese, ich bin sicher, dass es funktionieren wird: ‚.. $ Username.

$ sql = "SELECT * FROM Kunden WHERE login =" " '| E-Mail ='" $ username . '' AND password = '". $ Password."' ";

Und um zu bestimmen, wenn das Passwort falsch ist, oder einfach nur Anmeldeinformationen:

hinzufügen:

if (mysql_num_rows ($ result) == 0) {echo ‚Falschen Benutzername oder Passwort! ';}

+0

Habe ich es richtig verstanden? Verwenden Sie innerhalb von SQL den bitweisen Operanden (| - bitweise ODER)? Ich vermisse definitiv etwas – Yaronius

+0

Hast du das Problem behoben oder hast du immer noch Probleme? – Stormix

-1

Sie einfach 2-Abfragen und die or in der Bedingung verwenden können

$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

Warum würden Sie 2 Anfragen stellen, wenn Sie nur eine benötigen? – Hirnhamster

Verwandte Themen