它不会设置会话?

问题描述:

我有这个php登录系统,我在localhost上工作得很好,我买了一个webhotel,现在它不再工作,我找不到它出错的地方。它不会设置会话?

我没有得到任何错误。

登录页面在index.php中,当你登录时,如果任何事情都没问题(没有错误/错误的密码等),那么你将被重定向到home.php。

事实并非如此。当我登录时,它只是刷新index.php并将其输出到顶端:

警告:无法修改标头信息 - httpd.www中的(httpd.www/oBz/index.php:2)已发送的标头/oBz/index.php 221行

on line 221 there's: header(“Location:home.php”);

好的,所以我通过输入地址手动去home.php。现在,在home.php我有这样的顶部:

include 'dbc.php'; 
page_protect(); 
echo "HELLO WORLD"; 

page_protect检查是否有设置任何会话或饼干(记得我),但是如果事情已定,你会看到的内容“HELLO WORLD”否则你不会。

但现在当我home.php进入我刚刚收到此:

警告:在session_start()[function.session启动]:不能发送会话cookie - 头已经发出(输出开始httpd.www/oBz/dbc.php:29)在httpd.www/oBz/dbc.php上线69
警告:session_start()[function.session-start]:无法发送会话缓存限制器 - 已发送的头文件(输出在httpd.www/oBz/dbc.php:29)在httpd.www/oBz/dbc.php在线69
警告:不能修改标题信息 - 已经发送的标题(输出在httpd.www/oBz开始/dbc.php:29)在httpd.www/oBz/dbc.php上117

69行theres session_start(),它是函数page_protect()中的第一行;

线117个孤单header("Location: index.php"),是那里,如果你没有登录重定向(会话设置/设置Cookie)

希望我提供的信息不够,如果不只是评论你需要什么,我会尽我最好把它提供给你..

谢谢

更新:

这里是dbc.php:http://phpbin.net/x/999009567

** index.php文件,当您登录并在会话设置http://phpbin.net/x/1564167411

**更新: 我现在解决了这个头警告/错误,但不是为会话问题的解决方案!

**更新: phpbin.net/x/25857430更新的dbc.php,之前在dbc.php中的所有html都在一个新的文件top.php中。我包括顶部。php文件在index.php中的doLogin函数部分后,所以没有得到任何错误的头文件..

***更新:问题是在这里:http://phpbin.net/x/557713701这就是为什么它重定向到index.php所有时间

+0

那么我们可以看到dbc.php吗? – spinon 2010-07-27 22:42:38

+0

http://phpbin.net/x/999009567 – Karem 2010-07-27 22:46:41

线2您已经发送并输出到所有的HTML PHP的第一个位之前存在的浏览器。

您需要重新排列代码,以便在将任何HTML发送到浏览器之前发生需要发送标题的任何内容。

所以:

<?php 
session_start(); 

?> 
<html> 
<head> 
... 

最简单的答案可能是PHP代码后,移动所有的HTML。在那里有session_regenerate_id()的呼叫,在logout功能中有另一个session_start()

对于这个问题,为什么在这个文件中有HTML?除会话功能外,我还发现至少有2个电话拨打header()

更新:

if(isset($_COOKIE['user_id']) && isset($_COOKIE['user_key'])){ 
    /* we double check cookie expiry time against stored in database */ 

// I snipped a bunch of code, to point out what's going on here 

    } else { 
    header("Location: index.php"); 
    die(); 
    } 

所以,如果不存在cookie值,你猜发生在这里?

+0

我做了你说重新安排的代码,移动所有的HTML在另一个文件(TOP.PHP),所以我只是打电话给HTML的东西,这清理了警告但没有修复解决方案 – Karem 2010-07-27 23:13:37

+0

@ karem Theres有很多原因可能会重定向到index.php。找到每个header(“Location:index.php”);'在此之前调用并调试代码。例如: – 2010-07-27 23:29:45

+0

@乔治玛丽安饼干没有被设置,如果你没有选中“记住”,但我想你会议。我有2个标头位置index.php,一个内部注销功能,以及一个如果任何cookie或会话设置 – Karem 2010-07-27 23:36:06

您正在查看错误消息的错误位。你正在看的部分是它试图发送标题的地方(即:它认识到某些事情是错误的地方)。然而,相关部分是它开始生产产量的部分。对于第一个错误,它表示输出已经在index.php第二行开始。您可能在开始<?php标记前留有空格。我会检查第一...

+0

请检查我已上传的dbc.php。不,我没有 Karem 2010-07-27 22:49:03

+0

@Karem以及它可能在?>标记之后。你为什么不能自己检查第29行? – 2010-07-27 22:52:34

+0

您已在标签之前输出。必须在任何输出之前调用session_start()。为什么它可能在你的本地主机服务器上工作的原因是你打开了输出缓冲(这是我的猜测)。一个简单的'之前''''应该解决问题(当然也可以将它从该函数中移除)。 – 2010-07-27 22:52:39

我猜想:

你发出

die(); 

header("Location: home.php");

???

您可能会忘记关闭输出,以便打印出页面的其余部分,而不管此重定向如何。

另外,请确认编码是否好,应该是UTF-8?有时候,我听错了自己:(

好了,更新的答案:

266 header("Location: index.php"); 

303 header("Location: home.php"); 

340 header("Location: home.php"); 

您没有发出模具()这三条线之后所以这可能是一个风险:)

+0

我用exit();我尝试死();我仍然有头错误,但我发现这不是会话问题的问题。 – Karem 2010-07-27 22:50:09

+0

@Karem:请检查我的更新回答 – 2010-07-27 23:23:06

+0

我已发出die();现在,仍然没有:( – Karem 2010-07-27 23:26:32

而且dbc.php的第29行是回显,打印或者生成一些输出到浏览器....那么围绕该行的dbc.php中的代码是什么?

同样的index.php文件

+0

请检查更新的问题dbc.php – Karem 2010-07-27 22:51:04