2017-02-15 113 views
2

我正在學習如何使用準備好的語句,我想我會嘗試一個登錄系統(簡單)使用password_hash()password_verify()函數。我已經成功地插入了使用已準備好的statemernts的數據,現在我想驗證密碼並對用戶做些什麼。Php登錄password_verify

我似乎又回到我在這個階段失敗消息:

$stmt = $conn->prepare("SELECT username, password FROM users WHERE username = ?"); 
$stmt->bind_param('s', $username); 

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

$stmt->execute(); 
$stmt->bind_result($username, $password); 



$row = $stmt->fetch(); 
if ($stmt->num_rows == 1) { 
    if (password_verify($password, $row['user_password'])) { 
     echo 'success'; 
    } 
} else { 
echo "Wrong data"; 
} 

$stmt->close(); 
$conn->close(); 

如果我做一個var_dump($stmt->fetch());和登錄的用戶名是正確的是回來爲bool(true)

林不知道如何嘗試現在驗證密碼。

+0

無法看到你的變量$ row – Akintunde007

+0

@PhpDev哎呀對不起,你去 – PhpDude

+0

$ row ['user_password'];給你散列?如果是這樣,你應該得到一個結果。如果密碼未驗證,請添加一個else語句。 – Akintunde007

回答

4
<?php 

$stmt = $conn->prepare("SELECT username, password FROM users WHERE username = ?"); 
$stmt->bind_param('s', $username); 

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

$stmt->execute(); 
$stmt->bind_result($username, $password); 
$row = $stmt->fetch(); //fetch DB results 


if (!empty($row)) { // checks if the user actually exists(true/false returned) 
    if (password_verify($_POST['upassword'], $row['password'])) { 
     echo 'success'; // password_verify success! 
    } else { 
    echo 'failed'; 
    } 
} else { 
    echo "This user does not exist"; //email entered does not match any in DB 
} 

$stmt->close(); 
$conn->close(); 

你不necessarilly需要檢查的行數。如果密碼未經任何原因驗證,還有其他聲明

+0

當然,但[這個評論我離開他們...](http://stackoverflow.com/questions/42252986/php-login-password-verify#comment71664618_42252986)是爲什麼它失敗了,作爲前者的另一個原因。 –

2

這是你的問題之一:

$password = $_POST['upassword']; 
... 
$stmt->bind_result($username, $password); 
... 
if (password_verify($password, $row['user_password'])) { 

您將要覆蓋$password變量,以便它不再是貼值。

使用POST值應解決的問題:

if (password_verify($_POST['upassword'], $row['user_password'])) { 

if (password_verify($_POST['upassword'], $password)) { 

因爲你已經從結果到變量綁定的密碼。

另外,如果你的數據庫中的用戶名是唯一的,可以更換:

$row = $stmt->fetch(); 
if ($stmt->num_rows == 1) { 

有:

if ($row = $stmt->fetch()) { 
+0

問題是password_verify行從未得到執行。它停在num_rows檢查 – Akintunde007

+0

我已經試過但仍然得到相同的結果... – PhpDude

+0

@PhpDev好點,還有更多的問題,然後... – jeroen