所以我在这个新网站上忙碌,因为它包含一个登录系统,而我的设计师根本不知道任何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);
我得到一个空数组。
我的错误在哪里?
感谢。
答案 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;}
}