2009-08-31 18 views
4

、私はこれは単純な問題である場合ので、私は謝罪PHPに新たなんだ...

私は、あるサーバーから別のサーバーにPHPサイトを移動しています。新しいサーバーはIIS 7.0、PHP 5.2.1で、短いタグが "On"になっています。元のサーバーがどのようにセットアップされているかわかりません(コードを与えられたばかりです)。このページを実行すると、以下のエラーが常に表示され

<? 
ob_start(); 
session_start(); 

if($_GET['confirm'] == 13 || $_GET['confirm'] == 14 || $_GET['confirm'] == 15 || $_GET['confirm'] == 16) 
{ 
    include("test/query/test_query.php"); 
} 
?> 

PHPのお知らせ:未定義のインデックス

ページの一つ上のコードの最初のセクションには、次のとおりです。行6の[ファイルの場所] .phpで確認してください

また、ユーザーはホームページ(標準HTMLページ)からリダイレクトされてこのページにアクセスし、 。適切にナビゲート完全なURLは以下の通りです:エラーがスローされた理由を

http://www.[site].com/test.php#login

が...私は理解しています。私が理解していないことは、このコードが元のサーバーと同じように動作するかということです。私は構成設定が欠落している可能性がありますか?

*この問題は、サイト全体の数十の場所で発生します。これは問題の1つの特定の発生です。

+0

古いサーバーからすべてのファイルをコピーしたかどうかを再確認します。また、上にコピーする必要があるデータベースもありましたか? –

答えて

27

新しいサーバーには、error_reportingがE_ALLに設定されています。あなたが見ているのは、エラーではなく、通知です。試してみてください:

error_reporting(E_ALL^E_NOTICE) 

をE_ALLに設定エラー報告を使用すると、エラーが発生していない配列のメンバーにアクセスします。あなたはエラー報告のレベルを下げるしたくない場合は、[「VAR」] $ _GETをチェックする前に、あなたのコードを変更:あなたが実際に$_GET['confirm']にアクセスする前に)(ISSETの呼び出しを追加することにより、

if(isset($_GET['confirm']) && ($_GET['confirm'] == 13 || $_GET['confirm'] == 14 || $_GET['confirm'] == 15 || $_GET['confirm'] == 16)) { 

、あなた設定されていない配列メンバーにアクセスしていないことを確認します。何のインデックスの$ _GET [「確認」]が存在しないため(URLは?confirm=...または?something...&confirm=...で終わる場合$_GET['confirm']にのみ設定されます)

+4

+1。 OPは、まあまあのコーディング慣行を経験しています。 –

3

、PHPを使用すると、未定義のインデックスを見ているの通知をスローします。通知は表示されています。新しいサーバーには、php.iniまたはpageloadsで実行されるいくつかの設定ファイルまたはブートストラップのいずれかでerrorhreportingにE_NOTICEフラグが設定されているためです。

PHPマニュアルのE_NOTICE:「実行時の注意点:スクリプトにエラーが発生している可能性がありますが、スクリプトの通常の実行中に発生する可能性があることを示しています。

あなたが気にする必要がない場合は、通知をオフにするか、問題が発生する可能性のある場所を特定するために使用できます。あなたが投稿コードの場合

、簡単な修正は

何の「CONFIRM」インデックスがない場合は、条件を評価するから抜け出す方法PHPのベイルを
if(isset($_GET['confirm']) && <list of OR conditions>) 

に条件を変更することです。

+0

+1はE_NOTICEの説明をマニュアルに追加するためのものです。しかし、<条件の喪失>は(と)で囲むことを忘れないでください。 &&!より低い優先順位を持ちます。 – Josh

6

私は読書のためのコードを最適化することをお勧め:

if (isset($_GET['confirm']) && ($_GET['confirm'] >= 13 && $_GET['confirm'] <= 16)) 

そして、私は完全にジョシュの提案に同意します。 confirmクエリ文字列変数が設定されていないようですので、だ

+0

私はむしろswitch ... caseを提案したいと思いますが、これは元のスクリプトよりはるかに優れています。 –

2

、あなたはそれが好きで確認できます。

ini_set('display_errors', true); 
error_reporting(E_ALL); 

var_dump($_GET['confirm']); 
3

isset()は便利な機能です。変数が存在すれば "true"、そうでなければ "false"を返します。通常、人々は$_GETまたは$_POSTのようなスーパーグローバルと組み合わせて使用​​して、サイトの別のページから送信されているかどうかを判断します。これにより、ユーザーの所在地とタグ付けされているデータに基づいて。また、OPが得ているように、まだ定義していない変数を使用しようとする際のエラーを防止します。したがって、2つの異なる.phpファイルを作成し、間違ったユーザーに送信することを心配するのではなく、1ページですべてを行うことができます。

Jay、 これらの呼び出しのいくつかを使用する場合は注意が必要です。 <?php<?よりも動作する可能性が高くなります。私はsession_start()がブラウザに設定された最初のものでなければならない、またはヘッダーの問題を引き起こす可能性があると聞きました。そして、はい、それを使用する前に変数を宣言する必要があります - あなたのURLに[file].php?confirm=[some number]を入力していない場合、あなたのページは改行を許さない限り壊れます。