php - $_SESSION 在不应该的时候回显?
问题描述
我正在做一个用户输入数据的基本表单,它有三个 php 页面,一个带有 html 内容,第二个带有称为注册的类,第三个称为 validation.php 它具有错误处理程序。
如果用户输入错误,我想在同一页面上显示错误,这就是我使用会话的原因,如果设置了会话,请在 html 页面中查看它应该回显它,但无论如何它都会回显它,我不知道为什么。
html页面:
<form action="registration.php" method="post">
<input type="text" placeholder="Email" name="email" required><br>
<input type="password" placeholder="password" name="password" required><br>
<input type="password" placeholder="Repeat password" name="password2" required><br>
<?php if(isset($_SESSION["noMatch"])); echo $_SESSION["noMatch"]; ?>
验证.php
class Validation
{
function samePasswordCheck($password, $password2)
{
if ($password != $password2)
{
$_SESSION["noMatch"]="passwords don't match";
return false;
}
else return true;
注册页面
require 'validation.php';
if(isset($_POST['finishreg'])){
if (!empty('email') && !empty('password') && !empty('password2'))
{
$email = $_POST['email'];
$password = $_POST['password'];
$password2 = $_POST['password2'];
$obj = new Validation();
$first=$obj->emailFormatCheck($email);
$second=$obj->securePasswordCheck($password);
$third=$obj->samePasswordCheck($password, $password2);
if($first==true && $second==true && $third==true )
{
//send to database blah blah
}
我试图剪切代码,所以它只显示重要的内容,因为您可以看到如果密码不一样,则设置了“noMatch”,那么为什么它会得到回显呢?这是一个好习惯吗?我是否以正确的方式做这一切?,我正在尝试制作这个 OOP,谢谢。
解决方案
现在您要保持错误的状态,这是对上一个问题的一步。
由于您现在即使在会话中也保持状态,因此您需要在其中管理它。
也就是说,如果您将输入标记为错误,并且下次验证运行时,如果它有效,则需要取消标记它。否则,尽管它现在有效,但错误标志仍保留在会话中。
如果你把这些东西分开,这通常会更容易。一部分是验证,另一部分是会话处理。
但是,为了示例的简单性,这应该显示缺少验证的位置:
function samePasswordCheck($password, $password2)
{
if ($password != $password2)
{
$_SESSION["noMatch"]="passwords don't match";
return false;
}
else return true;
设置为$_SESSION["noMatch"]
无效。但是该else
块永远不会验证它(例如通过取消设置它)。
这可能很简单:
if ($password != $password2)
{
$_SESSION["noMatch"]="passwords don't match";
return false;
}
else
{
unset($_SESSION["noMatch"]);
return true;
}
但正如所写,您不希望正常在验证中进行会话处理。它被烤得太多了,现在已经让你头疼了(一次做太多事情,很容易失去控制)。
相反,您可以使验证例程返回一个布尔值。这也会使它们看起来更好:
function samePasswordCheck(string $password, string $password2): bool
{
return $password !== $password2
}
然后,您可以拥有一个绑定表单数据和会话数据的例程,这样您就可以将验证逻辑与状态处理分开。
最后你有更多的代码,但你应该有更少的地方需要访问以添加新的更改。
例如,如果比较密码时出错(例如使用弱比较而不是严格比较),则仅影响有关密码的验证功能。也许在所有验证中都出现了这个错误?很容易检查,因为所有验证功能都彼此相邻。
由于它们都返回 bool,因此其余代码不受影响。
推荐阅读
- java - 在路径上设置后,Ubuntu 获取模块 java.se.ee
- c++ - 透明 MSAA FBO 解析期间的混叠伪影
- powershell - 如何拆分此哈希表搜索的结果?
- java - Maven 对 Nexus 中 jar 的依赖
- java - 如何使用链表进行选择排序
- python - 在manjaro linux(arch)中通过终端进行strat python时出现问题
- java - 如何在 JSON 而不是 MySQL 上加载数据?(转换代码)
- c# - 在 ASP.Net Core MVC 中的请求之间传递复杂对象的最佳方法
- javascript - 网站未正确获取 cookie 信息并重新加载垃圾邮件
- java - Spring MVC Hibernate 集成问题