Php 同一页上的标题重定向
我的部分脚本有点小问题:Php 同一页上的标题重定向,php,forms,mysqli,Php,Forms,Mysqli,我的部分脚本有点小问题: <?php session_start(); include_once('../includes/connection.php'); if(isset($_SESSION['logged_in'])) { ?> <html> <head> <meta charset="UTF-8"> <title>Login</title>
<?php
session_start();
include_once('../includes/connection.php');
if(isset($_SESSION['logged_in'])) {
?>
<html>
<head>
<meta charset="UTF-8">
<title>Login</title>
<link rel="stylesheet" href="../css/style.css">
</head>
<body>
<h1>Markup 1</h1>
</body>
</html>
<?php
} else {
if(isset($_POST['email'], $_POST['password'])) {
$email = $_POST['email'];
$password = $_POST['password'];
$query = $db->prepare("SELECT * FROM user WHERE user_email = ?");
$query->bind_param('s',$email);
$query->execute();
$query->bind_result($user_id,$user_name,$user_email,$user_password);
$query->fetch();
$user = array("user_id"=>$user_id, "user_name"=>$user_name, "user_email"=>$user_email, "user_password"=>$user_password);
if($user['user_id'] != 0) {
$_SESSION['logged_in'] = true;
header("Location: index.php");
die();
} else {
$error = "Incorrect details!";
}
}
}
?>
<html>
<head>
<meta charset="UTF-8">
<title>Login</title>
<link rel="stylesheet" href="../css/style.css">
</head>
<body>
<h1>Markup 2</h1>
<div class="container">
<h3>Please login</h3>
<?php if(isset($error)) { ?>
<h4><?php echo $error; ?></h4>
<?php } ?>
<form action="index.php" method="post" autocomplete="off">
<input type="text" name="email" placeholder="E-mail">
<input type="password" name="password" placeholder="Password">
<input type="submit" value="Login">
</form>
</div>
</body>
</html>
登录
标记1
登录
标记2
请登录
问题是,刷新后的脚本(调用header()方法)不会执行die()语句,并且在成功设置会话变量并使用“Markup 1”呈现部分后,它也会呈现“Markup 2”部分,但不应该
我在这里找到了这个示例:。在将内容写入浏览器后,不能调用
header()
。您可以在PHP中使用输出缓冲区来解决这个问题(这已经有很长一段时间了),但实际上您应该将处理标题的代码移到所有标记之上
请参阅:您可以尝试在else块中包含第二个标记部分。这是一个相当粗糙的修复程序,但它应该可以实现您的目标。我建议重新构造这个部分,并将一些标记提取出来,以分离包含的文件
<?php
session_start();
include_once('../includes/connection.php');
if(isset($_SESSION['logged_in'])) {
?>
<html>
<head>
<meta charset="UTF-8">
<title>Login</title>
<link rel="stylesheet" href="../css/style.css">
</head>
<body>
<h1>Markup 1</h1>
</body>
</html>
<?php
} else {
if(isset($_POST['email'], $_POST['password'])) {
$email = $_POST['email'];
$password = $_POST['password'];
$query = $db->prepare("SELECT * FROM user WHERE user_email = ?");
$query->bind_param('s',$email);
$query->execute();
$query->bind_result($user_id,$user_name,$user_email,$user_password);
$query->fetch();
$user = array("user_id"=>$user_id, "user_name"=>$user_name, "user_email"=>$user_email, "user_password"=>$user_password);
if($user['user_id'] != 0) {
$_SESSION['logged_in'] = true;
header("Location: index.php");
die();
} else {
$error = "Incorrect details!";
}
} ?>
<html>
<head>
<meta charset="UTF-8">
<title>Login</title>
<link rel="stylesheet" href="../css/style.css">
</head>
<body>
<h1>Markup 2</h1>
<div class="container">
<h3>Please login</h3>
<?php if(isset($error)) { ?>
<h4>
<?php echo $error; ?>
</h4>
<?php } ?>
<form action="index.php" method="post" autocomplete="off">
<input type="text" name="email" placeholder="E-mail">
<input type="password" name="password" placeholder="Password">
<input type="submit" value="Login">
</form>
</div>
</body>
</html>
<?php } ?>
登录
标记1
登录
标记2
请登录
仔细看看。标题前没有输出。该死,你说得对。我做PHP已经很久了,错过了条件。@SverriM.Olsen你这么说,但仍然可能有,例如,如果在第一个@developerwjk上方有一个空行,也可能有仙女干扰解释器。根据我们了解的代码,输出似乎不是问题。Markup 1
和Markup 2
将始终一起打印。仔细查看if
语句。如果您只需要其中一个,那么您需要在第一个If
语句中终止脚本(否则它将继续)。您是否尝试只在If($user['user\u id']!=0){}中回显某个内容
看看它是否真的进入了这个领域?我想说的是将它分成一些不同的页面,而不是通过if-else在同一页面中提供不同的html页面硬编码。从丑陋的角度来看,这只是一个糟糕的设计。@developerwk好的,我知道这不是一个伟大的设计,因为我说过这只是为了学习。当我试图回应你们提到的if语句时,只有在header方法被注释掉的情况下才会打印出来,我不知道为什么。。。在yt视频中,使用这个例子,一切都很好,但是在我的代码中,发生了一些奇怪的事情。如果它只是在header方法被注释掉时才打印出来,那么它实际上一直在重定向!如果你打印了一些东西,然后重定向,你打印的东西就会消失,因为你离开了页面。很高兴你更新了它,把代码放在了else块中,但是最好也将它缩进到你可以在else块中分辨它的位置。