我正在为一个我本学期学习的课程开发一个小型的PHP和MySQL项目。这是一个非常基本的模拟粉丝页面网站,它将具有用户管理,文件上传,电子邮件发送等功能。当我开始尝试刷新或重定向登录屏幕提交时,我出现的问题。该网站的基本结构使用模板: - header.php - index.php(或其他任何内容页面) - footer.php
Header和footer.php包含在所有用户可见页面中。
在我的 header.php 中,我有以下代码:
<?php
session_start();
// Check and set the logged_in var
if (isset($_SESSION['username'])){
$logged_in = true;
}else {
$logged_in = false;
}?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="HandheldFriendly" content="True">
<title>Life's A Garden, Dig It!</title>
<link rel="stylesheet" type="text/css" media="screen" href="css/concise.min.css" />
<link rel="stylesheet" type="text/css" media="screen" href="css/masthead.css" />
<link rel="stylesheet" type="text/css" media="screen" href="css/style.css" />
</head>
<body>
<header container class="siteHeader">
<div row>
<h1 column=4 class="logo"><a href="index.php">Welcome</a></h1>
<nav column="8" class="nav">
<ul>
<li><a href="books.php">Books</a></li>
<?php
// If user is not logged in nav bar = Books, Quotes, Login, Register
// If user is logged in nav bar = Books, Stories, Quotes, Contact, Uploads, Logout
if($logged_in){
echo '<li><a href="#">Stories</a></li>';
}
?>
<li><a href="#">Quotes</a></li>
<?php
// Only displayed if user is logged in
if($logged_in){
echo '<li><a href="email.php">Contact</a></li>';
echo '<li><a href="#">Uploads</a></li>';
echo '<li><a href="logout.php">Logout</a></li>';
}else{
echo '<li><a href="login.php">Login</a></li>';
echo '<li><a href="register.php">Register</a></li>';
}
?>
</ul>
</nav>
</div>
</header>
<main container class="siteContent">
这是我的 footer.php :
<!-- Script 8.3 - footer.html -->
<!-- END CHANGEABLE CONTENT. -->
</main>
<footer container class="siteFooter">
<p>Design uses <a href="http://concisecss.com/">Concise CSS Framework</a></p>
</footer>
</body>
</html>
这是我的 login.php (这是我遇到错误的地方):
<?php
// For debugging
ini_set('display_errors', 1);
error_reporting(E_ALL);
// Page title
define('TITLE', 'Login');
// Include header
include('templates/header.php');
// Establish DB connection
require('../mysqli_connect.php');
// Page introduction
print '<h2>Login Form</h2>
<p>Users who are logged in can take advantage of certain features like this, that, and the other thing.</p>';
// Check if the form has been submitted:
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// Sanitize and store input vars for login
$username_input = mysqli_real_escape_string($dbc, trim(strip_tags($_POST['username'])));
$password_input = mysqli_real_escape_string($dbc, trim(strip_tags($_POST['password'])));
// Retrieve query results for username entered
$query = "SELECT * FROM users WHERE username='$username_input'";
if ($result = mysqli_query($dbc, $query)) {
$row = mysqli_fetch_array($result);
// Check if that username was found in query. If not found error, if found store the associated pwd hash.
if (count($row) == NULL){
print '<p class="text--error">Error: The username you entered was not found in the system!<br>Go back and try again.</p>';
} else{
// Query resulted in good results for 1 matching username in DB, now save pwd hash in the db.
$db_pwd_hash = $row['password'];
// Update username session var
$_SESSION['username'] = $username_input;
// Redirect to homepage, refreshes nav bar view
header('Location: index.php');
}
}
// Handle the form:
if ( (!empty($username_input)) && (!empty($password_input)) ) {
if ( password_verify($password_input, $db_pwd_hash) ) { // Correct!
print '<p class="text--success">You are logged in!<br>Now you can blah, blah, blah...</p>';
} else { // Incorrect!
print '<p class="text--error">The submitted email address and password do not match those on file!<br>Go back and try again.</p>';
}
} else { // Forgot a field.
print '<p class="text--error">Please make sure you enter both an email address and a password!<br>Go back and try again.</p>';
}
} else { // Display the form.
print '<form action="login.php" method="post">
<p><label for="username">Username:</label><input type="text" name="username"></p>
<p><label for="password">Password:</label><input type="password" name="password"></p>
<p><input type="submit" name="submit" value="Log In!" class="button--pill"></p>
</form>';
}
// Include footer
include('templates/footer.php');
?>
现在,我知道代码充其量只是草率,而且我知道它可能会变得不安全。这只是我将基础知识结合在一起,并在事后有很多改进。但我碰到了一堵砖墙。当我使用正确的凭据通过DB中的用户登录时,逻辑工作并显示成功消息..但是这样的错误也是如此:
警告:无法修改标头信息 - 已发送的标头 (输出始于 /Applications/MAMP/htdocs/src/templates/header.php:9)in 第52行/Applications/MAMP/htdocs/src/login.php
我花了很多时间单独和朋友一起解决这个问题。我用Google搜索了错误并发现很多资源声称这是由于在发送标头之前发生的输出。我见过一些声称这是由编码引起的。我甚至似乎声称在include语句之后的单个空格可能会导致这种情况。无济于事,我尝试了一切。我使用Sublime作为我的编辑器,我验证了所有文件和首选项文件中Sublime默认用户设置的编码是正确的。我已经确认在任何include语句之后没有空格。然后我将我的代码发送给了我的朋友,然后他只是将我的文件复制到他现有的项目中,在他的机器上他根本没有任何错误,我的代码按原样运行。然后我让他把相同的3个文件发回给我,我们观察到这些文件完美无缺,然后复制它们并覆盖现有的文件,但我仍然得到上述错误。
我正在使用PHP 7.1.6和Apache的MAMP。我以前从来没有遇到过这样的问题,并且在相同的机器和相同的设置上编写PHP已经有一段时间了,没有任何问题。任何有关突破这一问题的建议都将非常感激!感谢您的时间。
答案 0 :(得分:0)
您在login.php上的include('templates/header.php');
将包含header.php
页面的全部(包括HTML)。然后,在此之后调用header()
,这将无法正常工作,因为在将任何写入DOM之前必须调用header()
。沿着这一行,请注意print
之前你不能header()
;您还需要移动// Page introduction
。
我建议您在两个相关点创建一个新文件include()
,该文件仅包含会话信息,不包括任何HTML。我还建议将header.php
转换为MVC视图,仅包含演示文稿,而不是逻辑。
session.php
(任何名称的新文件):
<?php
session_start();
// Check and set the logged_in var
if (isset($_SESSION['username'])){
$logged_in = true;
}else {
$logged_in = false;
}?>
templates/header.php
(纯粹的演示文稿页面,没有逻辑):
<!DOCTYPE html> ....
<强> login.php
强>:
// Include session
include('session.php');
...
// Redirect to homepage, refreshes nav bar view
header('Location: index.php');
...
// Include header
include('templates/header.php');
// Page introduction
print '<h2>Login Form</h2>';
// Print page content