php $ _GET和未定义的索引

时间:2011-10-24 14:04:49

标签: php undefined

当我尝试在不同的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函数,但如果没有声明,我希望页面正常加载。

你能帮助我吗?

12 个答案:

答案 0 :(得分:61)

错误报告将不会包含先前服务器上的通知,这就是您没有看到错误的原因。

在尝试使用之前,您应该检查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;
}
编辑:BTW,我写的第一组代码模仿了你的整个代码。 ?s=中意外值的预期结果是否意味着不输出<body>标记,还是这是一种疏忽?请注意,交换机将通过始终默认为<body>来解决此问题。

答案 1 :(得分:6)

养成检查isset变量是否可用的习惯,例如

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

您可以停用通知报告,但处理它们是一种良好的卫生习惯,并且可以让您发现可能会错过的问题。

答案 2 :(得分:5)

我总是使用实用程序函数/类来读取$ _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');

答案 3 :(得分:3)

我在使用xampp的localhost中遇到了同样的问题。现在我正在使用这些参数组合:

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

答案 4 :(得分:1)

首先检查是否设置了$_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条件

答案 5 :(得分:1)

实际上,没有一个建议的答案,虽然是一个好的做法,但会删除警告。

为了正确起见,我会做以下事情:

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。

答案 6 :(得分:0)

我建议您在盲目访问阵列之前检查阵列:

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

另一个(快速)修复是通过在脚本顶部写下来禁用错误报告:

error_reporting(0);  

在您的情况下,您的其他服务器很可能将php.ini中的错误报告配置设置为默认值为0。 通过调用带有0作为参数的error_reporting,您将关闭所有通知/警告和错误。有关详细信息,请查看 the php manual

请记住,这是一个快速解决方案,强烈建议避免错误而不是忽略错误。

答案 7 :(得分:0)

你应该在使用之前检查索引是否存在(比较它)

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

使用E_ALL |开发时的E_STRICT!

答案 8 :(得分:0)

避免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.'">';

干净,可读的代码是可维护的代码

答案 9 :(得分:0)

简单的功能,适用于GET或POST。另外,您可以指定默认值。

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

答案 10 :(得分:0)

另一种选择是使用GET变量前面的@符号抑制PHP未定义的索引通知,如下所示:

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

这将禁用该通知。最好检查变量是否已设置并采取相应措施。

但这也可以。

答案 11 :(得分:-2)

对此的真正答案是在变量之前放置@ At符号以抑制错误

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

它会慢一些,但会保持代码清洁。

当某些东西为程序员节省时间,并为网站用户花费时间(或需要更多硬件)时,这取决于人们将使用它的程度。