我为这个琐碎的问题道歉,但我在使用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();