如何解决MySQL登录系统无法从数据库获取结果
<?PHP
session_start();
include 'dbh.inc.PHP'; //The connection ($conn) is working
$errors = array();
//Login
if (isset($_POST['login'])) {
$username = $_POST['username'];
$password_1 = $_POST['password_1'];
if (empty($username)) {
array_push($errors,'enter username');
}
if (empty($password_1)) {
array_push($errors,'enter password');
}
if (!preg_match("/^[a-zA-Z0-9]*$/",$username)) {
array_push($errors,'username not correct');
$username = "";
}
if (count($errors) == 0){ //The error is in this if condition
$password = password_hash($password_1,PASSWORD_DEFAULT);
$query = "SELECT * FROM users WHERE uidUsers=? AND pwdUsers=?";
$stmt = MysqLi_stmt_init($conn);
MysqLi_stmt_prepare($stmt,$query);
MysqLi_stmt_bind_param($stmt,'ss',$username,$password);
MysqLi_stmt_execute($stmt);
MysqLi_stmt_store_result($stmt);
$result = MysqLi_stmt_num_rows($stmt);
if (MysqLi_num_rows($result) == 1){
$_SESSION['uidUsers'] = $username;
$idUsers_query = "SELECT idUsers FROM users WHERE uidUsers=? AND pwdUsers=?";
$idUsers_stmt = MysqLi_stmt_init($conn);
MysqLi_stmt_prepare($idUsers_stmt,$idUsers_query);
MysqLi_stmt_bind_param($idUsers_stmt,$password);
MysqLi_stmt_execute($idUsers_stmt);
MysqLi_stmt_store_result($idUsers_stmt);
$idUsers_result = $idUsers_stmt->get_result();
$_SESSION['idUsers'] = $idUsers_result;
$username = "";
header("Location: https://...");
}
else{
array_push($errors,'username or password not correct');
}
}
}
?>
我的登录系统无法正常工作,因为我没有从数据库中获得结果或正确的结果。可能是因为数据库不接受“ MysqLi_stmt_store_result()”,但是我无法查看MysqLnd是否已打开(我的提供程序没有选择更改它的选项)。那么我的代码有错误还是数据库有问题?
解决方法
您不应该这样做:
$password = password_hash($password_1,PASSWORD_DEFAULT);
$query = "SELECT * FROM users WHERE uidUsers=? AND pwdUsers=?";
password_hash()
不会在每次运行时产生相同的哈希值。
您应该在uid上运行查询,检索密码,并在其上使用password_verify()
。
我不使用mysqli,因此最好不要将它放在各种选项上。当您通过代码回显各种调试点时,它能走多远?
您似乎确实两次运行了相同的查询,并且第一次在绑定参数时使用$idUsers_stmt
,尽管此时该参数尚不存在。我想,那将停止工作,但是您可以很容易地调试它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。