session_regenerate_id and setcookie on same page in PHP


session_regenerate_id and setcookie on same page in PHP

好的,所以我正在这个登录系统上工作,当然,当用户登录时,我会重新生成会话id。但在我重新生成会话id后,我还想设置一个存储在cookie中的令牌。然而,我似乎无法在同一页上做到这一点。我收到一个错误,上面写着:

警告:session_regenerate_id()[function.session-regeneration-id]:无法重新生成会话id-标头已在第44行的/htdocs/somesite/test.php中发送

警告:无法修改标头信息-标头已由第54行的/htdocs/somesite/test.php中的(输出起始于//htdocs/somesite/trest.php)发送

这就是我现在正在做的:

session_regenerate_id();
setcookie("Foo","Bar", time()+$CookieExpireTime,"/");

我想知道这方面是否有工作。当我在本地主机上测试它时,它可以工作,但在服务器上不可以。。。

常见原因:此警告通常是由.php文件开头或结尾的空格或额外一行引起的。检查产生错误的文件名(即:"输出起始于……"文件名),在文本编辑器中打开该文件,并删除第一个之前的多余空格或行

其他原因:语法错误在上面的示例中,您将看到输出从/…开始。。。。包括/something/something.php:12。includes/something/something.php是您需要关注的文件名。:12表示您需要解决的问题在第12行。在同一个示例中,可以完全忽略"第67行的In/includes/something_else.php"消息。这不是问题所在。是那个发现问题已经发生的人。

如果在任何其他错误之后出现"headers already sended"错误,则您需要首先修复该其他错误。(错误消息本身就是导致发送标头的原因,因此修复该错误也会导致第二个错误消失。)

如果"started at"指的是第1行,那么它要么是打开<?php标记之前的一个空格,要么是文件中的错误编码。请记住,如果您的语言是UTF8,那么您必须将文件编码为"UTF8 without BOM",否则BOM(字节顺序标记,文件开头的一个不可见字符)将导致相同的标头已发送错误。

摘要:

a) 寻找的起点

b) 跟踪线路号

c) 检查一下那条线上正常发生的事情。

  • 如果它是文件的末尾,那么它就是空格
  • 如果它是文件的开头,那么很可能是空格或错误的编码
  • 在其他地方,它可能是语法错误,或者是显示信息或调试代码的"echo()"语句的结果
  • 常见的语法错误包括在已经有单引号的语句中使用单引号。请检查以确保您的报价没有不匹配。如果您需要在其他单引号内使用单引号,请将您的单引号改为''',而不仅仅是'

d) 其余的信息只是显示其他执行信息,主要是发现由于"started at"位置出现问题而无法按预期进行的代码部分。

来源:zen-cart.com

SO上的另一个类似线程:如何修复";标头已发送";PHP 中的错误

我希望这能有所帮助。

问题不在于这两个函数,问题在于一旦将任何输出发送到页面,就无法调用session_regenerate_id()。在向页面发送任何类型的输出之前,必须调用该函数(如header())。

重新构建页面结构,以便在发送任何输出之前调用此函数,或者使用输出缓冲,以便在发出任何页面内容之前调用此功能。