php - 当用户登录时显示 "logout"按钮,当他不使用 PHP/MySQL 时显示 'connect'

标签 php mysql authentication logout

layout.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按钮。但是当发送表单数据时,它只显示连接按钮。

userconnect.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>

userconnect.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按钮吗?

我到处搜索,找不到解决方案。

最佳答案

第一件事

替换

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 变量进行一些哈希处理。

第二件事

不要对用户输入使用 htmlspecialcharshtmlentities。只有当您在页面上输出内容以防止像 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!";

在密码验证条件内。

就是这样。

希望对您有所帮助!

关于php - 当用户登录时显示 "logout"按钮,当他不使用 PHP/MySQL 时显示 'connect',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51234180/

相关文章:

php - PHP 中用户已存在或不存在的错误

php - 如何将模型转换器应用于 Symfony2 表单中的集合项?

php - php replace语句中的单引号即使转义也会返回错误

mysql - SQL Join 2表没有重复行

authentication - 安全 Web 服务 (NTLM) - Jmeter

azure - 如何使 Azure AD 身份验证在本地主机之外工作

authentication - React Native Instagram 显式身份验证

php - 一列的多个值 PHP 和 SQL

php - ImageMagick 在命令行中工作,但是当 exec() 在 php 中它返回 5 和 "incompatible library version"

javascript - laravel 中的搜索功能无法正常工作