为什么我的变量出现为未定义的des?

时间:2019-02-11 20:36:08

标签: php sql select

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

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语句来替换“ password is valid”消息,然后从那里去? CleanData是用于清理输入的功能。

2 个答案:

答案 0 :(得分:0)

因此,问题在于您正在这样做:

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

然后,您可以肯定地定义了这些var,而不必在页面中反复检查。

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

答案 1 :(得分:0)

使用此代码,您将始终收到“ password is valid”消息,因为您正在根据由同一密码生成的哈希值来验证用户输入的密码! >

<!-- 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来回答类似的问题,以查看充实的登录代码示例。