phpのバージョンについて - PHPプロ!Q&A掲示板

978

  • 0P

phpのバージョンについて

質問日時 / 2008年2月21日 16:15    回答数 / 8件

Questioner:  hirakawa  このエントリーをはてなブックマークに追加 

キーワード / php.ini   

phpのバージョン 5.1.2 と 5.2.4 のサーバーがあるのですが、
php.iniの「register_globals=On」で両サーバーの設定はしてあります。

次のコードで、一番最初に起動すると 5.2.4 では、正常に表示されるのですが
5.1.2 では、「Notice: Undefined index: txt1」となって「if ($txt1==1)」の行がエラーと
なります。
一番最初ですので、フォームから txt1 を送信していないためにエラーとなるようですが
5.2.4では正常に処理されるので、5.1.2で回避することはできますか?



  1. print ('<input type=text name="txt1" size="20">');
  2. if ($txt1==1) {
  3.    ファンクション処理
  4. }

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A013Lvr4Qj93Lvr4Qj9といいます。 5.2.4で出てないというのが
┃┗A01-1hirakawaありがとうございます。 register_globals = On はセ
┃ ┣A01-1-13Lvr4Qj9うーん・・・すみません、分からないです・・・。 di
┃ ┃┗A01-1-1-1hirakawaありがとうございました。 また宜しくお願いします。
┃ ┗A01-1-2kaitauこんにちは。 E_NOTICEが表示されない原因について
┃  ┗A01-1-2-1hirakawaありがとうございました。 また宜しくお願いします。
┗A02kaitauregister_globals=On で変数初期化してない場合のエラ
 ┗A02-13Lvr4Qj93Lvr4Qj9dです。 すみません、たしかにkaitauさん

回答一覧

並び替え:

A01
answerer3Lvr4Qj9 [2月21日 19:09]

3Lvr4Qj9といいます。

5.2.4で出てないというのが気になります。5.2.4のサーバーでは error_reporting でE_NOTICE, E_USER_NOTICEが設定されていないのではないでしょうか。あるいはdisplay_errorsがOffになっていてエラーが表示されないか、かつまた、log_errorsがOnでerror_logで指定されたログファイルに "Notice..."と出力されているかもしれません。そのあたりはphp.iniを確認してみてください。

register_globals がOnというのは哀しい事ですが仕方ないですね。

【ソースコードを直せる場合】
  1. $txt1 = empty($_REQUEST['txt1']) ? '' : $_REQUEST['txt1'];
  2. print ('<input type=text name="txt1" size="20" value="' . $txt1 . '">');
  3. if ($txt1==1) {
  4.     // ファンクション処理
  5. }

【ソースコードを直せない場合(=php.iniか.htaccessの設定で対応するほか無い場合)】
理想的にはE_NOTICEが出ないようなコードが理想ですが、過去のソースのメンテナンスや環境移行などでソースにさわれない場合は、error_reportingでE_NOTICEが出ないように調整できます。
5.1.2側のサーバーのphp.ini設定で、error_reporting を 次のような感じで調整します。
  1. error_reporting = E_ALL & ~E_NOTICE

この意見に回答する

ツリーへ TOPへ

A01-1
replyerhirakawa [2月22日 09:42]

ありがとうございます。
register_globals = On はセキュリティ上良くないので、 Off にしてPHPのソースを修正したい
と思います。
それと教えてほしいのですが、アドバイスいただいた件ですが、5.2.4 の PHP.ini
の設定ですが、以下の状態ですが、5.2.4 では、エラー表示がでません。何故 5.1.2 では表示
されるのに 5.2.4 ではエラー表示がでないのでしょうか?
他に原因があるのでしょうか?


  1. display_errors = On
  2. register_globals = Off
  3. error_reporting = 6135
  4. log_errors = On

この意見に回答する

ツリーへ TOPへ

A01-1-1 満足
replyer3Lvr4Qj9 [2月22日 10:20]

うーん・・・すみません、分からないです・・・。
display_errors と log_errors が両方ONになっているからでしょうか・・・。
どちらか片方だけがOnなら表示されたりとかしませんか?

あと、log_errorsを指定する時は、error_logで出力先(syslogか、ファイルか)も一緒に指定してみて下さい。

log_errors = On
error_log = /var/log/php/error.log
# レンタルサーバなどであればホームディレクトリ上の適当な場所?
#error_log = /home/user/tmp/php_error.log
# Windowsとかだと・・・
#error_log = "C:\work\log\php\error.log"

さすがにそのあたりのPHP内部コードまでは追ったことが無いので分からないです・・・。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyerhirakawa [2月22日 13:31]

ありがとうございました。 また宜しくお願いします。

この意見に回答する

ツリーへ TOPへ

A01-1-2 満足
replyerkaitau [2月22日 12:46]

こんにちは。

E_NOTICEが表示されない原因については、

error_reporting = 6135

の値がミソです。

error_reporting の値は、どのレベルのエラーを
出力するかビットマスクで判断するようになっています。
各々ビットが相当する値は
http://www.phppro.jp/phpmanual/php/ref.errorfunc.html#ini.error-reporting
の説明もごらんになってください。

6135の値はビットで
1011111110111
と表すことができ、すなわち
  1. E_RECOVERABLE_ERROR | E_USER_NOTICE | E_USER_WARNING | E_USER_ERROR | E_COMPILE_WARNING | E_COMPILE_ERROR | E_CORE_WARNING | E_CORE_ERROR | E_PARSE | E_WARNING | E_ERROR
と同値であり、もっとわかりやすく言えば
  1. E_ALL & ~E_NOTICE
です。初期状態のphp.ini 内の設定値でもあります。

つまり、E_NOTICEとE_STRICT以外のエラーについてレポートしなさい、
という設定になっているわけです。

開発時には E_ALL | E_STRICT くらいの記述を推奨したいところですが・・・。


なお、これらの定数定義はPHP5の場合の値で、過去のバージョンのPHPや、将来のバージョンで変わる可能性があるため、
php.iniやphpのソースの中で定義する場合には実体の整数よりは定数で定義することが推奨されています。

この意見に回答する

ツリーへ TOPへ

A01-1-2-1
replyerhirakawa [2月22日 13:31]

ありがとうございました。 また宜しくお願いします。

この意見に回答する

ツリーへ TOPへ

A02
answererkaitau [2月21日 19:35]

register_globals=On で変数初期化してない場合のエラーを回避したいという状態はやってはいけません。
必ず初期化してください。
出来ればregister_globals=Onなんてやめてください。
過去からの移行であろうと何であろうと、絶対にerror_reportingの設定だけで逃げるようなバカなことはやめてください。

この意見に回答する

ツリーへ TOPへ

A02-1
replyer3Lvr4Qj9 [2月21日 20:03]

3Lvr4Qj9dです。

すみません、たしかにkaitauさんの言うとおりです。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
array_mergeの再帰処理の動作について
 このエントリーをはてなブックマークに追加 
A
>1個になったとき$leftを返しますが、 >このとき、最終的な$leftはnullになるかと思います。 いいえ、最後は「渡された配列をそのまま」返します。要素が2以上あるときとの違いは(並べ替えずに戻るので...

>>続きを読む

再帰関数は最初の内は混乱しますが、非常に上手く使える場面もいずれ出てきます。これを機会に学んでいけるといいですね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)