【问题标题】:PHP Undefined Index [duplicate]PHP未定义索引[重复]
【发布时间】:2011-06-18 02:01:19
【问题描述】:

这听起来很愚蠢,但我不知道为什么会出现这个错误。

我在我的 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'];

当我运行页面时,我得到了这个错误:

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

我不明白为什么会这样,我很想知道如何让它消失。

【问题讨论】:

  • print_r($_GET) 显示什么?那里还有其他表单值吗?为什么不使用 POST?
  • 对应的php表单与HTML表单的对应方式是什么?它会生成 HTML 表单吗?它是否处理通过 HTML 表单提交的值?它只是具有相同的基本名称和不同的扩展名吗?请赐教。
  • 您知道您必须处理user_list.php 中的表单,因为您已在表单的操作中指定了这一点?如果您可以发布index.php 的相关代码并解释您的应用程序的一般“流程”,将会有所帮助。
  • 您还应该将“>90”替换为“>90”。
  • 您要检查的其他内容是 html 本身。确保您在 php 脚本中使用了正确的表单属性名称。

标签: php html


【解决方案1】:

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

$query_age = $_GET['query_age'];

与:

$query_age = (isset($_GET['query_age']) ? $_GET['query_age'] : null);

很可能,第一次运行脚本时没有?query_age=[something]$_GET 没有像query_age 这样的键。

【讨论】:

  • 这只会抑制通知,而不是修复原因。
  • @mario 我在代码下面解释了原因。作者写道:“当我运行该页面时,我收到此错误:注意:未定义索引:第 19 行 .../index.php 中的 query_age”所以我认为我的答案可以解决这个问题。
  • 修复通知!=修复原因。但我并不争辩它回答了 OP“让它消失”的问题部分。然而,实际问题出在其他地方。
  • 好主意,如果处理表单的脚本与生成表单的脚本相同。但在这种情况下,它似乎是两个不同的脚本。错误在index.php 中抛出,而表单的操作是user_list.php
  • $query_age = (isset($_GET['query_age']) ?: null)
【解决方案2】:

如果您像单身人士已经发布的答案一样使用 isset,请确保末尾有一个括号,如下所示:
$query_age = (isset($_GET['query_age']) ? $_GET['query_age'] : null);

【讨论】:

    【解决方案3】:

    在我看来,在分配成员之前检查成员的存在是非常丑陋的。

    Kohana 有一个useful function 让选择参数变得简单。

    你可以自己做这样的......

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

    然后做类似...

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

    【讨论】:

    • 不错,只是我建议使用匿名函数来控制范围并避免像 这样的错误
    • 匿名函数在这个例子中适合什么地方?
    • 喜欢这个 $arrayGet = function...
    • 这样做有什么好处?
    • 我在上面列出了 1) 范围 2) 重新声明
    【解决方案4】:

    第一次运行页面时,query_age 索引不存在,因为它还没有从表单发送过来。

    当您提交表单时,它就会存在,并且不会抱怨。

    #so change
    $_GET['query_age'];
    #to:
    (!empty($_GET['query_age']) ? $_GET['query_age'] : null);
    

    【讨论】:

    • 只要 GET 参数的存在对您的应用程序从不重要(很少如此)。
    猜你喜欢
    • 2014-01-27
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 2011-08-06
    • 2018-04-14
    相关资源
    最近更新 更多