Php 始终显示相同的错误消息

Php 始终显示相同的错误消息,php,forms,class,Php,Forms,Class,它是一个登录表单和一个class_login.php文件。我得到了一个令牌,用来验证提交的表单。这是一个随机字符串,我将其隐藏。我在课堂上收到了3条错误信息。提交的表单无效。表单数据无效。和无效的用户名/密码。问题是不管我做什么,我都会遇到第一个错误,即表单提交无效。我发送的令牌与会话令牌不匹配。但是,当我删除该部分时,我总是得到无效的表单数据,即使我编写了正确的现有用户/密码。这里需要帮助,请: <?php class class_login { private $id;

它是一个登录表单和一个class_login.php文件。我得到了一个令牌,用来验证提交的表单。这是一个随机字符串,我将其隐藏。我在课堂上收到了3条错误信息。提交的表单无效。表单数据无效。和无效的用户名/密码。问题是不管我做什么,我都会遇到第一个错误,即表单提交无效。我发送的令牌与会话令牌不匹配。但是,当我删除该部分时,我总是得到无效的表单数据,即使我编写了正确的现有用户/密码。这里需要帮助,请:

<?php


class class_login 
{
    private $id;
    private $username;
    private $password;
    private $passmd5;

    private $errors;
    private $access;
    private $login;
    private $ltoken;

    public function __construct()
    {
        $this->errors = array();

        $this->login  = isset($_POST['login'])? 1:0;
        $this->access = 0;
        $this->ltoken  = $_POST['ltoken'];
        $this->id     = 0;
        $this->username = ($this->login)? $this->filter($_POST['username']) : $_SESSION['username'];
        $this->password = ($this->login)? $this->filter($_POST['password']) : '';
        $this->passmd5 = ($this->login)? md5($this->password) : $_SESSION['password'];

    }

    public function isLoggedIn()
    {
        ($this->login)? $this->verifyPost() : $this->verifySession();

        return $this->access;
    }

    public function filter($var)
    {
        return preg_replace('/[^a-zA-Z0-9]/','',$var);
    }

    public function verifyPost()
    {
        try
        {
            if(!$this->tokenValid())
                throw new Exception('Invalid Form Submission!');
            if(!$this->isDataValid())
                throw new Exception('Invalid Form Data!');
            if(!$this->verifyDatabase())
                throw new Exception('Invalid Username/Password!');

            $this->access = 1;
            $this->registerSession();
        }
        catch(Exception $e)
        {
            $this->errors[] = $e->getMessage();
        }
    }

    public function verifySession()
    {
        if($this->sessionExist() && $this->verifyDatabase())
        $this->access = 1;
    }

    public function verifyDatabase()
    {
        include('db_connect.php');

        $data = mysql_query("SELECT ID FROM users WHERE username = '($this->username)' AND password = '($this->passmd5)'");

        if (mysql_num_rows($data))
        {
            list($this->id) = @array_values(mysql_fetch_assoc($data));

            return true;
        }
        else
            return false;

       }

    public function isDataValid()
    {
        return (preg_match('/[^a-zA-Z0-9]$/',  $this->username) && preg_match('/[^a-zA-Z0-9]$/',  $this->password))? 1:0;
    }

    public function tokenValid()
    {
        return (!isset($_SESSION['ltoken']) || $this->ltoken != $_SESSION['ltoken'])? 0 : 1;
    }

    public function registerSession()
    {
        $_SESSION['ID']       = $this->id;
        $_SESSION['username'] = $this->username;
        $_SESSION['password'] = $this->passmd5;
    }

    public function sessionExist()
    {
        return (isset($_SESSION['username']) && isset($_SESSION['password']))? 1 : 0;
    }

    public function show_errors()
    {
        foreach($this->errors as $value)
            echo $value."</br>";
    }


}

?>
;
if(checker==1)
{
$(“#logform”)。向下滑动(“快速”)
}
});

我怀疑您忘记使用
session\u start()
启动会话。请告诉我们你是如何使用这门课的。(使用它的文件。)

编辑
无视上述情况。这里的问题是,您正在将
$\u会话['ltoken']
设置为每个页面加载的新随机值。这就是为什么发布值(这是一代“落后”)永远不匹配的原因。

请分离出以下代码:

return (!isset($_SESSION['ltoken']) || $this->ltoken != $_SESSION['ltoken'])? 0 : 1;   
它可能准确,也可能不准确,但它不可读,并且使调试更加困难。我认为这可能会让你失望,因为你把if或else作为第二个条件

if( ! isset( $_SESSION['ltoken'] ) return false; 
return ( $this->ltoken != $_SESSION['ltoken']) ? 0 : 1; 

登录名_form.php包含在index.php中,我在这里启动会话,我想我不必再次启动它,或者?哦,对不起,忽略我的回答。实际上,您不需要启动它两次。是的,它修复了无效的表单submisson。不应在页面开头生成令牌。但是现在我仍然从数据错误中得到无效的数据,即使我输入了有效的注册数据。有什么想法吗?我想让字符a-z或a-z和数字从0-9开始。我认为这是允许的正则表达式。对不起,我删除了我的评论,因为它是错误的,我不想传播错误的信息P不过,该函数中的逻辑有点不正确<代码>返回(预匹配('/[^a-zA-Z0-9]$/,$this->username)和预匹配('/[^a-zA-Z0-9]$/,$this->password))?1:0;表示当用户名包含除a-zA-Z0-9以外的字符且密码包含除a-zA-Z0-9以外的字符时,数据有效。您可能希望这样:
return(preg_match('/[^a-zA-Z0-9]$/,$this->username)| preg_match('/[^a-zA-Z0-9]$/,$this->password))?0:1;我没有看到该令牌存储在会话中。也许这就是问题所在。为什么不在构造函数末尾或验证函数中对对象和会话执行
var\u dump
?这将为我们节省很多猜测。另外,var_dump($_POST)可以检查您是否获得了预期的数据。或者打开error_reporting(E_ALL)以查看是否缺少任何数组索引。否则我们需要看一下表格。这不是问题,我在登记表中也是这样用的。不过我觉得很无聊。
if( ! isset( $_SESSION['ltoken'] ) return false; 
return ( $this->ltoken != $_SESSION['ltoken']) ? 0 : 1;