PHPに関しては知識に乏しい為、質問の仕方も悪いかもしれませんが、ご教授の程お願いします。
現在、http://php.s3.to/bbs/bbs2.phpにて配布されているp++BBSをindex.phpにインクルードさせて使用しています。
しかし、クッキーの発行と、リダイレクトが上手くいかず困っています。
// クッキー保存
$cookvalue = implode(",", array($name,$email,$url,$c_pass,$color));
setcookie ("pppbbs", $cookvalue,time()+14*24*3600);
ここと
header("Location: http://$HTTP_HOST$PHP_SELF");
ここでエラーが帰ってきます。
エラーの内容は
Warning: Cannot modify header information - headers already sent by (outputs started at ~~~~)
となっています。
インクルードしているので、もともとのヘッダー情報を書き換えられないということなのでしょうか。
解決方法はありますでしょうか?
別の方法で書き込みボタンが押されたらリロードするということはできますでしょうか
ちなみに、書き込み自体は上手くいっているようで、
リロードすると書き込みは表示されます。
No.1ベストアンサー
- 回答日時:
> headers already sent by (outputs started at ~~~~
惜しい! このatの後ろが重要なんだな。まぁきっとソースの内部の話なのでふせてあるんやろうけど。
症状としては、そのウォーニングが出るという2つの行の前に、HTTPレスポンスヘッダが出力されるような何かが行われているようだ。なので、先頭からトレースしてみて、そのインクルードファイルがやはりまずいようであるなら、インクルードの前にその2行を持ってこよう。
重ねて言うが、インクルードが悪いのではなく(原因にはなっているかも知れないけど)、HTTPレスポンスヘッダの出力が開始された後にHTTPレスポンスヘッダの内容を変更しようとした事に問題がある(一旦開始しちゃったらもう変更できない場合がほとんどだからね)。CookieもLocation:(というかheader関数そのもの)もHTTPレスポンスヘッダの一部なのでね。で、実際は変更されなかったのでCookieの書き込みもされてないしリダイレクトもうまくいかなかったという訳だ。
PHPでHTTPレスポンスヘッダをごにょごにょしたい場合は必ず先頭で行う事が肝要だ。何は無くともHTTPレスポンスヘッダの生成、その後でできる事は後まわし。ね。
この回答への補足
なるほど、そういうことだったのですね。
詳しいご回答ありがとうございます。
という訳で、早速ですがクッキーに関して…
$cookvalue = implode(",", array($name,$email,$url,$c_pass,$color));
setcookie ("pppbbs", $cookvalue,time()+14*24*3600);
上記部分をindex.phpの一番先頭にもって行きました。
しかしそれだけだと上手くクッキーが保存されませんでした。これは推測ですが、新しくアクセスした際に空の値でも書き込んでいたせいでしょうか?
なので以下の文を追加しました。
if(phpversion()>="4.1.0"){
extract($_GET);
extract($_POST);
extract($_COOKIE);
extract($_SERVER);
}
if(isset($name)){
$cookvalue = implode(",", array($name,$email,$url,$c_pass,$color));
setcookie ("pppbbs", $cookvalue,time()+14*24*3600);
}
これでクッキーは上手くいきました。
結果オーライなのかも知れませんが、変な書き方でしょうか?
次に、リダイレクトですが、書き込みボタンを押したら~という条件の元の動作なので、場所を変えてみるのは違うと思い、
echo "<META HTTP-EQUIV=\"refresh\" content=\"0;URL=$PHP_SELF?\">";
上記のように記載することで、無理やり移動するようにしました。(これも動く理由がよく分かっていません。)
実際に書き込みがあった後、一瞬白い画面になるのがかっこ悪いですが…
今回補足にさせて頂いたのは、動いてはいるものの、自分の中で理解がしっかりできていなかったので。。
もし宜しければ、if(isset($name))を書かない場合は空の値がクッキーに保存されていたのか等、考えられる原因を教えていただけないでしょうか。
わがままをいって申し訳ないですが、ご教授の程よろしくお願いいたします。
No.2
- 回答日時:
> 結果オーライなのかも知れませんが、変な書き方でしょうか?
_GETなどを展開するかどうかは好みの問題なので良いと思う。ちなみに私は($_GET['hoge']などと)そのまま使う派。
ただ、もう少し細かい制御をしてあげた方が良いかも知れないね。メソッドはGETかPOSTか。COOKIEはあるか無いか。これも、どちらが良いでは無く、設計(ページのスクリプト上 何が必要か)の問題。
また、これをBtoCの業務やインターネットの掲示板などで使う場合は、「悪意のあるHTTPクライアント」を見越して全変数を最初にチェックしてあげる方が良いだろうね。想定しない変数が来てないか。変数内の文字数が多くないか。数字が想定される変数に不正な文字が入っていないか。クロスサイトスクリプティングなどはしっかり封じ込めよう。
> 場所を変えてみるのは違うと思い、
何度も言うが、場所を変える変えないというのは、アルゴリズム設計(フローチャート)によるものだ。
フローというのは「最初にあれして、次にこれして」という順番を決めるという事だ。その中で、場所を変える必然性というものが出てくれば変える。例えば変数チェックが一番最後に来たらおかしいよね? 使う前にチェックせんといけんから。PHPというかWebアプリは非常に綺麗なフローチャートで表現できるので、まずプログラムを組み立ててみる(コードではなく、「あれしてこれして」と日本語で流れを書く)と良いだろう。
> if(isset($name))を書かない場合は空の値がクッキーに保存されていたのか等
書かない場合というのがちょっとよく分かんなかったごめん。これも、ifを書かないのが原因ではなくって、その前でname変数を誰がどう設定するかがあやふやな事に問題がある。
インクルードも含めてフローを設計し直すのが一番の早道だと思うよ。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- HTML・CSS インクルードした要素がヘッダーにかぶってしまう 3 2022/09/13 17:35
- PHP どうして送信されないのでしょうか? 1 2022/12/09 05:23
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- PHP ファイルの書き込みについて教えて下さい。 1 2023/03/20 12:01
- その他(プログラミング・Web制作) .htaccessファイルの修正がこれで問題ないかどうか 1 2022/04/21 08:42
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- PHP PHPで訪問回数を表示するカウンタを作成したい 3 2023/05/27 07:09
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
異なるドメインのサイトでcooki...
-
ポインター引数の関数でコンパ...
-
10Mバイトて文字数に すると何...
-
COBOLのCOMP形式について
-
UTF-8で5~6バイトになる文字コ...
-
エクセルシート名の制限を変更...
-
Excel 1セル当りの文字数が2...
-
バイナリとBCDコード
-
Excel VBA メール作成について ...
-
stable diffusionのエラー
-
char str[256]の256の意味は?
-
CGIを勉強しています。¥n(改...
-
COBOL PICTUREで X,S,Vの意味
-
C言語の構造体にてバブルソート...
-
ESC/Pのテキスト印字の制...
-
ビットデータのチェック方法
-
DataGridViewの特定列に入力さ...
-
改行コードがそのまま表示され...
-
日付時刻を4バイトに
-
デバイスコンテキストに書いた...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
なんでブラウザでPHPを動かすた...
-
異なるドメインのサイトでcooki...
-
PHPのCookieが有るか無いかで、...
-
cURLでcookieを送受信する方法...
-
COleDateTime とtime_t
-
javascriptでcookieを削除するには
-
初回アクセス時のみ、注意を表...
-
【PHP】アクセスカウンターが空...
-
JavaScriptで保存したクッキー...
-
Javascriptのmodalを一度だけ表示
-
ログインに関するフラグについて
-
ゲームノベルのような分岐のあ...
-
インクルードファイルからのリ...
-
クッキーを連想配列で扱う方法...
-
cookieにカンマ区切りでつめこ...
-
クッキーがセットされない
-
Cookieを設定しているかどうか...
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
Excel VBA メール作成について ...
おすすめ情報