已经发送了奇怪的PHP标头

时间:2014-10-19 22:14:04

标签: php http-headers

我有一个简单的模板渲染系统,包括页眉,模板和页脚PHP文件。标头有一个PHP函数调用来呈现导航栏。模板有一个函数调用,用于设置标题('location ...');页脚只是基本的HTML。

当我查看该页面时,我收到“已发送标题”错误,指定标题中用于回显导航栏的行。如果我修改代码以删除导航中的子元素,我不会收到“已发送标题”错误。子元素只不过是数组项。如果我用虚拟文本替换它们,那么页面会正确重定向。

我想这很简单,但是让我难过!

header.php(传入的int指定要扫描的深度)

<ul class="nav navbar-nav"><?php echo getNavigation(1); ?></ul>

的template.php

// Run from start
default:
        $_SESSION['updateStart'] = microtime(true);
        $_SESSION['updateErrors'] = array();
        $_SESSION['updateLog'] = array();
        header('location: /update-products?action=getDataFeeds');
        exit();
break;

getNavigation函数:

function getNavigation($depth) {
    global $path, $misc;

    $items = $misc->getNavigation(1,(int)$depth,true);
    $nav = "";

    if($items) {
        foreach($items as $item) {
            $class = ($item['ob_alias']==("/".$path[0])?' class="active"':'');
            $nav .= '<li'.$class.'>';

            if(isset($item['children'])) {
                $nav .= '<a href="#" class="dropdown-toggle" data-toggle="dropdown">'.$item['ob_label'].' <span class="caret"></span></a>';
                $nav .= '<ul class="dropdown-menu" role="menu">';
                foreach($item['children'] as $child) {
                    $class = ((isset($path[1]) && $child['ob_alias']==("/".$path[1]))?' class="active"':'');
                    $nav .= '<li'.$class.'><a href="'.$child['ob_alias'].'">'.$child['ob_label'].'</a></li>';
                }
                $nav .= '</ul>';
            } else {
                $nav .= '<a href="'.$item['ob_alias'].'">'.$item['ob_label'].'</a>';
            }
            $nav .= '</li>';
        }
    }       
    return $nav;
}

我试图浏览我的代码以及我可以做的所有事情来切换错误Vs.让页面按预期运行是在我的getNavigation()调用中替换这一行:

$nav .= '<li'.$class.'><a href="'.$child['ob_alias'].'">'.$child['ob_label'].'</a></li>';

$nav .= '<li>Some dummy text</li>';

然后没关系。我不明白为什么包含两个数组项字符串会破坏'标题'。

任何帮助或指向测试的东西都是最受欢迎的。

1 个答案:

答案 0 :(得分:1)

看到你加载所有这些的顺序可能会有所帮助,但是根据你拥有的内容,我会怀疑你在template.php中设置标题之前渲染了某些内容(比如导航)。您可能需要reference this answer以及发布更具体的代码,以显示模板文件的加载顺序。

Functions that send/modify HTTP headers must be invoked before any output is made. 

Otherwise the call fails.

Output can be:

Unintentional:

   Whitespace before <?php or after ?>
   UTF-8 Byte Order Mark
   Previous error messages or notices

Intentional:

   print, echo and other functions producing output (like var_dump)
   Raw <html> areas before <?php code.