- PR -

PHPでのエラー画面のリダイレクト

1
投稿者投稿内容
tuchida
大ベテラン
会議室デビュー日: 2006/08/06
投稿数: 125
投稿日時: 2008-12-16 09:02
いつもおせわになっております。
tuchidaです。

ここにスレッドをたてていいかどうかわかりませんが
まちがっていたら御指摘ください。

今、PHPでエラー処理の所でなやんんでいるのですが、
フォームで指定したPHPのプログラムでエラーチェックを行い、
エラーが発生したときに、元の画面にリダイレクトしたいのですが、

1.header()関数でリダイレクトしたいと考えているのですが
すでにチェック用のモジュールでヘッダ出力されていると出て
実行してくれません。
エラーは以下の通りです。

Warning: Cannot modify header information - headers already sent by (output started at /home/xxxxx.jp/public_html/trialkit/TrialkitChk.php:1) in
/home/XXXXX.jp/public_html/trialkit/TrialkitGet.php on line 132

実際のコーディングは以下の通りです。
header("Location: http://XXXXX.jp/trialkit" . $wURL );


2.このエラーのときにGETで取得するデータを引数として渡したいのですが
  Heder()関数では引数も渡せるのでしょうか?

どなたかご存知の方がいらっしゃればご教授お願いします。


[ メッセージ編集済み 編集者: tuchida 編集日時 2008-12-16 10:28 ]
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2008-12-16 16:13
引用:
tuchidaさんの書き込み (2008-12-16 09:02) より:
1.header()関数でリダイレクトしたいと考えているのですが
すでにチェック用のモジュールでヘッダ出力されていると出て
実行してくれません。



TrialkitChk.phpの1行目を処理している時点でhttpヘッダを返している・・ということですかねぇ。とりあえずはTrialkitChk.phpの先頭行がどうなっているかを見ないとわかりません。「改行のみ」でもhttpヘッダは送られてしまいますから。

そのあたりの修正が面倒なら、出力をバッファリングしてhttpヘッダの送出を待たせるという手もあります。

http://www.php.net/manual/ja/book.outcontrol.php

引用:
2.このエラーのときにGETで取得するデータを引数として渡したいのですが
  Heder()関数では引数も渡せるのでしょうか?


header()で指定するURL(第一引数)にquery_stringを自前で付加すればいいのでは?
tuchida
大ベテラン
会議室デビュー日: 2006/08/06
投稿数: 125
投稿日時: 2008-12-16 19:57
引用:


TrialkitChk.phpの1行目を処理している時点でhttpヘッダを返している・・ということですかねぇ。とりあえずはTrialkitChk.phpの先頭行がどうなっているかを見ないとわかりません。「改行のみ」でもhttpヘッダは送られてしまいますから。

そのあたりの修正が面倒なら、出力をバッファリングしてhttpヘッダの送出を待たせるという手もあります。

http://www.php.net/manual/ja/book.outcontrol.php



ちなみにheder()関数を呼んでいる所は以下のとおりで、

a = TrialkitChk(); <--TrialkitChk.php内のfunction

if (a == ""){

正常処理

}else{

header("Location: http://v55.jp/trialkit" . $wURL );

}
チェックした結果にエラーがあった場合、即、header()関数を呼んでいます。

また、Trialkit.phpの1行目は
<?php
であり、何もありませんし、このファイル(プログラム)内ではprint()関数は1行もありません。

この部分の処理は前段の画面で<FORM>タグのアクションで呼ばれており
TrialkitChk.php内でも1行print()関数Echoともに記載されていません。


引用:
2.このエラーのときにGETで取得するデータを引数として渡したいのですが
  Heder()関数では引数も渡せるのでしょうか?


header()で指定するURL(第一引数)にquery_stringを自前で付加すればいいのでは?
[/quote]
了解しました。やってみます。

phpではリダイレクト方法としてこれしかないのでしょうか?
わからないところで出力されているとすると私には難しく
最悪javascriptで書くのが正解かもしれないとも考えています。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-12-16 23:07
チェック用のモジュールのコードが、
コード:
...コード
?>


という感じで?>で終わるときに、
その後に空白や改行が含まれてたりしていませんか?

PHPで表示を伴わない(クラス定義だけなども)、
インクルードされるのが前提のファイルは、
<?phpで始まっていても、?>を最後に付けてはいけません。

別に付けなくても動きますし、むしろインクルードによって、
最後の空白や改行も出力されますので注意が必要です。

今回のケースに当てはまっていなかったらごめんなさい。
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2008-12-17 18:18
引用:

tuchidaさんの書き込み (2008-12-16 19:57) より:
また、Trialkit.phpの1行目は
<?php
であり、何もありませんし、このファイル(プログラム)内ではprint()関数は1行もありません。


最初の投稿ではTrialKitGet.phpとTrialKitChk.phpしか読み取れませんでしたが「TrialKit.php」というファイルもあるのですか。「output started at /home/xxxxx.jp/public_html/trialkit/TrialkitChk.php:1」ということなので、TrialKitChk.phpの1行目が知りたかったのですが・・

当然ですが「<?php」の前に空白でも改行でも存在していれば「printやecho」はなくてもhttpレスポンスとして出力されhttpヘッダが送信済みの状態になります。headerを使わなければそういうミスには気付きにくいです。TrialKitChk.phpをBOM付きのutf-8で保存していると確実にハマります(いわゆるutf-8nでないとマズイです)。

#もちろんかつのりさんが書かれたように「?>」で閉じた後ろも同様です。

tuchida
大ベテラン
会議室デビュー日: 2006/08/06
投稿数: 125
投稿日時: 2008-12-17 19:29
みなさんありがとうございました。

私の場合、御指摘の通り最後に?>がついており、これをとることによって
解決しました。

色々わからないこと勉強になりありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)