-3

可能重复:
PHP 已发送的标头

运行用户登录脚本后尝试重定向时出现此错误。

它尝试在此行更改标题数据:

header("Refresh: 2; url=index.php");

这是完整的 login.php 脚本。

<?php 
session_start();
require_once('init.php');

$username = trim($_POST['username']);
// create a new object
$login = new Auth($_POST, $dbh);

    if($login->validateLogin()){

        $_SESSION['loggedin'] = true;
        $_SESSION['username'] = $username;
        $list = $login->getUserInfo();
        $_SESSION['id'] = $list['id'];
        $_SESSION['thumb'] = $list['img_thumb'];

        echo '<div class="content">';
        echo '<h1>Thank you for logging in '.$username.'. Redirecting...</h1>';
        echo '</div>';
        header("Refresh: 2; url=index.php");

    }else{

        echo '<div class="content">';
        echo '<h1>Sorry but we didn\'t recognise those login details, please try again.</h1>';
        echo '</div>';

    }



require_once('inc/footer.inc.php');
?>

init.php 文件调用包含 html5 文档类型、元标记等的 header.php。

登录后如何将用户重定向到索引页面并像往常一样发送标题信息?

4

3 回答 3

3

来自PHP 文档

请记住,header()必须在发送任何实际输出之前调用它,无论是通过普通 HTML 标记、文件中的空白行还是通过 PHP。

如果您希望页面在几秒钟后重定向,您将需要使用Meta Refresh

<meta http-equiv="refresh" content="5;URL='http://example.com/'">
于 2012-07-23T15:23:27.120 回答
0

只需将header()调用移到任何echo语句之前:

<?php
/* ... */
if($login->validateLogin()){

    $_SESSION['loggedin'] = true;
    $_SESSION['username'] = $username;
    $list = $login->getUserInfo();
    $_SESSION['id'] = $list['id'];
    $_SESSION['thumb'] = $list['img_thumb'];

    header("Refresh: 2; url=index.php"); // Put this *before* any output
    echo '<div class="content">';
    echo '<h1>Thank you for logging in '.$username.'. Redirecting...</h1>';
    echo '</div>';

}else{

    echo '<div class="content">';
    echo '<h1>Sorry but we didn\'t recognise those login details, please try again.</h1>';
    echo '</div>';

}
/* ... */
于 2012-07-23T15:23:41.890 回答
0

使用 echo 然后尝试为 Location 设置标头将始终引发该错误。¿ 让用户知道重定向比重定向他们更好吗?如果你想显示这样的消息(如果它曾经有效,这种方法不会显示它一秒钟),你应该使用 javascript 来更新内容并使用某种延迟......

...但也许这是太多的工作。如果登录后显示欢迎信息,应该就足够了,对吧?:)

于 2012-07-23T15:24:12.390 回答