【问题标题】:Why are my variables coming up as undefined, des?为什么我的变量出现未定义,des?
【发布时间】:2019-02-11 20:36:07
【问题描述】:

用户注册工作正常。注册后,此登录页面打开,并显示密码、用户名和哈希是我的选择行上未定义的变量以及当我回显哈希时的消息。 尝试登录时会弹出“无效的登录凭据”错误,但也会弹出“密码有效”,并且还会打印哈希。

if (isset($_POST['username']) and isset($_POST['password'])){
// Assigning posted values to variables.
$username = cleanData($_POST['username']);
$password = cleanData($_POST['password']);
$hash = password_hash($password, PASSWORD_DEFAULT);
$verify = password_verify($password, $hash);
    if(password_verify($password, $hash)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}
    }

// Checking if the values exist in the database or not
$query = "SELECT * FROM `user` WHERE (username='$username') AND (password='$password')";
echo $hash;
$result = mysqli_query($connection, $query) or die(mysqli_error($connection));
$count = mysqli_num_rows($result);

 // If the posted values are equal to the database values, then session 
is created for the user.
if ($count == 1){
  $_SESSION["loggedIn"] = true;
$_SESSION['username'] = $username;
}else{
// error for not matching credentials
$fmsg = "Invalid Login Credentials.";

我怀疑我在 SELECT 语句的位置和要求方面做了一些可怕的错误,但它仍然不能解释为什么这些变量会以未定义的形式出现。也许我可以移动 SELECT 语句来替换“密码有效”消息并从那里开始? CleanData 是一个清理输入的函数。

【问题讨论】:

  • 所有这些东西都需要在if(isset
  • 你指的是哪些东西?
  • 所有的东西。需要设置用户名和密码变量的所有内容。

标签: php sql select


【解决方案1】:

所以,问题是你正在这样做:

if (username and password are set) {
 username = xxx
 password = xxx
 hash password
 verify password
 display results
}

do sql query based on username and password

因此,您的原始 IF 之外的代码试图利用可能尚未创建的变量。

即使您没有将用户名和密码传递给 php 页面,也会调用您的 SQL 查询和之后的所有代码。

你最好在脚本的开头做这样的事情:

if (username and password are not both set in post vars)
  display error
  exit
}
username = xxx
password = xxx

那么您就可以确定这些变量是明确定义的,而无需在页面中反复检查。

另外,伪代码是故意的。试图用外行的话来传达我的信息:)

【讨论】:

    【解决方案2】:

    使用此代码,您将始终收到“密码有效”消息,因为您正在根据您刚刚从相同密码生成的哈希验证用户输入的密码! p>

    <!-- Incorrect code: This always determines the password is valid! -->
    $hash = password_hash($password, PASSWORD_DEFAULT);
    if (password_verify($password, $hash)) { 
      echo 'Password is valid!';
    }
    

    当您第一次将密码插入数据库时​​,您应该使用password_hash(这样,您不会存储实际的密码,只是一个哈希)。然后,当您的用户使用其用户名登录时,在数据库中查找具有该用户名的用户。如果您找到具有该用户名的用户,然后您使用password_verify 来检查$password 变量是否与存储在该用户的数据库中的哈希匹配。

    查看this answer 的类似问题,查看详细的登录代码示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 2016-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多