PHP 重定向在登录页面上不起作用

PHP redirection not working on login page

我创建了一个 login.php 页面并使用 php 代码检查数据库中的凭据。如果输入的凭据不正确,它会显示错误(这很完美)。但如果输入的凭据正确,它不会重定向到 index.php 页面。

请检查login.php的php代码:

<?php
    if (isset($_POST['submit'])){
        session_start();
        $username = $_POST['username'];
        $password = $_POST['password'];
        $query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
        $result = mysql_query($query)or die(mysql_error());
        $num_row = mysql_num_rows($result);
        $row=mysql_fetch_array($result);
        if( $num_row > 0 ) {
            $_SESSION['id']=$row['user_id'];
            header('location:index.php');
        }
        else{ ?>
            <div class="alert alert-danger">Access Denied</div> 
            <?php
        }
    }
?>

Kindle 参考错误截图:

我认为数据库中的 user_id 没有正确分配给 $_SESSION['id']。如果有人可以指导解决这些错误,我将不胜感激。

提前致谢。

如果您收到 "headers already sent" 错误,则重定向将不起作用。 尝试像下面这样更改您的代码,

if( $num_row > 0 ) {
            $_SESSION['id']=$row['user_id'];
            echo '<META HTTP-EQUIV="Refresh" Content="0; URL=index.php">';    
           
}

尝试将代码更改为如下所示(注意 $_SESSION 在 header() 之前):

if( $num_row > 0 ) {
    $_SESSION['id']=$row['user_id'];
    header('location:index.php');
}

错误消息准确地说明了问题所在:在给定 php 文件的给定行,已经生成了输出。开始输出后,不能再设置headers,因为它们必须在任何文档数据之前设置。

为了解决问题,请检查给定行产生的输出。您也许可以将其删除。如果没有,您可以使用缓冲。如果直接输出到缓冲区,则可以随时添加 headers。

检查 http://php.net/manual/en/function.ob-start.php 以了解如何使用缓冲。这很简单:您只需在开始时将其打开,然后在完成后刷新缓冲区。

请注意,session id 不会自动附加到 header() 中的 URL。您将必须手动执行此操作。另请注意,根据 RFC,URL 实际上需要是绝对的(尽管相对 URL 通常会起作用)。所以使用:

header("Location: ". $_SERVER['HTTP_HOST'] ."/index.php?". SID);

有关详细信息,另请参阅 http://php.net/manual/en/session.idpassing.php and http://php.net/manual/en/session.constants.php