【问题标题】:Header redirection on the same page同一页面上的标头重定向
【发布时间】: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 1Markup 2 将始终一起打印。仔细查看if 声明。如果您只需要其中一个,则需要在第一个 if 语句中终止脚本(否则它将继续执行)。
  • 您是否尝试过在if($user['user_id'] != 0) { } 中回显某些内容以查看它是否真的进入了那里?
  • 我会说将其拆分为一些不同的页面,而不是通过 if-else 在同一页面中提供硬编码的不同 html 页面。从丑陋的角度来看,这只是糟糕的设计。
  • @developerwjk 好的,我知道这不是很好的设计,因为我说过这仅用于学习目的。当我尝试在您提到的 if 语句中回显某些内容时,仅当标头方法被注释掉时才会打印我不知道为什么...在带有该示例的 yt 视频上一切正常,但我的代码有些奇怪发生。
  • 如果它只在标头方法被注释掉时打印,那么它实际上是在重定向整个时间!如果你打印一些东西,然后重定向,你打印的东西会因为你离开页面而消失。

标签: php forms mysqli


【解决方案1】:

您可以尝试在 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 } ?>

【讨论】:

  • 很高兴您更新它以将该代码放入 else 块中,但最好也将其缩进到您可以在 else 块中告诉它的位置。
【解决方案2】:

将内容写入浏览器后,您无法调用header()。您可以在 PHP 中使用输出缓冲区解决这个问题(已经很长时间了),但实际上您应该将处理标头的代码移到所有标记之上。

见:http://php.net/manual/en/function.header.php

【讨论】:

  • 仔细看看。标头前没有输出。
  • 该死,你是对的。好久没做PHP了,错过了这个条件。
  • @SverriM.Olsen 你这么说,但仍然可能存在,例如第一个&lt;?php上方有一个空行
  • @developerwjk 也可能有仙女干扰解释器。根据我们知道的代码,输出似乎不是问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多