2011-01-22 11 views
4

データベースアクションを実行するページを設計しようとしています。ユーザーにリダイレクトされたページが表示されます。問題は、データベースに接続するためにrequire()関数を使用しているため、ヘッダーがすでに送信されていることです。メタタグは、出てきたページからすべてのプロセスが完了したように見えるようにしたいので、問題ありません。任意のヒント? require()header()を使用する方法はありますか、それとも削除する必要がありますか? header()の代替手段はありますか?ヘッダー()またはメタのないPHPリダイレクト

+8

をすることによってそれを行っているどのようにデータベースへの接続には、ヘッダが送信されますでしょうか? – Artefacto

答えて

3

Artefactoが指摘したように、データベースへの接続は出力を必要とすべきではありません。あなたが含むもの(例えば、database_connect.php)を出力しないように修正してください。 「ヘッダ送信済み」の問題のthis searchを参照してください。これは「隠れた」出力を見つけるのに役立ちます。

+2

あなたは絶対に正しいです。私は必要なファイルにphpタグを置いた後に余分なスペースを見つけました。 – Yoshiyahu

1

一部のコンテンツが既に送信された後は、ヘッダーを送信できません。 header()コールをrequire()コールの前に移動します。

+0

スクリプトがリダイレクトした後、何らかのデータベース動作を行わなければならないため、不可能です。 – Yoshiyahu

7

一部のコンテンツが送信される前にheader()を送信できない場合は、ob_start();を何か送信する前にob_start();を配置して使用してください(output buffering)。この方法では、すべてのコンテンツがバッファに格納され、スクリプトの最後まで、または手動でバッファの内容を送信するまで送信されません。

もう1つの注意点として、単純にrequireは、含まれているスクリプトがそれらを送信しない限り、別のファイルを生成してもヘッダー/コンテンツを生成しません。これの最も一般的な「隠された」原因は、<?php ?>タグの前後に気付かれない空白です。

+0

ああ、それはバッファがするものなのです。私は決して知りませんでした。 – think123

0

データがクライアントに送信された後にヘッダーを送信することはできません。

ただし、requireを使用すると、何かを出力することはできません。私があなたの権利を理解していれば、データベースファイルを組み込み、クエリを実行してから、ユーザーをリダイレクトすることができます。これは完全に有効です。

出力を送信する必要がある場合(リダイレクトを行う必要があるのはなぜですか?)、出力バッファリングを使用することもできます。出力バッファリングを使用すると、ブラウザにデータをエコーするときにデータを送信するのではなく、バッファに格納します。 ob_end_flushに電話するか、スクリプトの最後に到達すると、データが送信されます。 ob_end_flushの後、新しいヘッダーを送信することはできません。 ob_startで出力バッファリングを開始します。

+0

出力を送信しません。 'require()'はヘッダーを自動的に送るようです。出力テキストはありません。 – Yoshiyahu

2
ob_start(); // start output buffering 
echo "<html......"; // You can even output some content, it will still work. 
. 
. 
. 
. 
. 
header("Location: mypage.php"); 
ob_flush(); //flush the buffer 

この場合、出力はすべてバッファリングされます。これは、ヘッダーが最初に処理された後、出力が再生されることを意味します。

0

header()require()と出力バッファリングを使用すると使用できます。つまり、スクリプト全体がバッファリングされ、スクリプトが終了したときに最初に送信されます。

私はこの

ob_start("ob_gzhandler"); //begin buffering the output 

require_once('/classes/mysql.php'); 

// Some code where I access the database. 

header('/somepage.php'); 
exit; 

ob_flush(); //output the data in the buffer 
関連する問題