2009-08-19 17 views
0

EDIT:

だから私の残りの質問があります:(1)私は、リダイレクト)(ヘッダの302または303を使用する必要がありますか?私は303が正しい方法だと信じています。 (2)$ _SESSIONは?contact = thankyouページに変数を渡す最も良い方法ですか?

マイ改訂コード:(解決)

if (isset($_POST[ 'submit' ])) 
{ 
    if (is_bot()) 
    { 
    header("Location: http://www.example.com/contact/?contact=thankyou", 
     TRUE, 303); 
    exit; 
    } 
    elseif (is_input_error()) 
    { 
    // show error form stuff... 
    } 
    else 
    { 
    contact_send_email(); 
    header("Location: http://www.example.com/contact/?contact=thankyou", 
     TRUE, 303); 
    exit; 
    } 
} 

ORIGINAL:

私はちょうどPHPで約$ _POST、$ _GETやフォームを学んでいます。私は簡単に始まったコンタクトフォームを持っていますが、私の経験では少し複雑になっています。この時に新しいビーイング

// curly braces left out for brevity 
if (isset($_POST[ 'submit' ])) 
    if (is_bot()) 
    header("Location: http://www.example.com/contact/?contact=thankyou", 
      TRUE, 303); 
    if (is_input_error()) 
    header("Location: http://www.example.com/contact/?contact=error", 
      TRUE, 303); 
    else 
    contact_send_email() 
    header("Location: http://www.example.com/contact/?contact=thankyou", 
      TRUE, 303); 
  1. 、私はあなたが任意の明白な問題を参照してくださいかどうかを知りたいと思いますか?
  2. header()リダイレクトコードが完全で正しいと思われますか?
  3. header()リダイレクトの後に$_POST変数を渡す最も一般的な方法や推奨される方法は何ですか? $_SESSIONであるか、より良い方法がありますか?私は前にセッションを使ったことがないので、私は少し怖いです。

EDIT:ところで、私はheader()は「リフレッシュ・再送信」は非常に怖いと悪警告メッセージを避けるために$_GETにリダイレクト通過したいです。

+0

ジレンマとは何ですか? http://www.google.com/search?q=define%3Adilemma –

答えて

0

第1質問です。条件付きブロックが無効に見えるので、{}の後に角括弧を使用してifの後に入力することをお勧めします。

第2質問です。 303ステータスコードが必要だとは思わない。典型的なものはheader('Location: ...');です。

については、質問です。 2つの可能な解決策は、セッションまたはデータベースである。私はと思い、まとめると

if (isset($_POST[ 'submit' ])) 
{ 
    if (is_bot()) 
    { 
    header("Location: http://www.example.com/contact/?contact=thankyou"); 
    } 
    elseif (is_input_error()) 
    { 
    header("Location: http://www.example.com/contact/?contact=error"); 
    } 
    else 
    { 
    contact_send_email(); 
    header("Location: http://www.example.com/contact/?contact=thankyou"); 
    } 
} 
+1

2番目の考えでは、「入力エラー」の場合、エラーページにリダイレクトする必要はありません。現在のページにエラーメッセージを表示する必要があります。 – warpech

+0

ええ、exit()を追加してください。 Gumboさんが提案したように – warpech

+0

これは良い情報です。元々フォームを設定していたのとまったく同じです - ヘッダー(リダイレクト)を使用していないエラーページではなく、それを使用する他の2つのシナリオ。 – Jeff

1

Being new at this, I guess I'd like to know if you see any glaring problems?

私はあなたがそれを意図したかどうかを知りませんが、あなたのコードは、このような中括弧付きバージョンに翻訳読み取り:

if (isset($_POST['submit'])) { 
    if (is_bot()) { 
     header("Location: http://www.example.com/contact/?contact=thankyou", TRUE, 303); 
    } 
} 
if (is_input_error()) { 
    header("Location: http://www.example.com/contact/?contact=error", TRUE, 303); 
} else { 
    contact_send_email(); 
} 
header("Location: http://www.example.com/contact/?contact=thankyou", TRUE, 303); 

中括弧がない場合、ブロックifの本文は常に次のステートメントになります。そして、あなたが本当にそれが欲しいとは思っていません。

Does my header() redirect code look complete and valid?

Iは、実行されているのさらなるコードを防ぐために、各headerexitを追加します。しかし、残りはうまく見えます。

+0

Gotchya。私は中括弧を省略して簡潔にしました。 – Jeff

0

ヘッダー機能から303を削除します。これは302の一時的なリダイレクトで、明示的に設定しないとデフォルトでリダイレクトされます。

小さな点ですが、注目に値する。誤ったHTTPリダイレクトステータスコードを選択すると、SEOはごくわずかに低下します。

+0

リダイレクトコードはこのページの303になるはずです: http://www.ajaxray.com/blog/2008/01/12/how-to-avoid-postdata-resend-warning/ 。 ...ここにウィキペディアから参照されている: http://en.wikipedia.org/wiki/Post/Redirect/Get – Jeff

+0

を上記の私のコメントに追加するには、コメンター(サム)はこう述べています。中に維持する 一つのことをあなたのHTTPステータスコードも302ではなく303でなければならないので、標準に準拠していて、今後出てくるかもしれない新しいブラウザでは安全です。 – Jeff

+0

ちょうどそのものを読んで、それは完璧な意味があります。唯一のことは、あなたが将来のサイトの校正を心配しているか、それが古いクライアント(http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4)によって使用可能であることを確認しているかどうかです。 – JonB

0

私はなぜそれらのエラーにリダイレクトしたいのか、ありがとうございました。

エラーの場合:送信された値を使用してフォームを再度表示し、誤ったフィールドまたは必須フィールドがないフィールドを強調表示します。

成功すると:ありがとうございましたhtmlページを表示します。

+0

"refresh-resend"という非常に恐ろしい警告メッセージを避けるため、$ _GETでheader()リダイレクトを渡したいと思います。 – Jeff

+1

「ありがとうございました」ページにリダイレクトするのは、ユーザーが誤ってフォームを2回送信するのを防ぐためです。 – warpech

+0

一意のフォームID – OIS

関連する問題