无法将用户输入到password_verify()

时间:2017-03-27 02:03:41

标签: php mysql pdo

这是登录代码,我正在尝试让密码验证工作,但它不想。似乎这个(是问题,或者我正在向count($sql->fetchAll()) > 0调用错误的变量。

password_verify()

这是注册码

    $signup = isset($_POST['signup'] ) ? $_POST['signup'] : false;
$submit = isset( $_POST['submit'] ) ? $_POST['submit'] : false;
$username = isset( $_POST['username'] ) ? $_POST['username'] : false;
$password = isset( $_POST['password'] ) ? $_POST['password'] : false;

if( $submit && $username && $password ) {

  $sql = $DB_con->prepare( "SELECT * FROM users WHERE user_name=:user_name AND user_pass=:user_pass" );
  $sql->bindParam( ':user_name', $username, PDO::PARAM_STR );
  $sql->bindParam( ':user_pass', $password, PDO::PARAM_STR );
  $check_user=$sql->fetch(PDO::FETCH_ASSOC);
  $success = $sql->execute();
  $verify = password_verify($password, check_user['user_pass']);
    // Successfully logged in!
  if($success && count($sql->fetchAll()) > 0 && $verify) {

    $_SESSION['logged_in'] = true;  
    // Unset errors
    unset($_SESSION['error']);
  }
  else {
    // display an error
    $_SESSION['error'] = 'That user doesn\'t exist'; 
  }
}
else {
  //displays error
  $_SESSION['error'] = 'Please enter all fields';
}
if($signup) {
  header('Location: signup.php');
}
exit;

1 个答案:

答案 0 :(得分:0)

使用这段代码需要清理几件事。

让我们从您的register()功能开始吧。这里有一个明确的语法错误(你建立连接的地方),""$password"。然后该函数不知道$dbname$username$password是什么(对于连接),这些变量不在函数的范围中(它可以看到它)。通常最好将连接对象作为参数传递,而不是每次调用register()函数时都创建新对象。为此修改并清理了一下,它看起来像这样

function register($DB_con, $uname ,$umail, $upass) {
    try {
        $new_password = password_hash($upass, PASSWORD_DEFAULT);

        $stmt = $DB_con->prepare("INSERT INTO users (user_name, user_email, user_pass) 
                                                   VALUES (:uname, :umail, :upass)");

        $stmt->bindparam(":uname", $uname);
        $stmt->bindparam(":umail", $umail);
        $stmt->bindparam(":upass", $new_password);            
        return $stmt->execute(); 

    } catch(PDOException $e) {
        echo $e->getMessage();
    }
}

并像

一样使用
register($DB_con, 'Nader', 'example@example.com', 'pa$$w0rd'); // True or false

然后登录您的帐户。这有点乱,你做错了。到目前为止我发现的是......

  • 执行执行后
  • 选择WHERE未散列的密码等于哈希密码(不会返回任何行)
  • count($sql->fetchAll()) > 0将为零,因为您已经获取了一次,并且只有一个用户=>这意味着一排。获取一个意味着没有更多要获取,因此fetchAll()是空的!
  • 您不需要再进行if ($check_user=$sql->fetch())检查以检查是否有行

更正并考虑了上述各点,您的代码看起来像这样

$signup = isset($_POST['signup']) ? $_POST['signup'] : false;
$submit = isset($_POST['submit']) ? $_POST['submit'] : false;
$username = isset($_POST['username']) ? $_POST['username'] : false;
$password = isset($_POST['password']) ? $_POST['password'] : false;

if ($submit && $username && $password) {
    $sql = $DB_con->prepare("SELECT * FROM users WHERE user_name=:user_name");
    $sql->bindParam(':user_name', $username, PDO::PARAM_STR);
    $sql->execute();

    if ($check_user=$sql->fetch(PDO::FETCH_ASSOC)) {
        if (password_verify($password, $check_user['user_pass'])) {
            $_SESSION['logged_in'] = true;  
            // Unset errors
            unset($_SESSION['error']);
        } else {
            // Invalid password
        }
    } else {
        // No user with that username
    }
} else {
    //displays error
    $_SESSION['error'] = 'Please enter all fields';
}

if ($signup) {
    header('Location: signup.php');
}
exit;

这假定数据库中有唯一的用户名

可能会有更多我看不到的问题,这就是您应该通过添加

来启用错误报告的原因
<?php
error_reoprting(E_ALL);
ini_set("display_errors", 1);

位于文件的顶部(错误不应该像在实时环境中那样显示)。