即使满足条件,PHP也无法重定向

即使满足条件,PHP也无法重定向,php,redirect,Php,Redirect,这是我的密码 <?php if (!isset($_SESSION)) { session_start(); } if (!isset($_SESSION['username'])) { header("Location: index.php"); } ob_start(); if($_POST) { $id = $_POST['book_id']; $command = $_POST['comma

这是我的密码

    <?php
      if (!isset($_SESSION)) { session_start(); }
      if (!isset($_SESSION['username'])) { header("Location: index.php");  }
      ob_start();

      if($_POST) {
        $id = $_POST['book_id'];
        $command = $_POST['command'];
        $sourcePage = $_POST['source'];
      } else if ($_GET){
        $command = $_GET['command'];
        $sourcePage = $_GET['source'];
        $id = $_GET['book_id'];
      } else {
        header("Location: index.php");
      }
      // if command is 2 then show cart content
      if($command == 2) {
        showCart();
      // if command is 1 then add book to cart
      } else if($command  == 1) {
        addToCart($id);
       header("Location: $sourcePage");
      // if command is 0, then remove book from cart
      } else if($command == 0) {
        deleteFromCart($id);
        header("Location: $sourcePage");
      } else if(!isset($command)){
        header("Location: index.php");
      }

  ob_flush();
    ?>


为什么即使我没有登录,我也没有被重定向?

是否有可能在
$\u POST
$\u GET
存在的情况下,页面只是在刷新,落入后面的
标题(“位置:…”
命令之一

如果是这样,您可能希望通过添加一个die()来解决此问题

使用exit()或die函数可以解决此问题。但实际需要使用其中一个函数的情况非常有限


我认为你可以通过增加一些条件来增强if-else条件。但这会增加代码行数

根据我的经验,每次通过头进行重定向时,都会执行下面的连接代码

例如:如果您有一个
else/else if
和一个
if
(其中包含重定向代码),那么它们也将被执行,并且重定向永远不会发生。但是,如果将条件分解为单独的
if
,然后在输入一个
if
之后,如果存在重定向,则在
if
中的标题代码之后没有后续代码,则将发生重定向


最好全面使用
die()
/
exit()
以避免差异。

删除输出缓冲。。或者让整个代码也执行,你应该在header中使用绝对url你说的是从上面所有的重定向?第一个header。事实上,所有这些都不起作用,但重要的是第一个。耶,这就解决了问题。谢谢你。尽管如此,我还是有点惊讶,$\u POST和$\u GET部分竟然被执行了。第二行不应该在到达该部分之前重定向页面吗?重定向发生了,但代码继续执行并在重定向之前完成,导致浏览器也接收到第二个重定向,这就是为什么
die()修复该问题(防止发生第二次重定向)
if (!isset($_SESSION['username'])) { header("Location: index.php"); die(); }