PHP $ _GETと未定義インデックス -- php フィールド と undefined フィールド 関連 問題

php $_GET and undefined index












48
vote

問題

日本語

私が別のPHPサーバーで私のスクリプトを実行しようとしたときに新しい問題が発生しました。

私の古いサーバー上では、 s パラメータが宣言されていなくても、次のコードが正常に機能します。

<事前> <コード> <?php if ($_GET['s'] == 'jwshxnsyllabus') echo "<body onload="loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml', '../bibliographies/jwshxnbibliography_')">"; if ($_GET['s'] == 'aquinas') echo "<body onload="loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')">"; if ($_GET['s'] == 'POP2') echo "<body onload="loadSyllabi('POP2')">"; elseif ($_GET['s'] == null) echo "<body>" ?>

しかし、私のローカルマシン上の私のローカルサーバー上で(XAMPP - Apache) s の値が定義されていない場合は、次のエラーが発生します。

<事前> <コード> Notice: Undefined index: s in C:xampphtdocs eachingindex.php on line 43 Notice: Undefined index: s in C:xampphtdocs eachingindex.php on line 45 Notice: Undefined index: s in C:xampphtdocs eachingindex.php on line 47 Notice: Undefined index: s in C:xampphtdocs eachingindex.php on line 49

s に値が宣言されている場合は、スクリプトが特定のJavaScript関数を呼び出したいのですが、宣言されていない場合は、ページが正常にロードされています。

あなたは私を助けることができますか?

英語

A new problem has arisen for me as I tried to run my script on a different PHP Server.

ON my old server the following code appears to work fine - even when no s parameter is declared.

<?php  if ($_GET['s'] == 'jwshxnsyllabus') echo "<body onload="loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml',         '../bibliographies/jwshxnbibliography_')">"; if ($_GET['s'] == 'aquinas') echo "<body onload="loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')">";   if ($_GET['s'] == 'POP2') echo "<body onload="loadSyllabi('POP2')">"; elseif ($_GET['s'] == null) echo "<body>" ?> 

But now, on a my local server on my local machine (XAMPP - Apache) I get the following error when no value for s is defined.

Notice: Undefined index: s in C:xampphtdocs eachingindex.php on line 43 Notice: Undefined index: s in C:xampphtdocs eachingindex.php on line 45 Notice: Undefined index: s in C:xampphtdocs eachingindex.php on line 47 Notice: Undefined index: s in C:xampphtdocs eachingindex.php on line 49 

What I want to happen for the script to call certain javascript functions if a value is declared for s, but if nothing is declared i would like the page to load normally.

Can you help me?

</div
     
   
   

回答リスト

76
 
vote
vote
ベストアンサー
 

エラー報告は、前のサーバー上の通知に含まれていません。そのため、エラーを見たことがない理由です。

索引<コード> s が実際に elements0 Arrayに存在するかどうかを確認してください。

これは十分です:

<事前> <コード> elements1

elements2 文を使用してコードを読みやすくするために有益な場合があります(より多くのケースを追加する場合)。

<事前> <コード> elements3

編集:BTW、最初のコードセットはあなたがその全体のことをすることを意図していることを模倣しました。 <コード> elements4 の予期しない値の予想結果は、<コード> elements5 タグを出力するか、これは監視されましたか?常に var delegate = new Delegate(document.body); delegate.on('click', 'button', handleButtonClicks); // Listen to all touch move // events that reach the body delegate.on('touchmove', handleTouchMove); }); 16 に常にデフォルト設定することで、このスイッチはこれを修正します。

 

Error reporting will have not included notices on the previous server which is why you haven't seen the errors.

You should be checking whether the index s actually exists in the $_GET array before attempting to use it.

Something like this would be suffice:

