【问题标题】:session_regenerate_id and setcookie on same page in PHPsession_regenerate_id 和 setcookie 在 PHP 的同一页面上
【发布时间】:2013-06-25 20:57:50
【问题描述】:

好的,所以我正在使用这个登录系统,当然,当用户登录时,我会重新生成会话 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,"/");

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

【问题讨论】:

  • 谢谢大家,在 session_regenerate_id 之前确实有一些输出,我只是错过了......

标签: php session header setcookie


【解决方案1】:

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

其他原因:语法错误 在上面的示例中,您将看到从 /....includes/something/something/something.php:12 开始的输出。 include/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

我希望这会有所帮助。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-07
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      • 2015-10-14
      • 2014-03-10
      • 1970-01-01
      • 2015-05-17
      相关资源
      最近更新 更多