1

我在 PHP 中遇到了 'setcookie' 的问题,我无法解决。

所以我收到此错误“警告:无法修改标头信息 - 标头已由 C:\Program Files\VertrigoServ\www\vote 中的(输出开始于 C:\Program Files\VertrigoServ\www\vote.php:14)发送。第 86 行的 php"

这是文件.. 第 86 行是 setcookie ($cookie_name, 1, time()+86400, '/', '', 0); 有没有其他方法可以做到这一点?

<html>
<head>
<title>Ranking</title>
<link href="style.css" rel="stylesheet" type="text/css">
</head>
<body bgcolor="#EEF0FF">
<div align="center"> 
<br/> 
<div align="center"><div id="header"></div></div>
<br/> 
<table width="800" border="0" align="center" cellpadding="5" cellspacing="0" class="mid-table"> 
    <tr><td height="5">
        <center> 
            </tr> 
            </table> 
        </center> 
    </td></tr> 
    <tr><td height="5"></td></tr> 
</table> 
<br/> 
<?php
    include "conf.php";

    $id = $_GET['id'];
    if (!isset($_POST['submitted']))
    {
        if (isset($_GET['id']) && is_numeric($_GET['id']))
        {

                    </div></td></tr> 
                    <tr><td align="center" valign="top"><img src="images/ads/top_banner.png"></td></tr> 
                </table> 
            </form> 
            <?php
        }
        else
        {
            echo '<font color="red">You must select a valid server to vote for it!</font>';
        }
    }
    else
    {
        $kod=$_POST['kod'];
        if($kod!=$_COOKIE[imgcodepage])
        {
            echo "The code does not match";
        }
        else
        {
            $id = mysql_real_escape_string($_POST['id']);
            $query = "SELECT SQL_CACHE id, votes FROM s_servers WHERE id = $id";
            $result = mysql_query($query) OR die(mysql_error());
            $row = mysql_fetch_array($result, MYSQL_ASSOC);
            $votes = $row['votes'];
            $id = $row['id'];
            $cookie_name = 'vote_'.$id;
            $ip = $_SERVER['REMOTE_ADDR'];
            $ltime = mysql_fetch_assoc(mysql_query("SELECT SQL_CACHE `time` FROM `s_votes` WHERE `sid`='$id' AND `ip`='$ip'"));
            $ltime = $ltime['time'] + 86400;
            $time = time();

            if (isset($_COOKIE['vote_'.$id]) OR $ltime > $time)
            {
                echo 'You have already voted in last 24 hours! Your vote is not recorded.';
            }
            else
            {
                $votes++;
                $query = "UPDATE s_servers SET votes = $votes WHERE id = $id";
                $time = time();
                $query2 = mysql_query("INSERT INTO `s_votes` (`ip`, `time`, `sid`) VALUES ('$ip', '$time', '$id')");
                $result = mysql_query($query) OR die(mysql_error());
                setcookie ($cookie_name, 1, time()+86400, '/', '', 0);
            }
        }
    }
?>
<p><a href="index.php">[Click here if you don't want to vote]</a></p><br/>
<p><a href="index.php">Ranking.net</a> &copy; 2010-2011<br> </p> 
</div> 
</body> 
</html> 

非常感谢!

4

5 回答 5

4

和调用之前不能有任何输出。header()setcookie()

https://stackoverflow.com/search?q=+headers+already+sent+by
https://stackoverflow.com/tags/php/info

任何输出都包括开头标记<html>之前的任何内容,或者任何内容。另一个罪魁祸首是 UTF-8 BOM http://en.wikipedia.org/wiki/Byte_Order_Mark - 大多数文本编辑器不会明显显示,但在文件开头时会混淆 PHP。<?phpprintecho

于 2011-03-20T00:05:04.447 回答
2

设置 cookie 需要向客户端发送标头,如果输出已经开始,则无法发送标头。

您必须将 PHP 代码放在HTML 标记之前,以便您可以在发送任何输出之前调用 setcookie,并且您还可以将 PHP 代码与您应该做的演示分开。

于 2011-03-20T00:05:23.543 回答
1

您应该将 cookie 代码放在页面顶部。更好的布局是这样的:

<?php
//include config

//check posted data (included settings cookies)


//set needed variables
?>
<html>
.....

您还可以将 php 代码和 html 分开。这通常是我所做的。我的使用通常涉及视图类或(过去)smarty。但一个简单的例子是在上面的 php 代码的底部添加这段代码并去掉 html:

<?php               

  if(empty($tpl)) {
    $tpl = 'index';
  }

  if(file_exists("template/{$tpl}.tpl.php")) {
    include("template/{$tpl}.tpl.php");
  }
  else {
    header('Location: /');
  }

?>

您需要创建一个名为“模板”的目录并将 html 代码添加到以 .tpl.php 扩展名结尾的文件中。实际上,它们只是 php 页面,但 .tpl。部分帮助您记住它只是标记。使它们成为 php 页面(不是 html),以便您可以输出变量

然后在上面代码的不同部分中,您将 $tpl 设置为您要加载的模板。

这只是一段基本代码,但它应该让您大致了解如何分离这些数据。主要思想是所有的 html 和文本都将在所有编程代码完成后输出。

于 2011-03-20T00:23:56.917 回答
0

您需要做的是创建一个很好的缓冲区来保存所有标题,直到您停止处理。ob_start 为您完成这项工作,这是对它的参考。http://php.net/manual/en/function.ob-start.php

当你完成加载所有不同的标题时,像这样使用 ob_get_contents $text = ob_get_contents(); echo($text); ob_end_clean();

我希望这有帮助。

于 2011-03-20T00:15:01.313 回答
0

在输出任何东西后,您不能使用 PHP 设置 cookie,并且第一个 php 标记之前的 html 确实算作输出。要保持纯粹的 php 方法,您必须移动整个部分,以确定将什么放入 cookie 并将其设置到最顶部。或者在需要大量额外工作才能做到这一点的情况下,我所做的就是让 php 回显 JavaScript 代码以设置 cookie。现在,如果您制作或获得了一个不错的 JS cookie 设置功能并将其嵌入或链接到页面中。那么你所要做的就是让 php 回显函数调用,并在其中包含正确的数据。那么当页面加载时php仍然不会设置cookie,但是当浏览器运行js代码时它会。所以你得到你想要的cookie设置。而且您不必将这些东西移到顶部。

于 2012-04-19T17:58:02.033 回答