-1

重複の可能性:
PHP によって既に送信されたヘッダー

ユーザー名とパスワードを確認するために使用しているPHPファイルがあります。header()この部分は機能していますが、ログインに成功した後、ユーザー パネル ページにリダイレクトするために使用したいと考えています。これは私が得ているログに記録されたエラーです:

[10-Dec-2012 12:25:26] PHP 警告: ヘッダー情報を変更できません - 既に送信されたヘッダー (/home2/jzperson/public_html/imes/php/login.php:10 で開始された出力) で /home2/jzperson /public_html/imes/php/login.php 32行目

これは10行目です:

<script src="http://code.jquery.com/jquery-1.7.2.min.js"></script>

これは 32 行目です。

header("Location: http://imes.jzpersonal.com/userpanel.html");

理由はありますか?

4

5 に答える 5

3

呼び出しで 32 行目に到達する前に、出力がエコー アウトされている可能性がありますheader

関数の説明を参照してくださいheader: http://php.net/manual/en/function.header.php

実際の出力が送信される前に、通常の HTML タグ、ファイル内の空白行、または PHP から header() を呼び出す必要があることに注意してください。include 関数、require 関数、または別のファイル アクセス関数を使用してコードを読み取り、header() が呼び出される前に出力されるスペースまたは空の行があることは、非常に一般的なエラーです。単一の PHP/HTML ファイルを使用する場合にも、同じ問題が存在します。

明確化

物事を少し明確にするために、使用するリダイレクトheader()は、サーバーの応答に生の場所の応答ヘッダー フィールドを含めることによって実行されます。受信側が応答を読み取ってそのヘッダー フィールドを確認すると、現在の応答を破棄し、指定した宛先に別の要求を発行します。

これで、ヘッダーは常にサーバー応答の先頭 (ヘッド) に来ます。それがヘッダーと呼ばれる理由です。コンテンツを出力すると、PHP はすぐにデフォルトのヘッダーを「接頭辞」として追加します。この時点以降、それらを追加することはできません。したがって、コードの後半で別のヘッダーを設定しようとすると、エラーが発生します。

ヘッダー情報を変更できません -ヘッダーは既に送信されています

10 行目で HTML を出力すると、ヘッダーは既に送信されているため (HTML 出力のプレフィックスとして)、それ以上ヘッダーを発行できなくなります。

ヘッダーの詳細については、http: //www.faqs.org/rfcs/rfc2616.htmlを参照してください。

于 2012-12-10T19:35:23.740 に答える
2

基本的に、何かがブラウザーに送信される前 (HTML の前) に、ユーザーがログインしているかどうか (およびリダイレクト) を確認する必要があります。コードは次のようになります。

<?php
...
if($loggedIn)
{
    header("Location: http://imes.jzpersonal.com/userpanel.html");
    exit();
}
?>
<html>
...
<script src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
于 2012-12-10T19:35:44.080 に答える
1

また、ごまかして出力バッファリングを使用することもできます。スクリプト ツリーの最初で ob_start(); を使用します。出力のキャプチャを開始します。その後、ヘッダーを使用したり、Cookie などを設定したりできます。

スクリプト ツリーの最後の行で、ob_end_flush(); を使用します。出力を送信します。$buffer = ob_get_clean(); を使用したい場合は、それを変数に取得してさらに処理することもできます。

それ自体は解決策ではありませんが、より柔軟なコーディング環境を可能にし、上記の問題を解決します。

Location ヘッダーを送信する場合は、フラッシュして終了するのが最善です。/* 非常に長い省略 */ header('Location: somepage.php'); ob_end_flush(); 死ぬ();

これにより、場所の変更が送信された後にそれ以上の処理が行われなくなります。

余談ですが、スクリプト ツリーについて話すときは、インクルード パスを意味します。何よりも先にインクルードされるヘッダー ファイルと、出力バッファーをフラッシュ (および必要に応じて処理) するフッター ファイルに変換されます。上で強調表示されているように、場所の変更の直後にスクリプトを停止する必要があることに注意してください。

セッションは、ヘッダー Location の後にダイスを付けて閉じる必要がある場合もあります - それを単純に使用するには

ob_start();
/* very long snip */
header('Location: somepage.php');
ob_end_flush();
session_write_close();
die();

セッション データが失われている理由を何時間も考えた結果、1 つが見つかりました。心に留めておいてください。

于 2012-12-10T20:57:08.860 に答える
1

ヘッダー ステートメントの前に何かを書き込もうとしています ヘッダー ステートメントの前にあるエコー ステートメント/html コンテンツを削除します。それはトリックを行う必要があります

于 2012-12-10T19:37:16.640 に答える
0

出力としてすでに何かheader();が送信されている場合は使用できません。これは HTML を意味します。最初にすべての PHP 処理を実行してから、HTML/JS を出力します。

于 2012-12-10T19:35:36.410 に答える