2011-01-26 15 views
2

私はビルドしているサイトに登録フォームを持っています。正しく入力されていれば、ユーザーはメインページに戻ります。フォームが完成した後、PHPの別のページにリダイレクトする方法は?

私はheaderを使用しようとしましたが、「ヘッダー情報を変更できません...」というメッセージが表示されます。これは私が$_SERVER['PHP_SELF']に投稿したためです。

フォームが正常であれば、どのようにユーザーをリダイレクトできますか? (ボタン付きの成功ページ以外)

+0

画面に何かを印刷する場合は、 'header'を使用することはできません。 'header'は出力の前に呼び出されなければなりません。もしあなたが私たちにあなたのコードを表示すれば、何がうまくいっていないのか分かります。最初の '<?php'の前にスペースがあっても、この問題が発生する可能性があります。 –

答えて

7

他のテキスト/文字列データがWebサーバーからユーザーのブラウザに出力されていない場合にのみ、header()関数を使用できます。

あなたは何かする前に、あなたのスクリプトの先頭にリダイレクトするためのロジックを配置する必要があります:

<?php 

// Process form 

// If processing was successful, redirect 
if($success) 
{ 
    header("Location: http://www.main-page-url.com/"); 
} 

?> 

この理由は、ブラウザがWebサーバからの情報を受信したとき、それが受信することですHTTPヘッダー(header()関数はリダイレクトを出力します)を返し、HTTPヘッダーの後にHTTP応答の本文を出力します。スクリプトがechoでheaderコマンドの前に何か書いている場合は、引き続きそのエラーを受け取ります。

+0

私はそれを知っています。私は別の問題があると思った。今私はrequire_once "file.php"を見つけました。コマンドは問題です - 何か考えてみませんか? – AYBABTU

1

コンテンツがページにレンダリングされた後に新しいヘッダーをブラウザに送信しようとしているため、ヘッダー情報メッセージを変更できません。 echo/print呼び出しの前にheader()コールを行うと、リダイレクトされます。それ以外の場合は、メタリダイレクトが必要です。あなたがフォームを投稿する場所は無関係です。

1

これが機能しない理由は、ヘッダーがHTTP要求内のコンテンツに先行するからです。コンテンツを出力すると、PHPはこれまでに処理されたすべてのヘッダーとすべてのコンテンツを送信することで、ゲームより先に進化します。 HTTPリクエストを送信するためのCTRL + Zはありません。そのため、header()関数は送信後にヘッダーを追加できません。

しかし、obバッファリングファシリティを使用すると、コンテンツがエコーされた後にheader()を呼び出すことができます。 ob_start()を呼び出してページ出力をバッファリングし、必要なヘッダー呼び出しまたはコンテンツ出力を行い、最後にob_end_flush()で出力を送信します。 Ex。

<?php 
ob_start(); //Start buffering 
?> 
<p>This is output!!!</p> 
<?php 
header('403 Moved Permanently'); //Fancy redirect is fancy 
ob_end_flush(); //Send page content with redirect header 
?> 

バッファリングを使用することのみ可能欠点はob_end_flush()コマンドが呼び出されるまで、ユーザはコンテンツを受信する際にわずかなハングアップを経験することです。おそらくこれは目立たないので、心配する必要はありません!

これをすべて実行する前に、コード内にコンテンツが出力される前に、すべてのヘッダー呼び出しを場所に移動することを検討してください。また、ヘッダとコンテンツを強制的に送信するので、前のスペースのPHPタグを開いていることを確認してください。

関連する問題