我找到了问题#2的来源。它是使用 session_register(foo)。
我将以下内容添加到 handle_registration.php 。
session_register("foo");
session_register("foo2");
$foo2 = $_POST['email'];
$foo['email'] = $_POST['email']
问题仍然存在,因为没有变量存储到我的会话cookie中。
这是我login script的逻辑。
session_write_close
放入生成会话以进行登录的正确位置是什么? 我的session_start()
开头有index.php
。
index.php的开头
session_start();
if($_SESSION['logged_in'] == false) {
$random_number = rand(1,100000);
session_id($random_number);
session_id['email'] = '';
}
而我的index.php的结尾
<?php
session_write_close(); // Session code ends here!
?>
我在会话开始之后就用
代码验证用户密码的验证过程 $dbconn = pg_connect("host=localhost port=5432 dbname=masi user=masi password=123");
$result = pg_prepare($dbconn, "query22", "SELECT passhash_md5 FROM users
WHERE email=$1;");
$passhash_md5 = pg_execute($dbconn, "query22", array($_REQUEST['email']));
// users from registration/login form
if ($passhash_md5 == md5($_REQUEST['password'])) {
$_SESSION['logged_in'] = true;
$_SESSION['email'] = $_REQUEST['email'];
$_SESSION['passhash_md5'] = md5($_REQUEST['password']);
}
// this may be unnecessary if the passhash_md5 cannot be changed by the user
$passhash_md5_2 = pg_execute($dbconn, "query22", array($_SESSION['email']));
// users staying in the site
if ($passhash_md5_2 == $_SESSION['passhash_md5'])) {
$_SESSION['logged_in'] = true;
}
代码连续生成随机会话,以便不为用户保存用户的数据。
我在代码中用$_REQUEST
替换了登录/注册处理程序后的每个$_SESSION
,因为$_REQUEST
不包含$ _SESSION - 仍然是同样的问题,我在主页后看不到用户名注册/登录。
答案 0 :(得分:3)
您应该使用输出缓冲来防止此
<?php
ob_start();
everything here
ob_end_flush();
?>
正常输出发生后,您无法发送标头。
答案 1 :(得分:2)
您的代码如下所示:
-- content cut --
</html>
<?php
session_regenerate_id(true); // Session code ends here!
session_write_close();
?>
在调用session_regenerate_id
之前,你确实有一些输出(实际上是你页面的全部内容);因此错误。
问题不在于“空行”或空格:它是输出;并输出 HTML ; - )
与对session_start
的调用一样,对session_regenerate_id
的调用应该在脚本开头完成,然后才能向浏览器发送任何内容。
所以,在这里,在index.php
的“顶部”的块中。
编辑:更多想法。
顺便说一句?我不确定你是否真的需要致电session_write_close
;我可能从未使用过这个功能,我相信......而且,引用文档:
会话数据通常存储在之后 你的脚本终止没有 需要调用session_write_close()
您可能需要自己调用此函数的唯一情况是,如果您要进行长时间的计算:
会话数据被锁定以防止 并发写入只有一个脚本可能 随时进行会话。什么时候 使用框架集和会话 您将体验到框架加载 由于这种锁定一个接一个。您 可以减少加载所有时间 通过结束会话为框架 所有更改到会话 变量已经完成。
但这似乎不是你的情况,因为你在脚本的末尾调用它。
那么,您可以尝试删除对该函数的(无用?)调用...
而且,关于session_regenerate_id
:你真的需要在每个页面上调用这个函数吗?
我想从来没有打过电话就足以让你的网站工作......即使你可能想在用户登录时调用它,也是为了安全预防措施(如果我没记错的话,那么无论什么时候调用这个函数都很好。用户的权限级别更改)
同样关于session_id,顺便说一下:你真的需要在每一页上调用这个函数吗?
答案 2 :(得分:1)
答案 3 :(得分:1)
session_regenerate_id
- 使用新生成的
如果你按照自己的方式使用它,你将一遍又一遍地产生新的会话。
session_id
- 获取和/或设置当前会话ID
您每次都使用随机数设置新会话。
实际上,你唯一需要使用会话的是在脚本的开头放一个session_start()语句。