2013-06-19 100 views
0

我的登錄表單無法識別現有用戶。我存儲在數據庫中的密碼使用PHP的crypt()函數加密。當用戶註冊他們的密碼時也會被加密並插入到數據庫中。PHP/MySQL/PDO - 無法識別現有用戶的登錄表格

正如你在下面的代碼中看到的,它檢查下面輸入的密碼是否匹配,但是每當我輸入存儲在數據庫中的密碼時,用相應的用戶名稱表示用戶不存在。

我是新來的PDO,這是我第一次使用它,通常如果我只是使用MySQL它工作正常,但由於某種原因,這不是,我已經改變了一些代碼,但它仍然沒有工作。任何人都知道爲什麼/在哪裏/我在做什麼錯了代碼。

include "connect.php"; 

$username = $_POST['username']; 
$password = $_POST['password']; 

$sql = "SELECT * FROM users WHERE username=:username"; 
$statement = $db->prepare($sql); 
$statement->bindValue(':username',$username,PDO::PARAM_STR); 

if($statement->execute()) 
{ 
    if($statement->rowCount() == 1) 
    { 
     $row = $statement->fetch(PDO::FETCH_ASSOC); 

     if(crypt($password, $row['username']) == $row['user_password']) 
     { 
      $username = $row['username']; 
      $email = $row['email']; 

      $_SESSION['username'] = $username; 
      $_SESSION['email'] = $email; 
      $_SESSION['logged_in'] = 1; 

      header("Location: index.php"); 
      exit; 
     } 
     else 
     { 
      include "error_login.php"; 
     } 
    } 
    else 
    { 
     include "error_login.php"; 
    } 
} 
+0

你的if語句都包含'error_login',如果它們是假的 - 你知道哪一個被調用嗎? – andrewsi

+0

使用'session_start();'頂部也 – pl71

+0

@andrew:但只有當地穴不匹配。 –

回答

0
if(crypt($password, $row['username']) == $row['user_password']) 

應該

if(crypt($password) == $row['user_password']) 
0

與它存儲的散列值的驗證密碼,你需要知道的鹽和使用之前生成散列值的算法。這個salt可以從存儲的散列值中提取,因爲crypt()將它存儲爲結果字符串的一部分。

if (crypt($password, $row['user_password']) === $row['user_password']) 

PHP 5.5將有它自己的功能password_hash()和password_verify()準備,以簡化生成散列BCrypt。我強烈建議使用這個優秀的api,或者早期的PHP版本是compatibility pack。用法非常簡單:

// Hash a new password for storing in the database. 
// The function automatically generates a cryptographically safe salt. 
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT); 

// Check if the hash of the entered login password, matches the stored hash. 
// The salt and the cost factor will be extracted from $existingHashFromDb. 
$isPasswordCorrect = password_verify($password, $existingHashFromDb);