我一直在努力为我的网络应用程序实现登录系统。
我的基本逻辑工作就我的index.php而言 - 如果用户尝试在那里导航并且没有登录,则将它们重定向到登录屏幕。一旦他们提供了正确的凭据,他们就会被正确地引导回受保护的index.php页面。
这里的代码逻辑如下:
(适用的index.php )
<?php
session_start();
include_once 'db_functions.php';
require_once 'access.php';
if (!userIsLoggedIn()) {
include 'login.php';
exit();
}
当用户尝试导航到另一个受保护的页面时,会出现此问题。我的逻辑是受保护的页面检查用户是否已登录,如果没有将它们发送回索引,索引又将它们发送到登录屏幕。
(适用protectedpage.php)
<?php
session_start();
require_once 'access.php';
echo "Logged in: " + $_SESSION['loggedIn'];
echo "User: " + $_SESSION['email'];
echo "Password: " + $_SESSION['password'];
// receive data from HTML readcalllog request
$rName=$_POST["registration"]; //irrelevant post data
$rowId=$_POST["rowid"]; //irrelevant post data
if ($_SESSION['loggedIn'] == FALSE) {
header('Location: http://www.myapp.com/index.php'); //if not logged in, return to index.php, which in turn redirects to a logon page.
exit();
}
正如您所看到的,我包含了测试回显语句以打印出当前会话的详细信息。当我导航到该页面(关闭重定向功能)以检查错误消息时,它将打印"000"
,而前面没有"Logged in: "
或"User: "
文本。
我执行了测试并在index.php页面上成功打印出详细信息,因此出于某种原因,当我从index.php导航到另一个受保护页面时会话丢失。
非常感谢任何帮助!
修改
以下是access.php
函数中userIsLoggedIn()的一部分,用于设置会话变量:
function userIsLoggedIn()
{
if (databaseContainsAuthor($_POST['email'], $password))
{
session_start();
$_SESSION['loggedIn'] = TRUE;
$_SESSION['email'] = $_POST['email'];
$_SESSION['password'] = $password;
return TRUE;
}
else
{
session_start();
unset($_SESSION['loggedIn']);
unset($_SESSION['email']);
unset($_SESSION['password']);
$GLOBALS['loginError'] =
'The specified email address or password was incorrect.';
return FALSE;
}
}
}
编辑2: 如果我登录索引页面,请转到受保护页面(将我发送到登录屏幕)并再次登录,会话功能正常,所有受保护页面都可访问。 我只需要弄清楚是什么阻止了初始登录创建一个结束的正确会话。
答案 0 :(得分:0)
首先,您不需要在页面中包含session_start();
多一次。只需将其插入每个文件的开头即可。
如果我是你,我会使用此声明来查看用户是否已登录受保护的页面:
if ( !isset($_SESSION['email'] && !isset($_SESSION['password'] ) ) {
header('Location: http://www.myapp.com/index.php'); //if not logged in, return to index.php, which in turn redirects to a logon page.
exit();
} else {
echo "Logged in";
}
此外,我建议您同时使用$_SESSION
和$_COOKIES
来创建更强大的登录系统。