-1

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

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

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

这就是我现在正在做的事情:

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

我想知道是否有解决此问题的方法。当我在本地主机上测试它时它正在工作,但不是在服务器上......

4

2 回答 2

0

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

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

于 2013-06-25T21:07:56.920 回答
0

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

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

如果“标头已发送”错误出现在任何其他错误之后,那么您需要先修复该其他错误。(错误消息本身就是导致发送标头的原因,因此修复该错误将导致第二个错误也消失。)

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

概括:

a)寻找它“开始”的地方

b) 跟踪行号

c) 检查那条线上的正常情况。

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

d) 其余信息仅显示其他执行信息,主要是发现由于“开始于”位置发生的问题而无法按预期进行的代码部分。

来源:zen-cart.com

SO上的另一个类似线程:How to fix "Headers already sent" error in PHP

我希望这有帮助。

于 2013-06-25T21:08:35.417 回答