首页 > 解决方案 > $_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,谢谢。

标签: php

解决方案


现在您要保持错误的状态,这是对上一个问题的一步。

由于您现在即使在会话中也保持状态,因此您需要在其中管理它。

也就是说,如果您将输入标记为错误,并且下次验证运行时,如果它有效,则需要取消标记它。否则,尽管它现在有效,但错误标志仍保留在会话中。

如果你把这些东西分开,这通常会更容易。一部分是验证,另一部分是会话处理。

但是,为了示例的简单性,这应该显示缺少验证的位置:

    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,因此其余代码不受影响。


推荐阅读