Php 标题(';位置:…)与if子句组合时行为不正确

Php 标题(';位置:…)与if子句组合时行为不正确,php,redirect,if-statement,header,Php,Redirect,If Statement,Header,我希望通过多个步骤处理用户发布的数据(首先验证是否所有内容都正确,然后对数据进行处理) 如果验证post数据并对其进行处理已经成功,我想将用户重定向到success.php 若验证失败,或者处理数据失败,我想重定向到failure 下面是正在发生的事情: 当我通过注释删除标题(…)函数时,我说 if(isset($_POST)) { if(verify_post_data() == 'success') { if(do_something_with_verified_post_d

我希望通过多个步骤处理用户发布的数据(首先验证是否所有内容都正确,然后对数据进行处理)

如果验证post数据并对其进行处理已经成功,我想将用户重定向到success.php

若验证失败,或者处理数据失败,我想重定向到failure

下面是正在发生的事情:

当我通过注释删除标题(…)函数时,我说

if(isset($_POST))
{
  if(verify_post_data() == 'success')
  {
    if(do_something_with_verified_post_data() == 'success')
    {
    //do something else
    header('location: success.php');
    }
  }
  header('location: failure.php');
}

如果我的数据正确并且在处理数据时没有发生错误,我的脚本将打印“success!failure!”。很有道理。。。因为成功的回音没有中断脚本,所以仍然会显示失败

因此,当我取消注释success头(failure头保持注释状态)时,它确实会将我发送到success.php

如果我随后也取消了对failure头的注释,那么即使成功,它现在也会将我发送到failure.php

这怎么可能

我希望header函数中断脚本并忽略它后面的任何代码。我的假设错了吗?我是否必须手动退出脚本

php不是逐行处理代码吗?或者它是最后一个放在花括号中的标题,而其他标题是第一个,还是什么


或者这不应该发生,而我一定是在其他地方出错了?

首先不要在
标题前后使用
echo
。并在
标题
之后使用
退出

//header('location: failure.php');
echo 'failure!';

首先,不要在
标题前后使用
echo
。并在
标题
之后使用
退出

//header('location: failure.php');
echo 'failure!';

header函数不会中断脚本并忽略它后面的任何代码。因此,在所有情况下,位置头都作为
Location:failure.php

最好将
location:failure.php
放在else部分。如果安装了firebug,您可以在firebug的“net”面板中检查响应标题。标题函数不会中断脚本并忽略其后的任何代码。因此,在所有情况下,位置头都作为
Location:failure.php
最好将
location:failure.php
放在else部分。如果您安装了firebug,您可以在firebug的“net”面板中检查响应标题,引导我找到答案

我必须调用exit();调用header()之后……

我刚刚试过,当调用退出函数时,一切正常。显然是我的假设

我希望header函数中断脚本并忽略它后面的任何代码

这是错误的

A引导我找到答案

我必须调用exit();调用header()之后……

我刚刚试过,当调用退出函数时,一切正常。显然是我的假设

我希望header函数中断脚本并忽略它后面的任何代码

这是错误的

首先, 在调用
header()
之前,不要使用
echo/setcookie()

第二,, 您需要抽象重定向,如下所示:

if(isset($_POST))
{
  if(verify_post_data() == 'success')
  {
    if(do_something_with_verified_post_data() == 'success')
    {
       //do something else
       header('location: success.php');
       exit();
    }
  }
  header('location: failure.php');
  exit();
}
首先,, 在调用
header()
之前,不要使用
echo/setcookie()

第二,, 您需要抽象重定向,如下所示:

if(isset($_POST))
{
  if(verify_post_data() == 'success')
  {
    if(do_something_with_verified_post_data() == 'success')
    {
       //do something else
       header('location: success.php');
       exit();
    }
  }
  header('location: failure.php');
  exit();
}

是的,php逐行执行。
您发布的数据中可能有一些错误, 如果您编写两个位置头,第一个将被执行,
但脚本的其余部分也将被执行,
为了避免这种情况,您需要调用exit;如果用户发布了错误的数据,也可以使用die()函数。 也请尝试以下代码:

function redirect($location){

  if ( ! headers_sent() ){
     header(sprintf('Location : %s', $location));
     exit;
  }
}


if( ! empty($_POST) ) // isset() is good for array keys, not for this one itself
{
  if(verify_post_data() == 'success')
  {
    if(do_something_with_verified_post_data() == 'success')
    {
     //do something else
     redirect('success.php');
    }
  }
   redirect('failure.php');

是的,php逐行执行。
您发布的数据中可能有一些错误, 如果您编写两个位置头,第一个将被执行,
但脚本的其余部分也将被执行,
为了避免这种情况,您需要调用exit;如果用户发布了错误的数据,也可以使用die()函数。 也请尝试以下代码:

function redirect($location){

  if ( ! headers_sent() ){
     header(sprintf('Location : %s', $location));
     exit;
  }
}


if( ! empty($_POST) ) // isset() is good for array keys, not for this one itself
{
  if(verify_post_data() == 'success')
  {
    if(do_something_with_verified_post_data() == 'success')
    {
     //do something else
     redirect('success.php');
    }
  }
   redirect('failure.php');

退出
标题()之后确保所有树文件都在同一个文件夹中。问题不是,header函数不做任何事情,因为我在调用header之前有输出,而且我没有被重定向到404。从我的两个标题选项中,我被调到了错误的一个…退出
标题()之后确保所有树文件都在同一个文件夹中。问题不是,header函数不做任何事情,因为我在调用header之前有输出,而且我没有被重定向到404。从我的两个标题选项中,我被调到了错误的一个…就是这样,我必须使用exit。。。我没有回应任何声音,这不是问题…就是这样,我必须使用退出。。。但我没有回应任何事情,这不是问题所在……你是对的。但是如果我不想复制我的代码,我不能使用其他部分不幸的是你是对的。但是如果我不想复制我的代码,我不能使用其他部分