为什么我从 PHP 中得到“未定义的索引”?[关闭]

Why am I getting "Undefined index" from my PHP? [closed]

提问人: 提问时间:4/12/2009 最后编辑:10 revs, 6 users 37%Sobbe 更新时间:12/15/2012 访问量:5008

问:

当我运行这段代码时:

<?php
if (preg_match('/^[a-z0-9]+$/', $_GET['p'])) {
  $page = realpath("includes/$_GET[p].php");
  if ($page) {
    include $page;
  }
}
?>

我收到此错误:

注意:未定义的索引:第 3 行 index.php 中的 p

php 未定义索引

评论

0赞 Jocelyn 5/12/2013
PHP 的可能重复:“注意:未定义的变量”和“注意:未定义的索引”

答:

4赞 ericteubert 4/12/2009 #1
$page = realpath("includes/ " . $_GET['p'] . ".php");
0赞 Lucas Jones 4/12/2009 #2

页面没有“p”参数,也许?你是说吗?
另外,当您访问数组时,它不是 '“${_GET['p']}” 吗?
$_REQUEST

12赞 Gumbo 4/12/2009 #3

错误消息说没有带有键的数组项。如果不能保证变量(或数组项)确实存在,则应首先使用 isset 函数检查它:p

if (isset($_GET['p']) && preg_match('/^[a-z0-9]+$/', $_GET['p'])) {
    $page = realpath("includes/$_GET[p].php");
    if ($page) {
        include $page;
    }
}

评论

0赞 TheHippo 4/13/2009
在我看来,这不是解决问题的方法......
1赞 ericteubert 4/13/2009
这只是错误的代码,因为“$_GET[p]”意味着您访问常量“p”。尽管如此,它仍然有效,因为 PHP 猜测您的意思是字符串“p”。
0赞 Gumbo 4/13/2009
@Dazmorgan:那不是真的。 与“foo”而不是“bar”相呼应。因此,它被解释为 .$a=array('foo'=>'foo','bar'=>'bar'); define('foo', 'bar'); echo "$a[foo]"$a['foo']
0赞 OIS 4/13/2009
define('p', '条形图');在双引号中的字符串外部,常量将返回字符串栏,这将在数组中查找索引栏。进入imo是一个坏习惯,但目前有效。
2赞 Peter Perháč 4/12/2009 #4

没有真正的问题。PHP 生成的是 Notice,而不是 Warning 或 Error基本上,您的脚本没有收到 URL 参数。因此,它使用“”并在日志中发出通知。如果您在呈现的页面上看到此消息,请将 php 错误报告调整为 PHP.ini 中的内容pE_ERROR | E_WARNING

5赞 OIS 4/12/2009 #5

Gumbo 所说的检查索引是否在数组中设置。

此外,为了解析字符串中的数组索引,您应该在数组周围使用括号,如果它是字符串,则应使用单引号对索引进行转义。

$page = realpath("includes/{$_GET['p']}.php");

但是,对于包含用户建议的文件,最安全的方法是在数组中查找文件,并且仅当它们存在时才包含它们。

0赞 moo 4/12/2009 #6

查看 array_key_exists() 以检查数组键是否...存在。但是在你的情况下,我建议你选择专门处理用户输入的函数的过滤器类。

评论

0赞 OIS 4/13/2009
Web 服务器设置的 $_GET 和 $_POST 将仅包含字符串或数组值。仅当 null 为有效值时才需要array_key_exists。