if (isset($_GET['s'])) {     if ($_GET['s'] == 'jwshxnsyllabus')         echo "<body onload="loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml',         '../bibliographies/jwshxnbibliography_')">";     else if ($_GET['s'] == 'aquinas')         echo "<body onload="loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')">";      else if ($_GET['s'] == 'POP2')         echo "<body onload="loadSyllabi('POP2')">"; } else {     echo "<body>"; } 

It may be beneficial (if you plan on adding more cases) to use a switch statement to make your code more readable.

switch ((isset($_GET['s']) ? $_GET['s'] : '')) {     case 'jwshxnsyllabus':         echo "<body onload="loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml',         '../bibliographies/jwshxnbibliography_')">";         break;     case 'aquinas':         echo "<body onload="loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')">";         break;     case 'POP2':         echo "<body onload="loadSyllabi('POP2')">";         break;     default:         echo "<body>";         break; } 

EDIT: BTW, the first set of code I wrote mimics what yours is meant to do in it's entirety. Is the expected outcome of an unexpected value in ?s= meant to output no <body> tag or was this an oversight? Note that the switch will fix this by always defaulting to <body>.

</div
 
 
 
 
7
 
vote

ISSET 、例えば

で変数が利用可能かどうかを確認する習慣を取得します。 <事前> <コード> elements7

通知レポートを無効にすることができましたが、それらに対処することは良い衛生的であり、あなたがそうでなければ見逃しているかもしれない問題を見つけることを可能にすることができます。

 

Get into the habit of checking if a variable is available with isset, e.g.

if (isset($_GET['s'])) {      //do stuff that requires 's' } else {      //do stuff that doesn't need 's' } 

You could disable notice reporting, but dealing them is good hygiene, and can allow you to spot problems you might otherwise miss.

</div
 
 
6
 
vote

常に索引をチェックする必要がないように$ _GETと$ _POSTアレイから読み取るために常にUTILITY関数/クラスを使用してください...このようなものはトリックをします。

<事前> <コード> elements8
 

I always use a utility function/class for reading from the $_GET and $_POST arrays to avoid having to always check the index exists... Something like this will do the trick.

class Input { function get($name) {     return isset($_GET[$name]) ? $_GET[$name] : null; }  function post($name) {     return isset($_POST[$name]) ? $_POST[$name] : null; }  function get_post($name) {     return $this->get($name) ? $this->get($name) : $this->post($name); } } $input = new Input; $page = $input->get_post('page'); 
</div
 
 
3
 
vote

私はXAMPPとローカルホストで同じ問題を抱えていました。今、私はこのパラメータの組み合わせを使っています:

<事前> <コード> elements9

php.net:> http://php.net/manual/pt_br/ function.error-reporting.php

 

I was having the same problem in localhost with xampp. Now I'm using this combination of parameters:

// Report all errors except E_NOTICE // This is the default value set in php.ini error_reporting(E_ALL ^ E_NOTICE); 

php.net: http://php.net/manual/pt_BR/function.error-reporting.php

</div
 
 
1
 
vote

最初の確認<コード> $_GET['s'] が設定されているかどうかを確認します。この

のような状態を変更してください <事前> <コード> <?php if (isset($_GET['s']) && $_GET['s'] == 'jwshxnsyllabus') echo "<body onload="loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml', '../bibliographies/jwshxnbibliography_')">"; elseif (isset($_GET['s']) && $_GET['s'] == 'aquinas') echo "<body onload="loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')">"; elseif (isset($_GET['s']) && $_GET['s'] == 'POP2') echo "<body onload="loadSyllabi('POP2')">"; elseif (isset($_GET['s']) && $_GET['s'] == null) echo "<body>" ?>

および<コード> ifelse 条件

 

First check the $_GET['s'] is set or not. Change your conditions like this

<?php if (isset($_GET['s']) && $_GET['s'] == 'jwshxnsyllabus') echo "<body onload="loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml',         '../bibliographies/jwshxnbibliography_')">"; elseif (isset($_GET['s']) && $_GET['s'] == 'aquinas') echo "<body onload="loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')">";  elseif (isset($_GET['s']) && $_GET['s'] == 'POP2') echo "<body onload="loadSyllabi('POP2')">"; elseif (isset($_GET['s']) && $_GET['s'] == null) echo "<body>" ?> 

And also handle properly your ifelse conditions

</div
 
 
1
 
vote

実際に提案された答えのどれも良い慣習ではありませんが、警告を取り除くでしょう。

正しさのために、私は次のことをします:

<事前> <コード> function getParameter($param, $defaultValue) { if (array_key_exists($param, $_GET)) { $value=$_GET[$param]; return isSet($value)?$value:$defaultValue; } return $defaultValue; }

このように、警告をトリガすることなく存在する _GET 配列を確認します。彼らが外観を取るのに少なくとも興味深いものであるので警告を無効にすることは良い考えではありません。

あなたがするだけの関数を使用する:

<事前> <コード> $myvar = getParameter("getparamer", "defaultValue")

だからパラメータが存在する場合は、値が取得され、そうでなければdefaultValueが得られます。

 

Actually none of the proposed answers, although a good practice, would remove the warning.

For the sake of correctness, I'd do the following:

function getParameter($param, $defaultValue) {     if (array_key_exists($param, $_GET)) {         $value=$_GET[$param];         return isSet($value)?$value:$defaultValue;     }     return $defaultValue; } 

This way, I check the _GET array for the key to exist without triggering the Warning. It's not a good idea to disable the warnings because a lot of times they are at least interesting to take a look.

To use the function you just do:

$myvar = getParameter("getparamer", "defaultValue") 

so if the parameter exists, you get the value, and if it doesnt, you get the defaultValue.

</div
 
 
0
 
vote

使用する前にインデックスが存在するチェック(比較)

<事前> <コード> if (isset($_GET['s']) AND $_GET['s'] == 'foobar') { echo "foo"; }

E_ALL |を使うe_Strictを開発中!

 

You should check wheter the index exists before use it (compare it)

if (isset($_GET['s']) AND $_GET['s'] == 'foobar') {     echo "foo"; } 

Use E_ALL | E_STRICT while developing!

</div
 
 
0
 
vote

他の場合、ELSEIFS!

<事前> <コード> $loadMethod = ""; if(isset($_GET['s'])){ switch($_GET['s']){ case 'jwshxnsyllabus': $loadMethod = "loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml', '../bibliographies/jwshxnbibliography_')"; break; case 'aquinas': $loadMethod = "loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')"; break; case 'POP2': $loadMethod = "loadSyllabi('POP2')"; } } echo '<body onload="'.$loadMethod.'">';

クリーン、読み取り可能なコードはメンテナンス可能なコード

 

Avoid if, else and elseifs!

$loadMethod = ""; if(isset($_GET['s'])){     switch($_GET['s']){         case 'jwshxnsyllabus':             $loadMethod = "loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml', '../bibliographies/jwshxnbibliography_')";         break;         case 'aquinas':             $loadMethod = "loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')";         break;         case 'POP2':             $loadMethod = "loadSyllabi('POP2')";     } }  echo '<body onload="'.$loadMethod.'">'; 

clean, readable code is maintainable code

</div
 
 
 
 
0
 
vote

盲目的にアクセスする前に配列をチェックすることをお勧めします。

<事前> <コード> if(isset($_GET['s'])){ if ($_GET['s'] == 'jwshxnsyllabus') /* your code here*/ }

もう1つの(クイック)修正は、これをスクリプトの上部に書き込むことでエラー報告を無効にすることです。

<事前> <コード> error_reporting(0);

あなたの場合では、他のサーバーに <?php if (isset($_GET['s']) && $_GET['s'] == 'jwshxnsyllabus') echo "<body onload="loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml', '../bibliographies/jwshxnbibliography_')">"; elseif (isset($_GET['s']) && $_GET['s'] == 'aquinas') echo "<body onload="loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')">"; elseif (isset($_GET['s']) && $_GET['s'] == 'POP2') echo "<body onload="loadSyllabi('POP2')">"; elseif (isset($_GET['s']) && $_GET['s'] == null) echo "<body>" ?> 0 に設定されているエラー報告設定がデフォルトで0に設定されている可能性があります。
998877611 を0で0で呼び出すことで、すべての通知/警告とエラーをオフにしています。詳細については PHPマニュアル。

これがクイック修正であることを覚えており、それらを無視するのではなくエラーを避けることを強くお勧めします。

 

I recommend you check your arrays before you blindly access them :

if(isset($_GET['s'])){     if ($_GET['s'] == 'jwshxnsyllabus')         /* your code here*/ } 

Another (quick) fix is to disable the error reporting by writing this on the top of the script :

error_reporting(0);   

In your case, it is very probable that your other server had the error reporting configuration in php.ini set to 0 as default.
By calling the error_reporting with 0 as parameter, you are turning off all notices/warnings and errors. For more details check the php manual.

Remeber that this is a quick fix and it's highly recommended to avoid errors rather than ignore them.

</div
 
 
         
         
0
 
vote

簡単な機能、GETまたはPOSTで動作します。プラスデフォルト値を割り当てることができます。

<事前> <コード> <?php if (isset($_GET['s']) && $_GET['s'] == 'jwshxnsyllabus') echo "<body onload="loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml', '../bibliographies/jwshxnbibliography_')">"; elseif (isset($_GET['s']) && $_GET['s'] == 'aquinas') echo "<body onload="loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')">"; elseif (isset($_GET['s']) && $_GET['s'] == 'POP2') echo "<body onload="loadSyllabi('POP2')">"; elseif (isset($_GET['s']) && $_GET['s'] == null) echo "<body>" ?> 2
 

Simple function, works with GET or POST. Plus you can assign a default value.

function GetPost($var,$default='') {     return isset($_GET[$var]) ? $_GET[$var] : (isset($_POST[$var]) ? $_POST[$var] : $default); } 
</div
 
 
0
 
vote

別のオプションは、

のようなの前の 9988777613 記号でPHP未定義索引通知を抑制することです。 <事前> <コード> <?php if (isset($_GET['s']) && $_GET['s'] == 'jwshxnsyllabus') echo "<body onload="loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml', '../bibliographies/jwshxnbibliography_')">"; elseif (isset($_GET['s']) && $_GET['s'] == 'aquinas') echo "<body onload="loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')">"; elseif (isset($_GET['s']) && $_GET['s'] == 'POP2') echo "<body onload="loadSyllabi('POP2')">"; elseif (isset($_GET['s']) && $_GET['s'] == null) echo "<body>" ?> 4

これは通知を無効にします。変数が設定されているかどうかを確認することをお勧めします。

しかしこれはも機能します。

 

Another option would be to suppress the PHP undefined index notice with the @ symbol in front of the GET variable like so:

$s = @$_GET['s']; 

This will disable the notice. It is better to check if the variable has been set and act accordingly.

But this also works.

</div
 
 
-2
 
vote

これに対する実際の回答は、エラー

を抑制する変数の前に@ @の記号を置くことです。 <事前> <コード> <?php if (isset($_GET['s']) && $_GET['s'] == 'jwshxnsyllabus') echo "<body onload="loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml', '../bibliographies/jwshxnbibliography_')">"; elseif (isset($_GET['s']) && $_GET['s'] == 'aquinas') echo "<body onload="loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')">"; elseif (isset($_GET['s']) && $_GET['s'] == 'POP2') echo "<body onload="loadSyllabi('POP2')">"; elseif (isset($_GET['s']) && $_GET['s'] == null) echo "<body>" ?> 5

それは遅く機能しますが、コードをきれいに保つでしょう。

プログラマの時間を節約するとき、そしてウェブサイトのユーザーのための時間の時間(またはより多くのハードウェアを必要とする)は、それを使用する人々の量によって異なります。

 

The real answer to this is to put a @ At symbol before the variable which will suppress the error

@$_GET["field"] @$_POST["field"] 

It will work some slower, but will keep the code clean.

When something saves time for the programmer, and costs time for the website users (or requires more hardware), it depends on how much people will use it.

</div
 
 

関連する質問

5  HTMLに挿入されたときに未定義のJavaScript変数が 'undefined'を表示するのを防ぐ方法はありますか?  ( Is there a way to prevent undefined javascript variables from displaying undefi ) 
JavaScript変数に格納されているテキストをdiv要素に追加しています。この問題は、その変数にテキストが保存されている場合、またはテキストが保存されていない可能性があります。有効なテキストがDIVにあったとされているテキスト '未定義の'で終わらない場...

1  アカウントの参照エラー:MapBoxGLは未定義です  ( Uncaught reference error mapboxgl is undefined ) 
私はこのようにしてMapBox-GL JSを動的にロードしています: <事前> <コード> var script = domConstruct.create("script"); script.type = "text/java...

-7  ステートメントとLoop Work for空の変数の場合の作成方法  ( How to make if statement and for loop work for an empty variable ) 
My Pythonスクリプトは dlimage と呼ばれます。 if文とforループを組み合わせたいです。端末では、 python dlimage 1 2 3 と入力できるようにしたいと思います.1つの画像だけをダウンロードします。その他のNUM3の変数が空...

0  Flex 4:1120:未定義の財産のアクセス  ( Flex 4 1120 access of undefined property ) 
Flexの新機能と私はArrayCollectionクラスを作業しようとしています。 1120:未定義のプロパティへのアクセス 何かのようなもの: <事前> <コード> googleapis8 1120:未定義の財産のアクセス リスト は、1行目...

1  jQuery関数Ajaxを返し、未定義  ( Jquery function with ajax returning undefined ) 
Ajaxを使用するjQuery関数を持っています。常に undefined を返し、なぜ理解することができます。 $.post 関数に登録されている変数に警告した場合は、外部に試してみるとしません。 <事前> <コード> function signup...

1  jQuery未定義  ( Jquery undefined ) 
「jQuery未定義」エラーが発生しています。あなたはどんなアイデア(以下のコード)を持っていますか? <事前> <コード> <%@ Page Language="C#" AutoEventWireup="true" Inherits="faturaYazic...

169  PHPエラーメッセージ「通知:未定義の定数の使用」とはどういう意味ですか?  ( What does the php error message notice use of undefined constant mean ) 
PHPはログにこのエラーを書き込んでいます。 "注意:未定義定数の使用" ログのエラー: <事前> <コード> final HashMap<String,HashMap<String,String>> full = new HashMap<String...

0  方法OnactivityCreated(バンドル)はタイプSherlock Fragment用に未定義です  ( The method onactivitycreatedbundle is undefined for the type sherlockfragment ) 
ActionBarsherLockを実装するプロジェクトで作業しようとしている、私はプロジェクトに正しくライブラリを追加しました、そしてこのエラーを得ます: <事前> <コード> The method onActivityCreated(bundle) is...

0  jQueryでNULLまたは未定義の値を確認してください  ( Check null or undefined value in jquery ) 
本当にこの問題に夢中になっています...そして私がそれを理解することができないトスマンを読んだ...すでに議論されたトピックを事前に事前に申し訳ありませんが、私は特定の助けが必要です。 私がする必要があるもの:変数が空でないか確認してください。この場合、バッ...

3  JavaScript "Document.GetElementById未定義"  ( Javascript document getelementbyid undefined ) 
私は何かが足りないかもしれません、私はいくつかの派閥を試しましたが、彼ら全員が同じ結果になっていて、私は髪を引き始めようとしています <事前> <コード> <script type="text/javascript"> function set_size() ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有