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!failure!」を出力します 私のデータが正しく、データを使って何かをしたときにエラーが発生しなかった場合。完全に理にかなっています...成功のエコーがスクリプトを中断しなかったため、失敗は引き続き表示されます。

したがって、成功ヘッダーのコメントを解除すると(失敗ヘッダーはコメントのままになります)、実際にsuccess.phpに送信されます。

その後、failureヘッダーのコメントも解除すると、成功した場合でも、failure.phpに送信されます。

そんなことがあるものか?

ヘッダー関数がスクリプトを中断し、その後に続くコードを無視することを期待しています。私の仮定は間違っていますか?どういうわけか手動でスクリプトを終了する必要がありますか?

PHPはコードを1行ずつ処理しませんか?または、中括弧内のヘッダーが最後になり、他のヘッダーが最初になりますか、それとも何ですか?

または、これが発生しておらず、どこかでエラーが発生している必要がありますか?

4

5 に答える 5

3

ヘッダー関数はスクリプトを中断せず、その後に続くコードを無視します。したがって、すべての場合で、Locationヘッダーが送信さlocation: failure.php れます。else部分に配置することをお勧めしlocation: failure.phpます。firebugがインストールされている場合は、firebugの「net」パネルで応答ヘッダーを確認できます。

于 2013-03-09T04:53:12.363 に答える
1

まず第一に、echo前後に使用しないでください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 に答える
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は1行ずつ実行します。
投稿されたデータにエラーがある可能性があります。場所のヘッダーを2つ書き込むと、最初のヘッダーが実行
されますが、残りのスクリプトも実行されます。この状況を回避するには、 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 に答える
0

同様の問題が私を答えに導きます

exit()を呼び出す必要があります。header()を呼び出した後..。

試したところ、exit関数を呼び出すとすべてが機能します。どうやら私の仮定

ヘッダー関数がスクリプトを中断し、その後に続くコードを無視することを期待しています。

間違っている...!

于 2013-03-09T04:58:45.363 に答える