栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

PHP中未定义的索引,带帖子[重复]

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

PHP中未定义的索引,带帖子[重复]

注意:未定义的变量

从PHP手册的广泛智慧中:

在将一个文件包含在另一个使用相同变量名的文件中的情况下,依靠未初始化变量的默认值是有问题的。这也是一个重大的安全风险与register_globals的开启。如果使用未初始化的变量,则会发出E_NOTICE级错误,但是如果将元素附加到未初始化的数组,则不会发出E_NOTICE级错误。isset()语言构造可用于检测变量是否已初始化。另外,更理想的方法是empty()的解决方案,因为如果未初始化变量,它不会生成警告或错误消息。

从PHP文档:

如果变量不存在,则不会生成警告。这意味着 empty() 本质上与 !isset($ var)|| 等效 是$ var
==假

这意味着,你可以只使用

empty()
来确定变量设置,此外它检查变量针对以下,
0
0.0
""
"0"
null
false
[]

例:

$o = [];@$var = ["",0,null,1,2,3,$foo,$o['myIndex']];array_walk($var, function($v) {    echo (!isset($v) || $v == false) ? 'true ' : 'false';    echo ' ' . (empty($v) ? 'true' : 'false');    echo "n";});

在3v4l.org在线PHP编辑器中测试以上代码段

尽管PHP不需要变量声明,但它确实推荐这样做,以避免某些安全漏洞或bug,因为这些漏洞或bug可能会忘记为变量提供值,该变量将在脚本的后面使用。在未声明变量的情况下,PHP会发出非常低级的错误,

E_NOTICE
默认情况下甚至不会报告该错误,但《手册》建议在开发过程中允许这样做。

解决问题的方法:

  1. 推荐: 声明变量,例如,当您尝试将字符串附加到未定义的变量时。或使用
    isset()
    /
    !empty()
    来检查它们是否被引用,然后再引用它们,如:
    //Initializing variable

    $value = “”; //Initialization value; Examples
    //”” When you want to append stuff later
    //0 When you want to add numbers later
    //isset()
    $value = isset($_POST[‘value’]) ? $_POST[‘value’] : ‘’;
    //empty()
    $value = !empty($_POST[‘value’]) ? $_POST[‘value’] : ‘’;

自PHP 7.0起,它变得更加干净,现在您可以使用null合并运算符:

    // Null coalesce operator - No need to explicitly initialize the variable.$value = $_POST['value'] ?? '';
  1. 为E_NOTICE 设置一个自定义错误处理程序,并将消息重定向到标准输出之外(也许重定向到日志文件):

    set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
  2. 禁用E_NOTICE的报告功能。快速排除正义的方法

    E_NOTICE
    是:

    error_reporting( error_reporting() & ~E_NOTICE )
  3. 使用@运算符抑制错误。

注意: 强烈建议仅实施第1点。

注意:未定义索引/未定义偏移

当您(或PHP)尝试访问数组的未定义索引时,将显示此通知。

解决问题的方法:

  1. 访问索引之前,请检查该索引是否存在。为此,您可以使用

    isset()
    array_key_exists()

    //isset()

    $value = isset($array[‘my_index’]) ? $array[‘my_index’] : ‘’;
    //array_key_exists()
    $value = array_key_exists(‘my_index’, $array) ? $array[‘my_index’] : ‘’;

  2. list()
    当它尝试访问不存在的数组索引时,语言构造可能会生成以下代码:

    list($a, $b) = array(0 => 'a');

    //or
    list($one, $two) = explode(‘,’, ‘test string’);

两个变量用于访问两个数组元素,但是只有一个数组元素index

0
,因此将生成:

注意:未定义的偏移量:1

$_POST
/
$_GET
/
$_SESSION
可变

使用或时

$_POST
,以上提示经常出现。对于,您只需要在使用索引之前检查索引是否存在。因为您必须确保您以会话开始,并且索引也存在。
$_GET``$_SESSION``$_POST``$_GET``$_SESSION
session_start()

还要注意,所有3个变量都是超全局变量,并且都是大写的。

有关:

  • 注意:未定义的变量
  • 注意:未定义的索引


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/640729.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号