当用户登录时显示 "logout" 按钮,当用户未登录时显示 'connect' 按钮 PHP/MySQL
display the "logout" button when the user is logged in and 'connect' when he is not with PHP/MySQL
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
按钮。但是当发送表单数据时,它只显示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
按钮吗?
找遍了都没有找到解决方法
有点小问题。如果用户已登录,则 $_SESSION['user']
不能是 false
。像这样尝试:
layout.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>
第一件事
替换
if($_POST['password'] == $user['password'] && $_POST['email'] == $user['email']
和
if($password == $user['password'])
您不需要检查 $_POST['email'] == $user['email']
因为您已经在使用 WHERE
子句的查询中检查了它,所以您只会得到与您在POST
请求。因此,一旦查询 returns 匹配的结果(电子邮件),指定 $_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!";
在密码验证条件内。
就是这样。
希望对您有所帮助!
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
按钮。但是当发送表单数据时,它只显示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
按钮吗?
找遍了都没有找到解决方法
有点小问题。如果用户已登录,则 $_SESSION['user']
不能是 false
。像这样尝试:
layout.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>
第一件事
替换
if($_POST['password'] == $user['password'] && $_POST['email'] == $user['email']
和
if($password == $user['password'])
您不需要检查 $_POST['email'] == $user['email']
因为您已经在使用 WHERE
子句的查询中检查了它,所以您只会得到与您在POST
请求。因此,一旦查询 returns 匹配的结果(电子邮件),指定 $_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!";
在密码验证条件内。
就是这样。
希望对您有所帮助!