php上传报未定义偏移量,使用PHP“注意:未定义的变量”,“注意:未定义的索引”和“通知:未定义的偏移量”...

0bba17e731e6c7664ae78e077f2ab4f6.png

慕少森

注意:未定义的变量来自PHP手册的广博智慧:在将一个文件包含到使用相同变量名称的另一个文件的情况下,依赖于未初始化变量的默认值是有问题的。这也是一个重大的安全风险与register_globals的开启。如果使用未初始化的变量,则会发出E_NOTICE级别错误,但是在未初始化的数组中附加元素时则不会。isset()语言构造可用于检测变量是否已经初始化。另外,更理想的是empty()的解决方案,因为如果未初始化变量,它不会生成警告或错误消息。从PHP文档:如果变量不存在,则不会生成警告。这意味着 empty()基本上是!isset($ var)||的简洁等价物 $ var == false。这意味着您只能empty()用于确定是否设置了变量,此外它还会根据以下内容检查变量0,"",null。例:$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不需要变量声明,但它确实建议使用它以避免一些安全漏洞或错误,因为人们会忘记为稍后将在脚本中使用的变量赋值。PHP在未声明变量的情况下所做的是发出一个非常低级别的错误,E_NOTICE默认情况下甚至没有报告,但是Manual 建议在开发期间允许。处理问题的方法:建议:声明变量,例如,当您尝试将字符串附加到未定义的变量时。或者 在引用它们之前使用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 coalesce运算符:// Null coalesce operator - No need to explicitly initialize the variable.$value = $_POST['value'] ?? '';为E_NOTICE 设置自定义错误处理程序,并将消息重定向远离标准输出(可能是日志文件):set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)禁用报告中的E_NOTICE。一种快速排除方法E_NOTICE是:error_reporting( error_reporting() & ~E_NOTICE )使用@运算符抑制错误。注意:强烈建议仅实施第1点。注意:未定义的索引/未定义的偏移量当您(或PHP)尝试访问数组的未定义索引时,会出现此通知。处理问题的方法:在访问索引之前检查索引是否存在。为此您可以使用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'] : '';语言构造list()在尝试访问不存在的数组索引时可能会生成此内容:list($a, $b) = array(0 => 'a');//orlist($one, $two) = explode(',', 'test string');两个变量用于访问两个数组元素,但是只有一个数组元素index 0,因此这将生成:注意:未定义的偏移量:1$_POST/ $_GET/ $_SESSION可变使用时$_POST,上面的注意事项经常出现,$_GET或$_SESSION。对于您而言$_POST,$_GET您只需在使用之前检查索引是否存在。因为$_SESSION您必须确保以会话开始session_start()并且索引也存在。另请注意,所有3个变量都是超全局变量并且是大写的。有关:注意:未定义的变量注意:未定义的索引

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值