2010-01-19 22 views
-1

這裏一個登錄表單是我工作的代碼:試圖在PHP

  login.php: 

       <?php 
     $con = mysql_connect("localhost","root",""); 
      mysql_select_db("koro",$con); 

      $result= "SELECT * FROM users WHERE      
      UNAME='".mysql_real_escape_string($_POST['Uneym'])."'"; 
      echo $result; 
      $num=mysql_num_rows($result); 
         echo $num; 
        for($i=1;$i<=$num; $i++){ 
      while($row=mysql_fetch_array($result)) 
     { 
      $user=$row['UNAME']; 
      $pass=$row['PW']; 
      } 
      } 


      if($username == $user && $password ==$pass) 
     { 
      echo "<script>alert('Login Successful!')</script>"; 
      } 
      else if($password!= $pass ||$username != $user) 
      { 
      echo("Please Enter Correct Username and Password ..."); 
      ?> 

loginform.php:

 <html> 
    <form action="login.php" method="post"> 

     Username:<input type="text" name="Uneym" value="" /><br/> 
       Password:<input type="password" name="Pass" value="" /><br/> 

     <br/> 
      <input type="submit" name="Submit" value="" /> 

      </form> 
</head> 
      <body> 
     </body> 
      </html> 

-Is那裏像一個初學者更簡單的代碼?我:)

+1

您應該解釋我們當前的代碼(除了縮進)以及它與phpmyadmin的關係。 – 2010-01-19 12:45:46

+0

我覺得他看錯了phpadmin,因爲它是一個登錄腳本,不知道該工具。 – Cryophallion 2010-01-19 13:30:14

回答

1

你的代碼是不是太複雜 - 它不能在所有如果它做的工作作出簡單得多。 但是,你不應該像這樣以不加密的方式在你的數據庫中存儲密碼。看看這篇關於hashing passwords in mysql的文章。

2

如果你正在做它作爲教學練習,無有是做它,確保它正常工作(儘管你可以做到這一切作爲一個頁面,這樣,如果有錯誤,你可以嘗試沒有更簡單的方法再次)。

實際上,這是太簡單了。您應該散列密碼,使用salt,強制執行良好密碼,擁有最大登錄嘗試次數,並將任何用戶信息存儲在會話中。但是,一切都可以稍後....

1

1)第一個錯誤是,你永遠不提交查詢到的DBMS - 你的代碼應該是這個樣子:

$dbh=mysql_connect(...); 
mysql_select_db(...,$dbh); // note see below 
$result=mysql_query(....$dbh); 
while ($row=mysql_fetch_assoc($result)) { 
    ... 
} 

2)你有圍繞從查詢中檢索行的代碼的2個循環(for循環和while循環) - 應該只有一個。所以,如果您的查詢返回3行,你居然約9次循環:

1)循環迭代1 2),而循環迭代1取第1行,寫結果 3),而循環迭代2取第2行,寫結果 4),而循環迭代3讀取行3,寫入結果 5),而循環在隨後的for循環迭代2 7迭代 6)失敗),而環上後續迭代 8失敗),用於循環迭代3 9),而循環對後續迭代

3失敗)您可以指定由mysql_fetch_assoc到返回的值標量變量(即每次都覆蓋te結果 - 所以$ user和$ pass總是包含返回的最後一行的值。

4)及其好的做法一個循環內建立早期退出標準 - 除了避免冗餘執行,這將也是解決上述第三錯誤,例如

$valid=false; 
while($row=mysql_fetch_array($result)) 
{ 
     if (($username==$row['UNAME']) && ($password==$row['PW'])) { 
      $valid=true; 
      break; 
     } 
} 
if ($valid) {.... 

4)接下來的問題是,你爲什麼要檢查,如果用戶名時,您曾經說,這應該是相同的$ _ POST [「Uneym」] $的用戶名相匹配。

5)接下來的問題是,你似乎在register_globals啓用自己編寫的代碼。

6)接下來的問題是,你不必要地從數據庫中獲取數據 - 只需在密碼上添加一個過濾器,那麼你只會得到1或0行(而且你甚至不需要遍歷結果設置):

$user=mysql_real_escape_string($_POST['Uneym'], $dbh); 
$pass=mysql_real_escape_string($_POST['password'], $dbh); 
$result=mysql_query("SELECT * FROM users WHERE UNAME='$user' AND PW='$pass'",$dbh); 
$valid=mysql_num_rows($result); 

,仍然還有更多:

7) 如果($用戶名== $用戶& & $密碼== $通) { 回聲「警報('登錄成功! 「)「; } 否則,如果($密碼= $通過|| $用戶名= $用戶!) { 回聲( 「請輸入正確的用戶名和密碼......」); >

這不會解析 - ?有一個不匹配「{」的其他

8)else語句條件是冗餘之後 - 該代碼將只進入else子句,如果它失敗if子句,並且按照定義,

($ username == $ user & & $ password == $ pass)===! ($ password!= $ pass || $ username!= $ user)

9)使用mysql_select_db()可以使生活非常複雜,如果你使用多個mysql數據庫 - 總的來說它是一個更好的主意,以exlpicitly狀態數據庫表中存在DML語句。

C.