无法修改与MySQL查询相关的标头信息

时间:2012-12-30 03:05:40

标签: php mysql

  

可能重复:
  Headers already sent by PHP

我解决了这个问题,但由于我不明白是什么导致了这个问题,我无法确定它是否已经解决了。

我的PHP站点在您登录之前显示主页上的最新活动。我最近修改了逻辑以包含更多类型的活动。看起来它有效,但登录时出现以下错误:

Warning: Cannot modify header information - headers already sent by
(output started at header.php:75)
in index.php on line 26

我认为此错误消息具有误导性,因为我修复它的方法是在MySQL查询中将“LIMIT 10”更改为“LIMIT 9”,以使活动显示在主页上。

    public function getLatestActivity()
{
    $sql = "SELECT 'Debate' AS Type, d.Debate_ID AS ID, CONCAT('debate.php?debate_id=', d.Debate_ID) AS URL, d.Title, d.Add_Date
        FROM debates d

        UNION SELECT 'Discussion' AS Type, d.Discussion_ID AS ID, CONCAT('discussion.php?discussion_id=', d.Discussion_ID) AS URL, d.Title, d.Add_Date
        FROM discussions d

        UNION SELECT 'Petition' AS Type, p.Petition_ID AS ID, CONCAT('petition.php?petition_id=', p.Petition_ID) AS URL, p.Petition_Title AS Title, p.Add_Date
        FROM petitions p

        ORDER BY Add_Date DESC
        LIMIT 9";

    try
    {
        $stmt = $this->_db->prepare($sql);
        $stmt->execute();
        $activity = array();
        while ($row = $stmt->fetch())
        {
            $activity[] = '<span style="font-size: x-large"><strong>Latest activity</strong></span><br /><span style="font-size: large">' . $row['Type'] . ': <span style="color: #900"><a href="' . $row['URL'] . '" style="color: #900">' . $row['Title'] . '</a></span></span>';
        }
        $stmt->closeCursor();

        return $activity;
    }
    catch(PDOException $e)
    {
        return FALSE;
    }
}

这就是我正在使用该函数返回的数据。它遍历数组并每4秒显示一个新项目。

    <?php $latest_activity = $pdb->getLatestActivity(); ?>
<script type="text/javascript">
    var activity = <?php echo json_encode($latest_activity);  ?>;
    var index = -1;
    $(function()
    {
        getLatestActivity();
    });
    function getLatestActivity()
    {
        index = (index + 1) % activity.length;
        var div = document.getElementById('divLatestActivity');
        if (index < activity.length)
        {
            div.innerHTML = activity[index];
        }
        setTimeout("getLatestActivity()", 4000);
    }
</script>

为什么将“LIMIT 10”更改为“LIMIT 9”会修复“无法修改标题信息”的问题?

2 个答案:

答案 0 :(得分:0)

在PHP中,如果你使用header()函数(即header(“Location:login.php”);重定向到login.php页面),你必须在之前可能会将文本输出到浏览器的其他代码。

//this will CAUSE a warning
echo "Login now";
session_start()
header("content-type:text/html");
header("cache-control:max-age=3600");

...然而

//this will NOT CAUSES a warning
header("content-type:text/html");
header("cache-control:max-age=3600");
session_start();
echo "Login now";

因此梳理执行任何session_start()或header()指令的代码,并确保没有echo“”;在他们面前。如果在session_start()或header()之前有任何MySQL警告被抛出到页面上,这也会导致此警告。

答案 1 :(得分:0)

您需要检查某些输出是否以echo,print或HTML的形式完成。如果已经完成,那么header(“LOCATION:login.php”)将抛出错误。

一种解决方法是使用输出缓冲。

  

ob_start();