为什么我从PHP获得“Undefined index”?

时间:2009-04-12 13:14:06

标签: php undefined-index

当我运行此代码时:

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

我收到此错误:

  

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

6 个答案:

答案 0 :(得分:12)

错误消息显示没有包含密钥p的数组项。如果您不能保证变量(或数组项)确实存在,则应首先使用isset function进行检查:

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

答案 1 :(得分:5)

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

同样对于parsing an array index in a string,您应该在数组周围使用括号,如果它是一个字符串,您应该使用单引号转义索引。

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

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

答案 2 :(得分:4)

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

答案 3 :(得分:2)

没有真正的问题。 PHP产生通知而不是警告错误。基本上,您的脚本未收到p网址参数。所以它使用''并在日志中给出通知。如果您在呈现的页面上看到此消息,请将PHP错误报告调整为PHP.ini中的E_ERROR | E_WARNING

答案 4 :(得分:0)

页面上没有'p'参数,也许?您的意思是$_REQUEST而不是吗? 另外,当您访问数组时,它不是“$ {_ GET ['p']}”吗?

答案 5 :(得分:0)

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