我有以下设置,我尝试验证用户的密码以便将其登录,但我仍然坚持密码验证。
指向数据库的链接:
$conn=mysqli_connect('localhost','root','');
$tablee='userstable';
表格结构:
users.userid int(11)
users.user_uid varchar(256)
users.user_pwd varchar(256)
users.user_perm int(5)
users.user_email varchar(256)
表格:
echo '<form action="'.getLogin($conn,$tablee).'" method="post">
<input type="text" name="uid">
<input type="password" name="pwd">
<input type="submit" name="loginSubmit" value="Login">
</form>';
功能:
function getLogin($conn,$tablee) {
if (isset($_POST['loginSubmit'])){
$uid=mysqli_real_escape_string($conn,$_POST['uid']);
$pwd=mysqli_real_escape_string($conn,$_POST['pwd']);
$stmt=$conn->prepare("SELECT user_id,user_uid,user_pwd,user_perm,user_email FROM ".$tablee.".users WHERE user_uid=?");
$stmt->bind_param('s',$uid);
$stmt->execute();
$stmt->store_result();
$result=$stmt->bind_result($userid,$username,$userpassword,$permission,$email);
$numrow=$stmt->num_rows;
if ($numrow>0){
$hashedPasswordCheck=password_verify($pwd,$userpassword);
if ($hashedPasswordCheck==false) {
header('Location: index.php?login=wrongpass&pwd='.$pwd.'&ps='.$userpassword.'&user='.$username.'&rows='.$stmt->fetch().'&id='.$userid.'&nr='.$numrow.'&em='.$email.'&length='.strlen($userpassword));
$stmt->free_result();
$stmt->close();
$conn->close();
exit();
}
elseif ($hashedPasswordCheck==true) {
if ($stmt->fetch()){
$_SESSION['id']=$userid;
$_SESSION['perm']=$permission;
header('Location: index.php?login=success');
$stmt->free_result();
$stmt->close();
$conn->close();
exit();
}
else {
header('Location: index.php?login=whathappened');
}
}
else {
header('Location: index.php?login=nothingselected');
exit();
}
}
}
}
我添加了GET参数以查看是否有错误,我收到了一些奇怪的结果。将返回用户标识,用户电子邮件,用户权限,散列密码的长度和行数。但是,用户名和散列密码不是。
我无法弄清楚我做错了什么。
更新:
在php文件中插入echo标签,以避免与上面的表格混淆。
忘了展示我如何存储密码。我目前正在测试,所以我只有一个更改密码字段。
表格:
echo '<form action="'.userCh($conn,$tablee).'" method="post">
<input type="password" name="editPassword">
<input type="submit" name="changePass" value="submit">
</form>';
function changePass($conn,$tablee){
if (isset($_POST['editPassword'])){
$userid=$_SESSION['id'];
$newPass=mysqli_real_escape_string($conn,$_POST['newch']);
$hashedPwd=password_hash($newPass,PASSWORD_DEFAULT);
$sql="UPDATE ".$tablee.".users SET user_pwd=? WHERE user_id=?;";
$stmt=$conn->prepare($sql);
$stmt->bind_param('si',$hashedPwd,$userid);
$stmt->execute();
header('Location: index.php');
exit();
}
}
更新
结果是删除包含$stmt->store_result();
,$numrow=$stmt->num_rows;
,if (numrow>0){
的行,并且相应的}
完成了这一操作。但我仍然不明白为什么。它有效,但这四行代码对我来说很有意义。我错过了什么吗?