gpt4 book ai didi

php - 无法让用户输入 password_verify()

转载 作者:行者123 更新时间:2023-11-30 22:02:12 24 4
gpt4 key购买 nike

这里是登录代码,我试图让密码验证工作,但它不想。似乎这个 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);

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

关于php - 无法让用户输入 password_verify(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43036837/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com