Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么我的登录系统不工作?_Php_Mysql_Password Hash - Fatal编程技术网

Php 为什么我的登录系统不工作?

Php 为什么我的登录系统不工作?,php,mysql,password-hash,Php,Mysql,Password Hash,我已经创建了一个系统,允许管理员注册另一个管理员的电子邮件地址和密码登录到一个受保护的区域。管理员通过以下表格注册: <form action="adduser.php" method="POST"> <label for="emailaddress">Email Address: </label><input type="text" name="emailaddress" /> <label

我已经创建了一个系统,允许管理员注册另一个管理员的电子邮件地址和密码登录到一个受保护的区域。管理员通过以下表格注册:

<form action="adduser.php" method="POST">
            <label for="emailaddress">Email Address: </label><input type="text" name="emailaddress" />
            <label for="password">Password: </label><input type="password" name="password" />
            <label for="name">Name: </label><input type="text" name="name"/>
            <input type="submit" value="Submit" name="submit"/>
</form> 

电邮地址:
密码:
姓名:
adduser.php如下所示:

<?php
    require'databaselogin.php';
    if(isset($_POST['emailaddress'],$_POST['password'],$_POST['name'])){
        $result= $pdo->prepare('INSERT INTO users (emailaddress, password, name )
                            VALUES(:emailaddress, :password, :name)');
        $hash = password_hash($_POST['password'], PASSWORD_DEFAULT);  
        unset($_POST['submit']);
        $_POST['password'] = $hash;
        $result->execute($_POST);
        header("Location:admin.php");
    }
?>

到目前为止,名为users的表开始工作,然后填充数据。我猜可能是由于使用了$hash错误,而存储在表中的密码不是用户在密码字段中输入的密码

当用户尝试使用此表单登录时:

<form action="login.php" method="POST" >
                <label for="emailaddress">Email Address:</label><input type="text" name="emailaddress"/>
                <label for="password">Password:</label><input type="password" name="password"/>
                <input type="submit" value="Go" name="submit"/>
            </form>

电邮地址:
密码:
链接到此php:

<?php
    session_start();

        require'databaselogin.php';
            $stmt = $pdo->prepare('SELECT * FROM users WHERE emailaddress = :emailaddress');
            if(isset($_POST['submit'])){
            $criteria = [
            'emailaddress' => $_POST['emailaddress'],
            ];
            $stmt->execute($criteria);

            $user = $stmt->fetch();
            var_dump($user);
            if (password_verify($_POST['password'], $user['password'])) {
                $_SESSION['loggedin'] = $user['id'];
                header("Location:admin.php");
            }
            else {
                header("Location:index.php");
            }
            }
?> 

在网站注册时输入正确的电子邮件和密码后,只需重新加载index.php,而不是将其带到admin.php。我真的不能理解这里的问题,因为代码听起来太像我了,我猜这是一个问题,无论$hash实际保存到密码字段


如果有人能帮上忙,我将不胜感激

由于您没有回复评论,我提交以下内容

我怀疑您的密码列的长度太短

如果是这种情况,则需要将其设置为60+。因此,请更改列,清除包含哈希的密码行,创建新哈希,然后重试

关于这方面的手册:

密码\默认值-使用bcrypt算法(PHP5.5.0的默认值)。请注意,这个常量的设计目的是随着新的、更强的算法添加到PHP中,随着时间的推移而改变。因此,使用此标识符的结果长度可能会随时间而变化。因此,建议将结果存储在可扩展到60个字符以上的数据库列中(最好选择255个字符)

  • 如果MySQL太短,它将以静默方式失败。我以前见过很多次这种情况
另加说明:

最好使用
exit在每个头之后,否则您的代码可能需要继续执行

if (password_verify($_POST['password'], $user['password'])) {
    $_SESSION['loggedin'] = $user['id'];
    header("Location:admin.php");
    exit;
}
else {
    header("Location:index.php");
    exit;
}

如何,使用简单的密码(如1234)注册用户,并检查表中存储的哈希值。然后使用相同的方法回显散列1234,查看字符串是否匹配。如果他们这样做,问题与哈希无关。密码列的长度是多少?如果它太短,你会默默地失败。
var\u dump($user)
的结果是什么?我们都在这里耐心地等待着……原来是密码列的长度,现在可以了,谢谢!奥利·阿特金斯,请核对一下他说的话。他是对的