即使遵循php.net上的规则,setcookie()始终会失败“已发送标头”

时间:2010-08-23 05:17:44

标签: php setcookie

相关的代码片段如下。根据php.net我必须确保没有输出,甚至没有任何空格。没有。 php标签是文档中的第一个标签,前面没有空格。我做错了什么?

<?php

    // main.php
    // 6:48 PM 8/6/2010

    include('config.php');

    // Does myid cookie exist?
    if ( !isset( $_COOKIE['myid'] ) )
    {
        // Generate myid
        $myid = substr(md5(date( 'Ymdhis' ) . str_replace( '.', '', $_SERVER['REMOTE_ADDR'] ) ), 0, 10);

        // set the cookie
        setcookie( 'myid', $myid, time() + 31536000 );

3 个答案:

答案 0 :(得分:0)

在调用setcookie之前,需要根本没有输出,即使是来自其他脚本也是如此。

例如,如果config.php在开始<?php标记之前(或在结束?>之后)有空格,则会导致问题。

追捕调用header的位置或存在PHP标记(甚至空格)之外的某些文本。毫无疑问,这就是正在发生的事情。

答案 1 :(得分:0)

某些文字编辑器未显示所有符号。请尝试打开你的main.php和config.php不同的编辑器,并检查两个文件中的&lt;?php之前的内容。我无法讲述Windows,但在Linux上,您可以使用vimvi。此外,完整的错误消息告诉您错误开始的位置。

答案 2 :(得分:0)

您无法在此处阅读或至少粘贴此错误消息。它有详细的解释,你做错了什么 很可能它会说输出从config.php:XXX开始。很清楚。

如果它表示输出是从main.php:0开始的 - 这很可能是BOM个字符,你必须使用你的编辑器保存对话框或其他编辑器重新保存你的文件。

始终阅读整个错误消息。它不仅说明出了什么问题,而且经常解释,当然发生了什么。