当用户登录时显示“logout”按钮,当用户不使用php/mysql时显示“connect”

42fyovps  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(367)

布局.phtml

<?php if (isset($_SESSION['user']) && ($_SESSION['user'] == false)): ?>
    <p>Hello </p>
    <a href="logout.php">Logout</a>
<?php else: ?>
    <a href="register.php">Sign up</a>
    <a href="userconnect.php">Connect</a>
<?php endif; ?>

我想展示 logout 当用户登录并 connect 按钮时,他们没有登录。但是发送表单数据时,它只显示 connect 按钮。
用户连接.phtml
有一个html表单。

<div class="user-connect">
  <?php if (isset($message)) { echo $message; } ?>
    <form action="userconnect.php" method="post">
        <ul>
            <li>
                <label for="email"></label>
                <input type="text" id='email' name='email'>
            </li>
            <li>
                <label for="password"></label>
                <input type="password" id='password' name='password'>
            </li>
            <li>
                <input type="submit" name="enter">
            </li>
        </ul>
    </form>
</div>

用户连接.php

<?php

session_start();

if(isset($_POST["enter"]) && !empty($_POST["enter"])) {
    if(!empty($_POST['email']) && !empty($_POST['password'])) 
    {
        $email = htmlspecialchars($_POST['email']);
        $password = htmlspecialchars(md5(md5($_POST['password'])));

        include ("connection.php");
        $query = $db->prepare('SELECT ID, email, password, firstName FROM user WHERE email = ?');
        $query->execute([$_POST['email']]);
        $user = $query->fetch();  

        if ($user) {
            if($_POST['password'] == $user['password'] && $_POST['email'] == $user['email'])
            {
                $_SESSION['user'] = [
                    'email' => $user['email'],
                    'id' => $user['ID'] 
                ];
            }
            $message = "Vous etes connectez!";
        } else {
            $message = "Invalide email ou mot de passe!";
        }
    } else {
        $message = "Champs obligatoire a saisir";
    }
}

$template = 'userconnect';
include 'layout.phtml';

倾倒 $_SESSION['user'] :

<?php var_dump(isset($_SESSION['user'])); ?>

显示器 bool(false) .
你能帮我怎么展示这个吗 logout 按钮?
我到处找了,找不到解决办法。

uqzxnwby

uqzxnwby1#

有个小问题。如果用户已登录, $_SESSION['user'] 不能是 false . 试着这样做:
布局.phtml

<?php if (isset($_SESSION['user'])): ?>
    <p>Hello </p>
    <a href="logout.php">Logout</a>
<?php else: ?>
    <a href="register.php">Sign up</a>
    <a href="userconnect.php">Connect</a>
6qfn3psc

6qfn3psc2#

第一件事
代替

if($_POST['password'] == $user['password'] && $_POST['email'] == $user['email']

具有

if($password == $user['password'])

你不需要 $_POST['email'] == $user['email'] 因为您已经在查询中用 WHERE 子句,因此您只能得到与您在 POST 请求。所以,指定 $_POST['email'] == $user['email'] 一旦查询返回匹配的结果(电子邮件),就没有用了。
那么,你应该使用 $password 而不是 $_POST['password'] 因为密码字段已处理为 $password 带有一些散列的变量。
第二件事
不要使用 htmlspecialchars 或者 htmlentities 根据用户输入。只有当你在页面上输出一些东西来防止类似的攻击时才重要 XSS .
另外,我想知道你的密码是如何在注册过程中处理。
更新
正如您在评论中提到的,您使用 password_hash 函数在注册期间对密码进行哈希运算。
但在这个问题上,你用 md5(md5($_POST['password'])) 散列输入并与数据库中的散列密码匹配。这行不通。
相反,你应该使用 password_verify 其目的是将输入与由生成的哈希密码相匹配 password_hash .
这是你该如何使用它,

$password = $_POST['password'];

if ($user) {
    if(password_verify($password, $user['password'])) {
        $_SESSION['user'] = [
            'email' => $user['email'],
            'id' => $user['ID'] 
        ];
        $message = "Vous etes connectez!";
    }
}

顺便说一下,你把这句话,

$message = "Vous etes connectez!";

密码验证条件内。
就这样。
希望有帮助!

相关问题