我的 set 函数实际上并没有设置变量

My set function doesn't actually set a variable

所以我正忙于这个新站点,因为它包含一个登录系统,而我的设计师根本不知道 PHP,我决定制作一个快速系统供他使用.

当他需要回显用户数据时,他获取属性并将其放在百分号之间(例如%username%。然后我的class过滤这些标签的文档,并将它们替换为我给他们的价值。所以它在 PHP class:

中是这样工作的
public static function setUser($key, $value)
{
    self::$user['%' . $key . '%'] = $value;
} 

如您所见,我使用一个键和一个值调用此函数,并将其保存在一个数组中,然后,我调用 parseParams 函数在页面中搜索这些标签。函数:

private static function parseParams($content)
{
    $userkeys = array_keys(self::$user);
    $uservalues = array_values(self::$user);
    self::$output = str_replace($userkeys, $uservalues, $content);
    return self::$output;
}

输出是一页,因为我调用了render函数。它在我调用的页面上执行 ob_get_contents,然后成为要解析的 $content 变量。当我回显 $output 变量时,我得到了整个页面。

看起来很简单。现在,我的问题是没有设置任何变量。我调用该函数的一个例子是当用户登录时。这是登录函数:

public function Login()
    {
        $username = $_POST['username'];
        $password = $_POST['password'];
        $query = DB::$conn->prepare('SELECT username, password, rank FROM users WHERE username = ?');
        $query->bind_param('s', $username);
        $query->execute();
        $query->bind_result($name, $pass, $rank);
        $query->store_result();
        if ($query->num_rows() > 0)
        {
            while ($query->fetch())
            {
                if (password_verify($password, $pass))
                {
                    TPL::setUser('username', $username);
                    session_start();
                    define('LOGGEDIN', true);
                    header('Location: me');
                    exit();
                }
                    else
                {
                    $this->loginMessage[] = '{{wrongpass}}';
                }
            }
        }
            else
        {
            $this->loginMessage[] = '{{nouser}}';
        }
    }

我确实在文件顶部定义了 TPL class,在 class:

的命名空间下

use CRF\Template as TPL;

所以,我认为这是一个很好的解决方案,而且它会起作用,但是一旦我这样做 var_dump(TPL::$user); 我得到一个空数组。

我的错误在哪里?

谢谢。

TPL::setUser('username', $username);
session_start();
$_SESSION['tpl_user']=serialize(self::$user);
define('LOGGEDIN', true);//btw this also won't be saved for the next script
header('Location: me');
exit();

您不能以这种方式将变量从一个页面传递到另一个页面。但是你可以将它们存储在你的 $_SESSION 变量中,就像这样在文件中登录:

TPL::setUser('username', $username);
session_start();
$_SESSION['tpl_user']=serialize(self::$user);
define('LOGGEDIN', true);//btw this also won't be saved for the next script
header('Location: me');
exit();

并且在您的文件中使用该数组:

private static function parseParams($content)
{
  if(isset($_SESSION['tpl_user'])&&!empty($_SESSION['tpl_user'])) //session_start() should be called before that code
   {
    self::$user = unserialize($_SESSION['tpl_user']);
    $userkeys = array_keys(self::$user);
    $uservalues = array_values(self::$user);
    self::$output = str_replace($userkeys, $uservalues, $content);
    return self::$output;
   } else {println("Access fobidden"); exit;}
}