0
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.php

如果验证失败,或者对数据做某事失败,我想重定向到失败。

这是正在发生的事情:

当我通过评论删除 header(...) 函数时,我说

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

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

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

因此,当我取消注释成功标头(失败标头保持注释)时,它确实将我发送到了 success.php

如果我随后也取消注释失败标头,它现在 - 即使成功 - 也会将我发送到 failure.php。

这怎么可能?

我希望标头函数会中断脚本并忽略它之后的任何代码。我的假设是错误的吗?我是否必须以某种方式手动退出脚本?

php不是逐行处理代码吗?或者它是最后做大括号中的标题,然后是其他标题,还是什么?

或者这不应该发生,我必须在其他地方出错?

4

5 回答 5

3

标头函数不会中断脚本并忽略它之后的任何代码。因此,在所有情况下,都会发送 Location 标头,因为location: failure.php 将其放置location: failure.php在 else 部分会是一个更好的主意。如果您安装了 firebug,您可以在 firebug 的“net”面板中检查响应标头

于 2013-03-09T04:53:12.363 回答
1

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

其次,您需要抽象一个重定向,如下所示:

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');
于 2013-03-09T05:02:00.493 回答
1

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

if(do_something_with_verified_post_data() == 'success')
{
 //do something else
 header('Location: success.php');
 exit;
}
else
{
 header('Location: failure.php');
 exit;
}
于 2013-03-09T05:11:18.107 回答
1

首先不要使用echobefore 和 after header。并exit在之后使用header

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();
}
于 2013-03-09T04:50:32.093 回答
0

一个类似的问题让我找到了答案

我必须调用 exit(); 调用 header() 后...

我刚试了一下,调用退出函数时,一切正常。所以显然我的假设

我希望标头函数会中断脚本并忽略它之后的任何代码。

是错的...!

于 2013-03-09T04:58:45.363 回答