2017-02-15 1 views
2

준비된 문장을 사용하는 법을 배우고 있으며 password_hash()password_verify( 함수를 사용하여 로그인 시스템 (간단한)을 사용해 보았습니다. 준비된 statemernts를 사용하여 succesffuly 데이터를 삽입했습니다. 이제 암호를 확인하고 사용자와 무언가를하고 싶습니다. PHP 로그인 password_verify

나는이 단계에서 실패 메시지를 내 등에 받고있는 것으로 보인다 : 나는 var_dump($stmt->fetch());하고 로그인 이름이 올바른지 인 다시 bool(true)

임로 제공 할 경우

$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(); 

되지 시도하는 방법을 잘 지금 암호를 확인하십시오.

+0

변수 $ 행 – 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 행 수를 확인 할 필요가 없습니다. 어떤 이유로 든 암호가 확인되지 않으면 else 문도 있습니다.

+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

관련 문제