web-dev-qa-db-ja.com

PHP:exit();を利用します。またはdie();ヘッダーの後( "場所:");

私は単に使用するユーザーログイン/登録システムを持っています

_// execute queries, set cookies, etc. here
header("Location: " . getenv("HTTP_REFERER"));
_

最近、exit();die();に関する投稿を読みましたが、これらを使用することになっているとは思いもしませんでした。私が理解していることから、彼らはそれをPHPに終わらせますか?あれは正しいですか?これに向けて作業できる最善の方法は、header()の直後にこれらの関数の1つを追加することです。私が持っている処刑?

私はAJAX、jQueryがlogin.php/register.phpを読み取っていますが、これは何らかの影響を受けますか?

編集:header();の後以外に、exit();またはdie();関数を他にどこで使用する必要がありますか?そして、exit();はPHPの周りでもっと使われていますが、die();はPerlの周りでもっと使われていますか?

17
Aaron

私もこれについての答えを探していました。私が見つけたもの:

なぜdie()またはexit():

header('Location: http://something')の後にdie()またはexit()を配置しないと、スクリプトが続行され、予期しない動作が発生する可能性があります。これにより、たとえば、リダイレクト(HTTP 301)で実際に防止したいコンテンツが開示される可能性があります。前述の内容は、ブラウザがレンダリングしない可能性があるため、エンドユーザーには直接表示されない場合があります(301が原因)。結論として、exit()関数とdie()関数は、スクリプトの続行を停止します。

差:

また、がないように見えるので、関数間の違いを知りたいと思いました。ただし、PHPでは、ヘッダー出力に明確な違いがあります。以下の例では、別のヘッダーを使用することを選択しましたが、exit()とdie()の違いを示すために重要ではありません。

動作中のExit()

<?php
    header('HTTP/1.1 304 Not Modified');
    exit();
?>

結果:

HTTP/1.1 304 Not Modified 
Connection: Keep-Alive 
Keep-Alive: timeout=5, max=100

Die()の動作

<?php
    header('HTTP/1.1 304 Not Modified');
    die();
?>

結果:

HTTP/1.1 304 Not Modified 
Connection: close

したがって、die()は接続を閉じ、exit()は接続を閉じません。 t。接続を開いたままにするか閉じるかは、パフォーマンスによって異なります。どちらにも長所と短所があり、特定の要件によって異なります。

WikiのHTTP持続的接続

34
GrayMatter

http://php.net/manual/en/function.exit.php

http://php.net/manual/en/function.die.php

この関数は、スクリプトの実行を中断するために使用されます。 header("Location: " . getenv("HTTP_REFERER"));の後にスクリプトの実行を停止するには、exitまたはdieを使用する必要があります、それ以外の場合、スクリプトは最後まで実行されるため、予期しない動作が発生する可能性があります。

10
Timur

回答はすでに受け入れられていますが、質問の中で誰もが明白なWTFを見逃しているようです。

header("Location: " . getenv("HTTP_REFERER"));
  1. リファラーを返すことは、ユーザーエージェントの側ではオプションです

  2. 簡単に偽造できます

  3. ログインに失敗したことをユーザーに通知する方法はありません

  4. 認証失敗のHTTPセマンティック通信はありません

  5. 環境変数HTTP_REFERERはリクエストヘッダー変数と同じである必要がありますが、RFC 3875で指定されていないため、リクエストでWebサーバーに提示された場合でも、getenv( "HTTP_REFERER")は異なる値を返す場合があります。

4
symcbean

さて、最後の答えが出てから久しぶりです。とにかく:Dどういうわけか私は同様の問題に遭遇し、私の解決策が何であったかを確認しました:

die( Header( "Location: mytarget.php?arg1=foobar" ) );

1つの石で2羽の鳥-私のために働くようです。

2
Wulfgier

スクリプトの最後でheader()が呼び出された場合、次の理由からexit()die()も呼び出す必要はありません。

サーバーへのリンクは、mysql_close()を明示的に呼び出して以前に閉じられていない限り、スクリプトの実行が終了するとすぐに閉じられます。 - php.net/function.mysql-connect

1
cPage
for($i = 0; $i < 10; $i++)
{
    if ($i == 2)
    {
        exit("\n Using exit(), We are done");
    }
}

ここで、die()を使用して同じ例を見てみましょう。

for($i = 0; $i < 10; $i++)
{
    if ($i == 2)
    {
        die("\n Using die(), We are done");
    }
}

これらのそれぞれの出力は、それぞれ「exit()を使用して、die()を使用して完了しました。完了しました」になります。次に、これらのそれぞれを試して、数値を出力してみましょう。

for($i = 0; $i < 10; $i++)
{
    if ($i == 2)
    {
        exit(-1);
    }
}

Die();を使用して同じ例の出力を確認します。

for($i = 0; $i < 10; $i++)
{
    if ($i == 2)
    {
        die(-1);
    }
}

これらの例は、テキストパッドエディターを使用して編集されました。上記の両方の場合の出力は、「ツールが終了コード-1で完了しました」でした。

したがって、「phpのdie()とexit()の違いは何ですか」という質問に対する正直な答えIS –これら2つの関数の間に目に見える違いは1つもありません。どちらも同じように、一方は他方のエイリアスです。もしあなたの誰かが本当の目に見える違いを見つけることができたら、このブログのコメントセクションにそれを投稿していただければ幸いです。

次回まで、Happy PHPプログラミング!

0
jalodara jayesh