Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是我的PHP会话的问题吗?_Php_Session_Session Variables_Sessionid - Fatal编程技术网

这是我的PHP会话的问题吗?

这是我的PHP会话的问题吗?,php,session,session-variables,sessionid,Php,Session,Session Variables,Sessionid,我正在使用会话将用户登录到我的站点 登录表单将输入发送到login exec文件,该文件随后查询数据库并验证登录信息。我已经放置了会话_start()在登录exec文件的开头,然后使用以下代码段将数据写入会话: session_regenerate_id(); $member = mysql_fetch_assoc($result); $_SESSION['SESS_MEMBER_ID'] = $member['id']; $_SESSION['Username'] = $member['use

我正在使用会话将用户登录到我的站点

登录表单将输入发送到login exec文件,该文件随后查询数据库并验证登录信息。我已经放置了
会话_start()
在登录exec文件的开头,然后使用以下代码段将数据写入会话:

session_regenerate_id();
$member = mysql_fetch_assoc($result);
$_SESSION['SESS_MEMBER_ID'] = $member['id'];
$_SESSION['Username'] = $member['username'];
$_SESSION['key'] = $member['Serial'];
session_write_close();
header('Location: account.php');
在account.php文件的开头,我要求auth.php验证会话

account.php:
require_once('auth.php')

auth.php:

<?php
//Start session
session_start();

//Check whether the session variable SESS_MEMBER_ID is present or not
if(!isset($_SESSION['SESS_MEMBER_ID']) || (trim($_SESSION['SESS_MEMBER_ID']) == '')) {
    header("Refresh: 5; url=login.php");
    //echo $_SESSION['SESS_MEMBER_ID'];
    die("Access Denied!");
    exit();
}
?>

总是在第一次登录时返回拒绝访问。当脚本重定向回登录页面,我再试一次时,它总是有效的。。。我已经将我的php文件保存在UTF-8中,没有BOM,因为我最初认为在会话开始之前有前导空格。这并没有解决问题,我真的不明白这一点


关于为什么会发生这种情况,你有什么想法吗?

摆脱这个会话&u write\u close()

如果这不能解决问题,那么可能是account.php文件中的会话丢失了


调用
session_start()
在需要auth.php页面之前。

我认为问题在于login-exec.php脚本中的重定向url。例如:

如果我通过转到加载login.php脚本,并且login-exec.php中的头重定向指向PHPSESSID,则会因为域更改而重新生成PHPSESSID

因此,我将标题重定向改为account.php,而不是完整的url,这就解决了问题


我可以使用subdomain.mydomain.com或mydomain.com/subdirectory/的完整URL,但这样做会限制用户和脚本的可移植性。答案很简单。确保域保持不变。如果不是,您可以设置会话名称,我很确定这也会解决这个问题。但是在我的例子中,
header('Location:script.php')成功了

它可能与会话_write_close()有关;呼叫我对这些代码片段的执行顺序感到困惑。我将删除
会话\u write\u close()
调用。我删除了会话\u write\u close(),同样的结果也在发生。事件触发的顺序如下所述:Login将数据发布到Login-exec.php,Login-exec.php将验证信息写入会话,然后Login-exec.php将用户转发到account.php。在account.php中,我要求auth.php检查SESS_MEMBER_ID是否已设置。是auth.php第一次抛出了这个问题,但之后只要我不清除缓存,它就可以在任何时候工作。这可能是因为我调用了session_regenate_id();在将会话变量存储到login exec.php中之前?完成了,结果是一样的。@Drew:为什么在这个脚本中调用session_regenate_ID()?顺便说一句,这个建议并没有解决问题,这不是-1。。。这只是意味着还有更多的问题需要解决。我没有投你反对票……一定是其他人投了反对票。“我已经尝试删除会话\u REGENATE\u ID(),但仍然不起作用。”Drew Ok。您是否在设置完$\u会话变量后,为了确保它被正确填充而尝试打印它?是的,我打印了它并设置了它。但不会转移到其他页面。