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块中分辨它的位置。