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

时间:2015-01-01 14:53:45

标签: php

所以我在这个新网站上忙碌,因为它包含一个登录系统,而我的设计师根本不知道任何PHP,我决定建立一个快速系统供他使用。

当他需要回显用户数据时,他获取属性并将其置于百分号之间(例如%username%。然后我的类过滤这些标记的文档,并用我给它们的值替换它们。所以它在PHP类中的工作原理如下:

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类,在类的命名空间下:

use CRF\Template as TPL;

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

我的错误在哪里?

感谢。

1 个答案:

答案 0 :(得分:2)

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 var中,类似于登录文件中的这个:

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;}
}