人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

あるサーバーを使っているのですが、PHPで、if ($_GET['add'] == 1)の様に中身を参照するとエラーと言うか、ページが表示されなくなります。

尚、その前に、$_GET['add']="";とやれば正常に動きます。
初期化の問題かもしれませんが、この初期化しないとページが表示されなくなるのをやめさせたいと思っております。
どう設定を変更すればいいのでしょうか?
※php.iniを置けば、設定は変更できます。

●質問者: makocan
●カテゴリ:インターネット ウェブ制作
✍キーワード:ADD PHP エラー サーバー 初期化
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● kn1967
●20ポイント

if (isset($_GET['add']) {

}

で囲んではどうですか?

http://jp2.php.net/isset


2 ● tobeoscontinue
●20ポイント

変数(この場合は$_GET['add'])がまだセットされていないものを参照するとエラーになります。

if (isset($_GET['add']) && $_GET['add'] == 1)

isset()でその変数がセットされているか調べてから参照するようにすればOKです。

http://jp2.php.net/manual/ja/function.isset.php

if (isset($_GET['add']) && is_numeric( $_GET['add']) && intval($_GET['add']) == 1)

$_GET['add']がセットされているか調べて、それが数字の文字か調べて、更に数字(数値)に変換して較べればどうでしょう。

あまりに助長でしょうか

◎質問者からの返答

お二人方、ありがとうございます。

ただ、相当数の$_GETを使ったプログラムのため、全てを行うのは苦難の技です。

何とか、サーバーサイドの設定は変えられませんか?


3 ● fonya3
●20ポイント

いろいろ調べてみましたが、、、

$_GETの初期化とかの問題ではなくて、、、


if ($_GET['add'] == 1){
 処理1
}else{
 処理2
}

上記の「処理1」の部分が生成するHTMLが不完全でブラウザに表示が出ないのではないですか?ソースを表示して確認してみられてはいかがでしょう。

$_GET['add']="";

を前に加えて「処理2」へ行くと正しいHTMLが生成されてブラウザに表示がでる、ということかもしれませんよ。

そもそも、PHPは変数の定義をしなくても使えるわけで、さらに$_GET変数は初期化しちゃったら、中身が飛んでしまって意味が無いですよね。

きっと「処理1」内のコードのケアレスかと思います。


http://www.2ones.com/geeklog_000/

◎質問者からの返答

質問で出したのはサンプルなため、本番ではそれは無いかと思われます。

別サーバーでは正常に動いていたので。。。


4 ● tobeoscontinue
●20ポイント

>ページが表示されなくなります。

初期化されていない変数を参照したためにエラーが発生し、error_reporting(0)かdisplay_errorsがFALSEになっているためページが表示されないと考えのですが、

初期化されていない変数を参照した場合はE_NOTICEでそれだけでは処理が途中で止まるものではありませんでした。(PHP4で)

よって原因は別のところにあると思います。

一度、error_reporting(E_ALL)でdisplay_errorsをTRUEにして実行してみれば原因を特定出来ると思うのですが。


>別サーバーでは正常に動いていたので。。。

$_GETを使っているということは以前のサーバーはPHP4だと思います。

PHP4では上記のようにE_NOTICEは出ているでしょうが処理は続けられます。

このことから問題となっているサーバーではPHP5ではないでしょうか。PHP5は使ったことがないので初期化されていない変数の参照でどういうエラーになるのか分りませんが。

クラスの場合は致命的なエラーになるようです。

http://manual.xwd.jp/migration5.incompatible.html


>ただ、相当数の$_GETを使ったプログラムのため、全てを行うのは苦難の技です。

PHP5だったとしてphp.iniによる回避の方法は見つかりませんでした。(私が無知なだけ)

うしろ向きな解決策として$_GETで使われるものをとりあえず初期化する関数を書いてみました。

function get_valid($list)
{
 foreach ($list as $name)
 if (!isset($_GET["$name"]))
 $_GET["$name"] = '';
}
get_valid(array("add", "sub", "div"));

phpスクリプトの最初の方で$_GETで使われる名前を列挙しておけば、初期化されていないものを空で初期化するというだけですが、苦難は苦汁ぐらいには軽減するのではないでしょうか


5 ● kn1967
●20ポイント

>別サーバーでは正常に動いていたので。。。

具体的なソースが無いので何とも言えないのですが、ひとつの可能性として、動いているほうのサーバーではphp.iniあるいは.htaccessにてregister_globalsをonにしてあったりしませんか?

http://www.sound-uz.jp/php/tips/security.html


>相当数の$_GETを使ったプログラム

大変だとは思いますが、安全面や今後の移植性などを考えるならばメインルーチンに入る手前で一つ一つの変数に対して内容確認と初期化を行う形にすることをお勧めしますけど、、、


余談ですが、いわしが使えない(回答受付中のコメントは受け付けない)の設定はもったいないかと、、、いわしはタダですし、、、2回といったような制約もありませんから、、、

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