2013-05-05 42 views
0

代碼將顯示返回的值,如果它大於1,它將返回「是」。但是我在$ check的WHERE子句中遇到了問題。當我把它拿出來的代碼工作得很好,但是當我添加它時,頁面返回不正確的值。任何想法有什麼不對?SQL/PHP「WHERE」沒有返回正確的值?

<?php 

$con = mysqli_connect("127.0.0.1","root","","lian"); 

$u= $_GET['username']; 
$pw = $_GET['password']; 

$check = "SELECT username,password FROM users WHERE username='$u' AND password='$pw'"; 

$login = mysqli_query($con,$check) or die(mysqli_error($con)); 

$num_rows = mysqli_num_rows($login); 
echo "$num_rows \n"; 

if (mysqli_num_rows($login) == 1) { 
$row = mysqli_fetch_assoc($login); 
echo 'Yes'; 
exit; 
} 

else { 
echo 'No'; 
exit; 
} 
+3

您的代碼易受SQL注入攻擊。您需要轉義任何和所有用戶輸入。 – j883376 2013-05-05 22:40:04

+0

當你回顯$ _GET中包含的變量時,你會看到什麼? – 2013-05-05 22:42:40

+0

數據庫上的明文密碼?!?用鹽對它進行散列 – 2013-05-05 22:43:05

回答

0

撇開注入漏洞,可能是因爲特殊字符或空白。嘗試修剪你的GET值。

$u = trim($_GET['username']); 
$pwd = trim($_GET['password']); 

您是否將結果數量設爲0?也可以嘗試在開發環境中迴應聲明以準確檢查聲明的內容。

0

嘗試這樣

$u= trim(mysqli_real_escape_string($_GET['username'])); 
$pw = trim(mysqli_real_escape_string($_GET['password'])); 
$check = "SELECT username,password FROM users WHERE username='$u' AND password='$pw'"; 

此外,我希望你保證用戶名和密碼的唯一組合。 因爲假設有在你的用戶表

用戶名= 「ABC」 密碼項= 「12345」

然後mysqli_num_rows()函數將返回兩行和

if (mysqli_num_rows($login) == 1) 

條件將返回錯誤意味着用戶不存在。

0

上述評論有效提高您的代碼的安全性,並保護vs sql注入。

對於如果代碼正確執行時,您不必在where子句中的地方,但是當你有幾個可能的失敗你的實際問題:

  1. 用戶名或密碼是錯的 - 在那裏錯誤可能意味着它們有額外的空白,大小寫敏感或列名稱不正確(區分大小寫的數據庫?)
  2. 傳遞給服務器的字符串顯示不正確。

通過在形成SQL字符串之後立即執行$ u,$ pw和$ check的回顯來檢查兩個選項。如果它仍然不清楚,那麼複製任何迴應$ check並直接將其過濾到解析器(管理工作室,我猜?),看看它返回。

祝你好運。

+0

我回應了$ check,這是返回值SELECT username,password FROM users WHERE username =''AND password ='' – thewhtmba 2013-05-09 02:01:32