我正在尝试使用jQuery和PHP实现身份验证系统。所有的php工作都是在controller和datahandler类中完成的。 .html文件中没有php代码,.html文件中的所有值都是通过从php服务器请求数据的jQuery呈现的。所以我要做的是:
<script>
标记处调用jQuery,该标记将处理其他权限。但是这个jQuery将访问方法getPermissionString(来自之前提到的同一类authenticate()
方法),并且需要在authenticate方法中设置会话值。问题:
当我尝试在getPermissionString()
中获取会话值时,它会显示:
注意:未定义的变量:_SESSION
我试图检查会话是否在第二种方法中注册,但看起来并非如此。这是我的PHP代码。
有什么想法吗?感谢。
public function authenticate($login, $password)
{
$result = $this->userDataHandler->authenticateUser($login, $password);
if(is_numeric($result) && $result != 0)
{
session_start();
$_SESSION["uid"] = $result;
if(isset($_SESSION["uid"]))
{
echo "registered";
$userId = $_SESSION["uid"];
}
else
{
echo "not registered";
}
echo $result;
}
else
{
echo 0;
}
}
public function getPermissionString()
{
if(isset($_SESSION["uid"]))
{
echo "registered";
$userId = $_SESSION["uid"];
}
else
{
echo "not registered";
}
}
答案 0 :(得分:2)
在第二个函数中访问$_SESSION
之前,您需要确保程序事先调用session_start()
。仅在激活会话时填充全局变量。如果您在使用之前永远不记得开始会话,那么您可以更改下面的php.ini变量:
[session]
session.auto_start = 1
此外,您说您正在使用类代码。在这种情况下,您还可以在每次使用魔术方法创建的类时自动调整会话:
class auth {
function __construct() {
session_start();
}
function yourfunction() {
...
}
function yoursecondfunction(){
...
}
}
答案 1 :(得分:1)
如果您未启用session.auto_start,并且在两个不同的请求中调用身份验证和 getPermissionString ,则需要调用{{3在每个函数中。
如果您需要有关如何传递会话ID的更多信息,请阅读session_start()
答案 2 :(得分:1)
如果未启动会话,则不应使用该功能。因此抛出异常:
public function getPermissionString()
{
if (session_status() !== PHP_SESSION_ACTIVE)
{
throw new Exception('No active session found.');
}
if(isset($_SESSION["uid"]))
{
echo "registered";
$userId = $_SESSION["uid"];
}
else
{
echo "not registered";
}
}
这样可以确保在函数内部检查函数的前置条件,这样在调用函数之前不需要每次都检查它。
如果您错误地使用该功能,现在会看到异常,它会为您提供回溯,以便您可以更轻松地分析代码。
答案 3 :(得分:0)
要使php会话正常工作,每次浏览器请求脚本时都必须调用session_start()
。