我的 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;}
}
所以我正忙于这个新站点,因为它包含一个登录系统,而我的设计师根本不知道 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;}
}