【发布时间】:2015-02-17 21:38:55
【问题描述】:
我的部分脚本有小问题:
<?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>
问题是刷新后的脚本(调用 header() 方法)不执行 die() 语句,并且在成功设置会话变量并使用“标记 1”渲染部分后,它也会渲染“标记 2”部分,但它不应该。
我在这里找到了这个例子:https://www.youtube.com/watch?v=UNTvU--o2q8。
【问题讨论】:
-
Markup 1和Markup 2将始终一起打印。仔细查看if声明。如果您只需要其中一个,则需要在第一个if语句中终止脚本(否则它将继续执行)。 -
您是否尝试过在
if($user['user_id'] != 0) { }中回显某些内容以查看它是否真的进入了那里? -
我会说将其拆分为一些不同的页面,而不是通过 if-else 在同一页面中提供硬编码的不同 html 页面。从丑陋的角度来看,这只是糟糕的设计。
-
@developerwjk 好的,我知道这不是很好的设计,因为我说过这仅用于学习目的。当我尝试在您提到的 if 语句中回显某些内容时,仅当标头方法被注释掉时才会打印我不知道为什么...在带有该示例的 yt 视频上一切正常,但我的代码有些奇怪发生。
-
如果它只在标头方法被注释掉时打印,那么它实际上是在重定向整个时间!如果你打印一些东西,然后重定向,你打印的东西会因为你离开页面而消失。