簡體   English   中英

無法將用戶輸入到password_verify()

[英]Can't get user input in to password_verify()

這是登錄代碼,我正在嘗試讓密碼驗證工作,但它不想。 看起來這個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;

這是注冊碼

function register($uname,$umail,$upass)
    {

        $DB_con = null;

try
{
     $DB_con = new PDO("mysql:host=$host;dbname=$dbname", "$username" ,"$password");
     $DB_con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e)
{
     echo $e->getMessage();
}   



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

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

    }

使用這段代碼需要清理幾件事。

讓我們從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);

在文件的頂部(錯誤不應該像在實時環境中那樣顯示)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM