web-dev-qa-db-ja.com

php $ _GETおよび未定義のインデックス

別の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:\xampp\htdocs\teaching\index.php on line 43
Notice: Undefined index: s in C:\xampp\htdocs\teaching\index.php on line 45
Notice: Undefined index: s in C:\xampp\htdocs\teaching\index.php on line 47
Notice: Undefined index: s in C:\xampp\htdocs\teaching\index.php on line 49

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

手伝って頂けますか?

41
Jeff

エラー報告には以前のサーバー上の通知が含まれていないため、エラーは表示されません。

使用する前に、インデックスs$_GET配列に実際に存在するかどうかを確認する必要があります。

このようなもので十分です:

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>";
}

switchステートメントを使用してコードを読みやすくすると、(ケースを追加する予定がある場合)有益な場合があります。

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;
}

編集:ところで、私が書いた最初のコードのセットは、あなたのコードが全体として何をするつもりなのかを模倣しています。 ?s=の予期しない値の予期される結果は、<body>タグを出力しないことを意図したものですか、これは見落としでしたか?スイッチは常にデフォルトの<body>によってこれを修正することに注意してください。

63
Rudi Visser

isset で変数が使用可能かどうかをチェックする習慣を身に付けます。

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

通知レポートを無効にすることもできますが、対処することは衛生的であり、見逃す可能性のある問題を見つけることができます。

6
Paul Dixon

私は、常にインデックスが存在するかどうかを常にチェックする必要を避けるために、$ _ GETおよび$ _POST配列からの読み取りにユーティリティ関数/クラスを使用します...このような何かがトリックを行います。

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');
5
evilunix

Localhostでxamppを使用して同じ問題が発生していました。今、私はこのパラメーターの組み合わせを使用しています:

// 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

3
rodrigoio

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

正確さのために、次のことを行います。

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を取得します。

1
rupps

最初に$_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条件も適切に処理します。

1
Awais Qarni

盲目的にアクセスする前に、配列を確認することをお勧めします。

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

別の(簡単な)修正は、スクリプトの先頭にこれを書くことでエラー報告を無効にすることです:

error_reporting(0);  

あなたの場合、他のサーバーでphp.iniデフォルトとして0に設定。
error_reportingパラメータとして0を使用すると、すべての通知/警告とエラーをオフにします。詳細については、 PHPマニュアル を確認してください。

これは簡単な修正であり、エラーを無視するのではなく、回避することを強くお勧めします。

0
gion_13

使用する前にインデックスが存在するかどうかを確認する必要があります(比較してください)

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

E_ALLを使用| E_STRICT開発中!

0
erenon

シンプルな機能。GETまたはPOSTで動作します。さらに、デフォルト値を割り当てることができます。

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

別のオプションは、GET変数の前に@記号を付けたPHP undefined index notice)を抑制することです:

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

これにより、通知が無効になります。変数が設定されているかどうかを確認し、それに応じて行動することをお勧めします。

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

0
Floris

If、else、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.'">';

きれいで読みやすいコードは保守可能なコードです

0
SparK