2012-12-11 109 views
1

我正在使用在線視頻示例的登錄/註銷/成員頁面,試圖爲我的網站實現它。我有一個來自justhost的現場服務器,我創建了一個數據庫,並在用戶表中放入了一些虛擬用戶信息。我創建了一個connect.php文件,這個文件就是這樣做的,如果它連接到我的數據庫並運行,我會發出一條成功消息。當我嘗試登錄以顯示指向會員頁面的鏈接時,我不斷收到一條錯誤消息,指出我輸入的電子郵件未找到,但電子郵件位於數據庫表中。我究竟做錯了什麼?這裏是login.php文件,很抱歉它的長度。Login.php代碼在登錄過程中不檢索電子郵件

<?php 
error_reporting (E_ALL^E_NOTICE); 
session_start(); 
?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <title>Member System - Login</title> 
</head> 
<body> 

    <?php 

     $form = "<form action='./login.php' method='post'> 
     <table> 
     <tr> 
      <td>Email:</td> 
      <td><input type='text' name='user'/></td> 
     </tr> 
     <tr> 
      <td>Password:</td> 
      <td><input type='password' name='password'/></td> 
     </tr> 
     <tr> 
      <td></td> 
      <td><input type='submit' name='loginbtn' value='Login' /></td> 
     </tr> 
     </table> 
     </form>"; 

    if($_POST['loginbtn']){ 
     $email = $_POST['user']; 
     $password = $_POST['password']; 

     if ($email){ 
      if ($password){ 
       require("connect.php"); 

       $password = md5(md5("sdf5jkl".$password."jfdkSDf4")); 

       $query = mysql_query("SELECT * FROM users WHERE email='$email'"); 
       $numrows = mysql_num_rows($query); 
       if($numrows == 1){ 
        $row = mysql_fetch_assoc($query); 
        $dbid = $row['id']; 
        $dbpass = $row['password']; 
        $dbemail = $row['email']; 
        $dbactive = $row['active']; 

        if($password == $dbpass){ 
         if($dbactive == 1){ 
          //set session info 
          $_SESSION['id'] = $dbid; 
          $_SESSION['email'] = $dbemail; 

          echo "You have been logged in as <b>$dbemail</b>. <a href='./member.php'>Click here</a> to go to the member page."; 

         } 
         else 
          echo "You must activate your account to login. $form"; 
        } 
        else 
         echo "You did not enter the correct password. $form"; 
       } 
       else 
        echo "The email you entered was not found. $form"; 

       mysql_close(); 
      } 
      else 
       echo "You must enter your password. $form"; 
     } 
     else 
      echo "You must enter your email. $form"; 
    } 
    else 
     echo $form; 

    ?> 

</body> 
</html> 
+0

檢查棘手的密碼的MD5生成和保護$ email參數從SQL注入;) –

+0

嘗試的print_r $ _ POST,看看它輸出。 – RonaldBarzell

+0

試着迴應你的$查詢,你會看到它是否有什麼問題。另外請注意,您的腳本容易受到SQL注入攻擊。 –

回答

1

關於中途下你的代碼,你有這些行:

$query = mysql_query("SELECT * FROM users WHERE email='$email'"); 
$numrows = mysql_num_rows($query); 

讓我們暫時將其更改爲這樣:

$sql = "SELECT * FROM users WHERE email='$email'"; 
echo '<pre>'. $sql .'</pre>'; 
$query = mysql_query($sql); 
$numrows = mysql_num_rows($query); 
echo '<pre>'. $numrows .'</pre>'; 

當您現在嘗試登錄,你會可能會在頁面頂部看到類似這樣的內容:

SELECT * FROM users WHERE email='thenamethatijusttypedin' 
2 

如果這個數字等於1,那麼你的代碼應該是就像你寫的那樣工作。如果數字是別的東西,那麼你可以通過複製上面的SQL查詢來學習更多,然後在數據庫平臺上運行它(例如:phpMyAdmin)。

正如其他人之前提到的,你應該清理你的輸入。您可以使用trim($email);命令刪除前導和尾隨空格。

一旦您對編碼感覺更加自信,您應該查看名爲PDO的數據庫查詢工具。現在,您的查詢容易受到SQL注入的影響。如果我在user字段中輸入撇號,則查詢將會中斷。黑客可以使用它來闖入你的網站。 PDO可以防止這種情況發生,並使寫入查詢更容易一些。

+0

我發現了另一個我認爲使用PDO的例子,即使我不確切知道它是什麼。我將我的代碼更改爲您提供的代碼,並在頂部給了我一個1的回覆......如您所說,它應該可以工作,但不會。我不知道什麼是錯的。正如我寫給上面的肖恩,我只是試圖尋找一個更好的登錄/註銷/會員頁面教程的例子,希望這些會起作用。感謝您的建議 – denikov

1

我沒有看到你的代碼在無法找到用戶方面有什麼問題。這裏有幾件事要嘗試。

$email = $_POST['user']; 
$password = $_POST['password']; 

應該是:

$email = mysql_real_escape_string(trim($_POST['user'])); 
$password = mysql_real_escape_string(trim($_POST['password'])); 

trim()將刪除任何多餘的空格可能被搞亂了查詢和mysql_real_escape_string()轉義特殊字符。

如果你被檢查print_r($_POST)正確地獲取數據和查詢運行echo "SELECT * FROM users WHERE email='$email'";或運行在phpMyAdmin SELECT * FROM users WHERE email='your_email',看起來不錯,那麼也許你在你的user表中重複的電子郵件?如果你這樣做,你不應該。嘗試刪除重複。您還應該在檢查電子郵件的同時檢查密碼。這裏有一個例子:

$query = mysql_query("SELECT * FROM users WHERE email = '$email' AND password = '$password'");

+0

試過了,沒有運氣。在phpmyadmin中,我最終輸入了我的電子郵件,並顯示了包含我的信息的所有行,因此它發現我是一個用戶。我不知道什麼是錯的。也許我會繼續在網上搜索以找到更好的例子。正如大家所說,我發現這個樣本不是很安全,也許另一個例子會起作用。感謝您的建議,肖恩 – denikov

+0

就像我說的,代碼沒有任何問題。必須是小事。也許可以嘗試將其限制爲1條記錄,以確保您只獲取一條記錄。 '$ query = mysql_query(「SELECT * FROM users WHERE email ='$ email'LIMIT 1」);' – SeanWM

+0

我只在表中插入一個「用戶」,我的數據,只是爲了測試它。它可能是與我的服務器上的MySQL的東西?我正在使用justhost.com ...也許這是我的域名文件夾內的public_html的東西? – denikov

相關問題