2013-05-08 15 views
6

Kullanıcılarımın e-posta adresi veya kullanıcı adı ile giriş yapmasını sağlamaya çalışıyorum. Şu anda sadece kullanıcı adı kabul edilir. Şimdi ben bunu uzatmak istiyorumKullanıcı adı veya e-mail adresi ile bağlan

  • $username$_POST['username']
  • $password değerini sahiptir md5($_POST['password'])

değerini vardır:

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

Bilgi: My çalışma SQL şöyle Müşterinin profiline girebileceği e-posta adresine. My SQL şöyle görünür:

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

Ben bu SQL kontrol eder:

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

Ama şu anda çalışmıyor. SQL'de OR kullanırsam, mysql_num_rows0 değerini döndürür. Sorun ne olabilir? Ya da bunu başarmanın başka bir yolu var mı?

+5

Kodunuz gayet iyi, başka bir sorun var. Sorgularınızı phpMyAdmin'i kullanarak doğrudan veritabanında çalıştırmanız gerekir. Ayrıca, bir "mysql_query" başarısının çağrısını kontrol etmeyi ve bir tane varsa sorunu belirlemek için "mysql_error" komutunu çalıştırmayı da unutmayın. –

+3

Tüm 'mysql_' işlevleri kullanımdan kaldırılmıştır. Ayrıca kodunuz [SQL enjeksiyonları] 'na açıktır (http://xkcd.com/327/). Ve md5 şifreleri, bunları düz metinde saklamaktan sadece biraz daha iyidir. – Arjan

+1

"Çalışmıyor" ne anlama geliyor? Daha fazla bilgi verin. Ayrıca, bir sorgu ile sorun olurken, her zaman veritabanına gönderilen ne tam olarak bilmek için 'echo $ your_query'. – Jocelyn

cevap

-1

Karakterlerin durumunda sorun olabilir mi?

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

Yine de, parolanın yanlış olduğunu veya yalnızca kimlik bilgilerini girmeyi belirleyemezsiniz. –

+0

Neden? 'if (mysql_num_rows ($ sonuç) == 0) echo 'Yanlış kullanıcı adı veya şifre!';' –

+0

'=' büyük/küçük harfe duyarlıdır veya büyük/küçük harf duyarlı ise harmanlama harfe göre değişir. http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html – dognose

0

bu deneyin: Kullanıcı Adı kullanıcı adı veya e-posta kimliği hakkına ya sahip olabilir? Bu yüzden önce kullanıcı adı dizesinde "@" sembolü olup olmadığını kontrol edin.

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

olduğunu

Yani eğer durum daha sonra e-posta doğrulanır başarır. Else giriş adı doğrulanacaktır

+0

Yani, kullanıcı adlarının '@' içeremez olduğunu varsayıyorsunuz? Yanlış yaklaşıma benziyor. – Hirnhamster

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

Bunu deneyin, umarım sorun çözülecektir.

0

işe yarayacak eminim bu bir deneyin: '.. $ Username.

$ sql = "SELECT * müşterileri WHERE giriş =" " '| eposta ='" $ username . "'VE şifre ='". $ Şifre. "'";

Ve şifre yanlış olduğunu belirlemek, ya da sadece giriş kimlik bilgileri:

bu ekleyin:

(mysql_num_rows ($ sonuç) == 0) { 'Yanlış kullanıcı adını yankı eğer veya şifre ';!}

+0

Doğru mu anladım? SQL içinde bitsel işlenen (| - bitwise OR) kullanıyor musunuz? Kesinlikle bir şey eksik yaşıyorum – Yaronius

+0

Sorunu çözdünüz mü yoksa hala sorun mu yaşıyorsunuz? – Stormix

-1
sadece 2 sorgularını kullanabilirsiniz

ve durumda or

$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

Neden sadece birine ihtiyacınız olduğunda 2 istekte bulunursunuz? – Hirnhamster

İlgili konular