2

对于这个微不足道的问题,我深表歉意,但我在使用 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>
4

1 回答 1

4

You can include files wherever you want. The problem is OUTPUT. If you're going to be doing header() calls, you cannot have performed ANY output prior to the call. If your includes are simply spitting out output, and are not just defining functions/vars for later use, then you'll have to have to modify the includes to NOT do that output, or at least buffer/defer the output until later. e.g.

<?php

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

will fail no matter what, because your include did output, and kills the header call. But if you mod the include, so you have something more like:

<?php

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

will work just fine. If you can't mod the code, then

<?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();     
于 2013-08-09T18:12:11.327 回答