PHP,是否可以在文件顶部包含一个PHP文件来绕过header()函数的限制


PHP, is it acceptable to include a php file not at top of the file to get around the limitations of the header() function?

我为这个琐碎的问题道歉,但我在使用header()php函数重定向到页面时遇到了问题。更具体地说,当用户试图查看不存在的个人资料页面时,我很难重定向用户。我的问题是,我总是包含一个头文件,其中包含会话开始和一些显示基本头的html。这是否意味着我不能使用header()函数重定向到脚本中包含此头文件的页面?我认为解决这个问题的一种方法可能是将标头的html部分拆分为一个单独的文件,并首先包含标头脚本,然后编写我的配置文件脚本,最后包含标头的html部分。这是不好的做法吗?profile.php脚本如下:

<?php include("inc/incfiles/header.inc.php"); ?>
<?php
if(isset($_GET['u'])) {
    //check user exists
    $username = mysql_real_escape_string($_GET['u']);
    if (ctype_alnum($username)) {
        $check = mysql_query("SELECT username, email FROM users WHERE username = '$username'");
        if (mysql_num_rows($check)===1) {
            $get = mysql_fetch_assoc($check); //execute query and store in array
            $username = $get['username'];
            $email = $get['email'];
        }
        else {
            header("Location: index.php");
            die();
        }
    }
    else {
        echo "username has to be alphanumeric";
    }
}
else {
    echo "error";
}
?>

<h2> Profile page of <?php echo "$username";?>

<h3> Email: <?php echo "$email";?>

header.inc.php文件:

<?php
include ("inc/scripts/mysql_connect.inc.php");
//start the session

session_start();
//Checks whether the user is logged in
$user = $_SESSION["user_login"];
if (!isset($SESSION["user_login"])) {
//header("Location: index.php");
//exit();

}
else
{
    header("location: home.php");
}

?>
<?php

//Login Scripts has to be at the top to make sure header() redirecting works

if (isset($_POST["user_login"]) && isset($_POST["password_login"])) {
$user_login = preg_replace('#[^A-Za-z0-9]#i','', $_POST["user_login"]); //filter user login text
$password_login = preg_replace('#[^A-Za-z0-9]#i','', $_POST["password_login"]); //filter user password text
$md5password_login = md5($password_login);
$sql = mysql_query("SELECT id FROM users WHERE username='$user_login' AND 
password='$md5password_login' LIMIT 1"); //query the user

//Check for user's existence
$userCount = mysql_num_rows($sql); //count number of rows
if ($userCount == 1) {
    while ($row = mysql_fetch_array($sql)) {
        $id = $row["id"];
    }

    $_SESSION["user_login"] = $user_login;
    $_SESSION["password_login"] = $md5password_login;

header("Location: home.php");

    exit();

}
else {
    echo "That information is incorrect, try again";
}
}

?>

<html>
<head>
    <link href = "css/main.css" rel = "stylesheet" type = "text/css">
    <title> title </title>
</head>
<body>
    <div class = "wrapper">
        <div id = "header">
            <div class = "logo">
                <img src = "img/Logo.png">
        </div>
            <div id = "login-header">

                    <form action = "index.php" method ="post" name = "form1" id = "form1">
                            <div class = "input-wrapper"><input type = "text" size = "25" name = "user_login" id = "user_login" placeholder = ">Username" ></div>
                            <div class = "input-wrapper"><input type = "password" size = "25" name = "password_login" id = "password_login" placeholder = "Password" ></div>
                            <div class = "input-wrapper"><input type = "submit" name = "login" value = "Sign in"></div>
                    </form>

            </div>

        <div id = "menu">
            <a href = "#"></a>
            <a href = "#"></a>
        </div>
    </div>
</div>

您可以在任何需要的地方包含文件。问题是输出。如果要执行header()调用,则不能在调用之前执行ANY输出。如果您的include只是输出,而不仅仅是定义函数/var供以后使用,那么您将不得不修改include以不进行该输出,或者至少缓冲/推迟输出到以后。例如

<?php
include('some_file_that_causes_output_when_loaded.php');
header('This header will not work');

无论如何都会失败,因为include输出了,并终止了头调用。但如果你修改了include,那么你就有了更像的东西

<?php
include('file_that_just_defines_functions.php');
header('This header will work');
function_from_include_that_causes_output();

会很好用的。如果你不能修改代码,那么

<?php
ob_start();
include('some_file_that_causes_output_when_loaded.php');
header('This header will still work, because we're buffering output');
ob_end_clean();