PHP未定义的索引

49

听起来可能很蠢,但我想不明白为什么会出现这个错误。

我在我的HTML表单中创建了一个名为“query_age”的选择框:

<form method="get" action="user_list.php">
<select name="query_age">
  <option value="">Doesn't matter</option>
  <option value="between 18 and 30">18 - 30</option>
  <option value="between 31 and 40">31 - 40</option>
  <option value="between 41 and 50">41 - 50</option>
  <option value="between 51 and 60">51 - 60</option>
  <option value="between 61 and 70">61 - 70</option>
  <option value="between 71 and 80">71 - 80</option>
  <option value="between 81 and 90">81 - 90</option>
  <option value="> 90">Older than 90</option>
</select>

在相应的PHP表单中,我有以下内容:
$query_age = $_GET['query_age'];

当我运行页面时,出现以下错误:

注意:在index.php的第19行出现未定义的索引:query_age

我不明白为什么会发生这种情况,我想知道如何解决它。

2
print_r($_GET) 显示什么?其他表单值在那里吗?为什么不使用 POST? - Felix Kling
相应的PHP表单与HTML表单有何对应关系?它会生成HTML表单吗?它会处理通过HTML表单提交的值吗?它只是具有不同扩展名的相同基本名称吗?请给我们解释一下。 - Oswald
2
你知道你必须在user_list.php中处理表单,因为你已经在表单的操作中指定了这个吗?如果你能发布index.php的相关代码并解释你的应用程序的一般“流程”,那会很有帮助。 - Felix Kling
1
你还应该将">90"替换为">90"。 - Aif
你需要检查的另一件事是HTML本身。确保你在PHP脚本中使用了你期望的正确表单属性名称。 - JohnMerlino
4个回答

100

我没有看到php文件,但可能是这样 -
在你的php文件中进行替换:

$query_age = $_GET['query_age'];

使用:

$query_age = (isset($_GET['query_age']) ? $_GET['query_age'] : null);
很可能,在第一次运行脚本时,您没有使用?query_age=[something],因此$_GET中没有像query_age这样的键。

1
这只是抑制通知,而不是修复原因。 - mario
8
@mario,我已经解释了下面代码的原因。作者写道:"当我运行页面时,我会得到以下错误提示:注意:在.../index.php文件的第19行,未定义索引:query_age",所以我认为,我的答案可以修复这个问题。 - Radek Benkel
1
修复通知并不等于修复原因。但我并不否认它回答了OP的“让它消失”的问题。然而,实际问题在别处。 - mario
2
如果处理表单的脚本与生成表单的脚本相同,那么这是一个好主意。但在这种情况下,它们似乎是两个不同的脚本。错误出现在 index.php 中,而表单的操作是 user_list.php - Felix Kling
$query_age = (isset($_GET['query_age']) ?: null) $query_age =(isset($ _GET ['query_age'])?:null) - b00sted 'snail'

9

在分配成员之前检查其是否存在,我认为这样做非常丑陋。

Kohana有一个有用的函数,可以使选择参数变得更加简单。

你也可以自己创建一个...

function arrayGet($array, $key, $default = NULL)
{
    return isset($array[$key]) ? $array[$key] : $default;
}

然后执行类似以下的操作...

$page = arrayGet($_GET, 'p', 1);

不错,只是我建议使用匿名函数来控制作用域并避免出现错误,例如<Cannot redeclare ... (previously declared...>。 - Yevgeniy Afanasyev
一个匿名函数在这个例子中应该放在哪里? - alex
$arrayGet = 函数... - Yevgeniy Afanasyev
那有什么优势? - alex
我列出了它们:1)作用域 2)重新声明 - Yevgeniy Afanasyev

4
第一次运行页面时,query_age索引不存在,因为它还没有从表单中发送过来。当您提交表单后,它将存在,并且不会对此抱怨。
#so change
$_GET['query_age'];
#to:
(!empty($_GET['query_age']) ? $_GET['query_age'] : null);

只要 GET 参数的存在对您的应用程序不重要(这很少发生)。 - alex

1
如果您像singles所提供的答案一样使用isset,请确保在末尾有一个括号,就像这样:
$query_age = (isset($_GET['query_age']) ? $_GET['query_age'] : null);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接