0

当我运行此代码时:

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

我收到此错误:

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

4

6 回答 6

12

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

if (isset($_GET['p']) && preg_match('/^[a-z0-9]+$/', $_GET['p'])) {
    $page = realpath("includes/$_GET[p].php");
    if ($page) {
        include $page;
    }
}
于 2009-04-12T13:18:59.803 回答
5

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

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

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

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

于 2009-04-12T13:53:45.290 回答
4
$page = realpath("includes/ " . $_GET['p'] . ".php");
于 2009-04-12T13:17:01.620 回答
2

没有真正的问题。PHP 产生一个Notice而不是WarningError。基本上,您的脚本没有收到pURL 参数。所以它使用 '' 并在日志中给出通知。如果您在呈现的页面上看到此消息,请将 php 错误报告调整为类似于E_ERROR | E_WARNINGPHP.ini 中的内容

于 2009-04-12T13:43:38.777 回答
0

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

于 2009-04-12T14:11:12.470 回答
0

页面没有'p'参数,也许?你的意思是$_REQUEST相反吗?
另外,访问数组时不是 `"${_GET['p']}" 吗?

于 2009-04-12T13:17:42.897 回答