【问题标题】:Why am I getting "Undefined index" from my PHP? [closed]为什么我从我的 PHP 中得到“未定义的索引”? [关闭]
【发布时间】:2023-03-03 17:46:02
【问题描述】:

当我运行这段代码时:

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

我收到此错误:

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

【问题讨论】:

标签: php undefined-index


【解决方案1】:

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

【讨论】:

  • Web 服务器设置的 $_GET 和 $_POST 将只有字符串或数组值。只有当 null 是有效值时才需要 array_key_exists。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 在我看来,这不是解决问题的办法...
      • 这只是错误的代码,因为“$_GET[p]”意味着您访问常量“p”。它仍然有效,因为 PHP 猜测您的意思是字符串 'p'。
      • @Dazmorgan:这不是真的。 $a=array('foo'=&gt;'foo','bar'=&gt;'bar'); define('foo', 'bar'); echo "$a[foo]" 是在呼应“foo”而不是“bar”。因此它被解释为$a['foo']
      • define('p', 'bar');在双引号中的字符串之外,该常量将返回字符串 bar,它将查找数组中的索引 bar。进入 imo 是一个坏习惯,但现在它有效。
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:
        $page = realpath("includes/ " . $_GET['p'] . ".php");
        

        【讨论】:

          猜你喜欢
          • 2015-03-23
          • 2012-02-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-07
          • 1970-01-01
          • 2015-02-02
          • 2017-03-29
          相关资源
          最近更新 更多