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


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

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2006/12/13 23:14:50
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答5件)

id:kn1967 No.1

回答回数2915ベストアンサー獲得回数301

ポイント20pt

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

}

で囲んではどうですか?

http://jp2.php.net/isset

id:tobeoscontinue No.2

回答回数220ベストアンサー獲得回数59

ポイント20pt

変数(この場合は$_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']がセットされているか調べて、それが数字の文字か調べて、更に数字(数値)に変換して較べればどうでしょう。

あまりに助長でしょうか

id:makocan

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

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

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

2006/12/13 01:43:40
id:fonya3 No.3

回答回数238ベストアンサー獲得回数10

ポイント20pt

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

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


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

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

$_GET['add']="";

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

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

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


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

id:makocan

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

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

2006/12/13 11:20:04
id:tobeoscontinue No.4

回答回数220ベストアンサー獲得回数59

ポイント20pt

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

初期化されていない変数を参照したためにエラーが発生し、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で使われる名前を列挙しておけば、初期化されていないものを空で初期化するというだけですが、苦難は苦汁ぐらいには軽減するのではないでしょうか

id:kn1967 No.5

回答回数2915ベストアンサー獲得回数301

ポイント20pt

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

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

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


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

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


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

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません