0
点赞
收藏
分享

微信扫一扫

Notice: Undefined index: ZZZZZZWTF? [duplicate]

眸晓 2022-01-06 阅读 26

1 Notice: Undefined index: ZZZZZZWTF? [duplicate]

再运行PHP脚本的时候,明明脚本语法什么的都没有问题,但是却有如下的提示信息:

Notice: Undefined index: submit in C:\xampp\htdocs\globalautoparts\register.php on line 36
Notice: Undefined index: fullname in C:\xampp\htdocs\globalautoparts\register.php on line 40
Notice: Undefined index: username in C:\xampp\htdocs\globalautoparts\register.php on line 41
Notice: Undefined index: password in C:\xampp\htdocs\globalautoparts\register.php on line 42
Notice: Undefined index: repeatpassword in C:\xampp\htdocs\globalautoparts\register.php on line 43
Notice: Undefined index: email in C:\xampp\htdocs\globalautoparts\register.php on line 45

遇到这种情况,应该如何解决。

2 解决

修改PHP的日志提示等级,忽略这些提示信息即可。再脚本最上面添加如下语句,然后问题解决。

error_reporting(E_ALL ^ E_NOTICE);

3 error_reporting()函数

3.1 定义和用法

3.2 error_reporting()中常用的几种写法

  • error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING): 这种方式代表报告除了E_NOTICE, E_WARNING 之外的所有错误
  • error_reporting(E_WARNING | E_ERROR): 这种方式代表只报告E_ERRORE_WARNING 这两个级别的错误
  • error_reporting(E_ALL & ~E_NOTICE) : 同^ 代表报告除了E_NOTICE之外的所有错误

3.3 PHP中的日志级别

常量说明备注(版本要求)
1E_ERROR致命的运行时错误。这类错误一般是不可恢复的情况,例如内存分配导致的问题。后果是导致脚本终止不再继续运行。
2E_WARNING运行时警告 (非致命错误)。仅给出提示信息,但是脚本不会终止运行。
4E_PARSE编译时语法解析错误。解析错误仅仅由分析器产生。
8E_NOTICE运行时通知。表示脚本遇到可能会表现为错误的情况,但是在可以正常运行的脚本里面也可能会有类似的通知。
16E_CORE_ERROR在PHP初始化启动过程中发生的致命错误。该错误类似 E_ERROR,但是是由PHP引擎核心产生的。since PHP 4
32E_CORE_WARNINGPHP初始化启动过程中发生的警告 (非致命错误) 。类似 E_WARNING,但是是由PHP引擎核心产生的。since PHP 4
64E_COMPILE_ERROR致命编译时错误。类似E_ERROR, 但是是由Zend脚本引擎产生的。since PHP 4
128E_COMPILE_WARNING编译时警告 (非致命错误)。类似 E_WARNING,但是是由Zend脚本引擎产生的。since PHP 4
256E_USER_ERROR用户产生的错误信息。类似 E_ERROR, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。since PHP 4
512E_USER_WARNING用户产生的警告信息。类似 E_WARNING, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。since PHP 4
1024E_USER_NOTICE用户产生的通知信息。类似 E_NOTICE, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。since PHP 4
2048E_STRICT启用 PHP 对代码的修改建议,以确保代码具有最佳的互操作性和向前兼容性。since PHP 5
4096E_RECOVERABLE_ERROR可被捕捉的致命错误。 它表示发生了一个可能非常危险的错误,但是还没有导致PHP引擎处于不稳定的状态。 如果该错误没有被用户自定义句柄捕获 (参见set_error_handler(),将成为一个 E_ERROR 从而脚本会终止运行。 since PHP 5.2.0
8192E_DEPRECATED运行时通知。启用后将会对在未来版本中可能无法正常工作的代码给出警告。since PHP 5.3.0
16384E_USER_DEPRECATED用户产少的警告信息。 类似 E_DEPRECATED, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的since PHP 5.3.0
32767E_ALLE_STRICT出外的所有错误和警告信息。32767 in PHP 5.4.x, 30719 in PHP 5.3.x, 6143 in PHP 5.2.x, 2047 previously

3.4 关于 E_ALL 和 E_STRICT

在上面的表格中可以看到 , 在php5.3及以下的版本中, E_ALL的值都是30719, 这是因为php5.3E_ALL并不包含E_STRICT级别的错误, 但是在php5.4之中, E_ALL已经默认将E_STRICT包含进去了

如下代码, 在php5.3中运行没有问题, 但是在php5.4中就会报错

ini_set("display_errors", true);
error_reporting(E_ALL);
class a {
    public function test() {
        echo 1111;
    }
}
a::test();

上面的代码, 如果在php5.3中运行,那么没有问题,如果在php5.4及以上的版本中运行, 将会报出下面的错误

Strict standards: Non-static method a::test() should not be called statically in ....

所以在一些低版本的php代码中 会见到 error_reporting(E_ALL | E_STRICT) 这种写法

3.5 PHP中错误级别原理

php的错误级别本质上是采用位图法来存储的, 使用二进制的每一个位代表一种状态, 比如1个字节有8个bit,通过对这8个big的每一个位区分01, 可以代表8种状态。回到php,我们来拆解一下php的error方式,看下面的图片↓↓↓

我们修改errorlevel的值,也就是修改对应位的状态。

3.5.1 或运算方式 |, 使不同的错误级别累加

或运算的规则为 一方为1, 结果为1,两者都为0, 结果才为0

这里我们设置只开启 E_ERRORE_NOTICE 这两个级别的错误

ini_set("display_errors", true);
$errorLevel = E_ERROR | E_NOTICE;
error_reporting($errorLevel);
// 打印下 $errorLevle 的值
echo $errorLevel; // 9

上面的代码, 我们设置的错误级别值为9, php将只报出E_ERRORE_NOTICE这两个级别的错误, 其他的都会屏蔽, 那么php内部是通过怎样的机制实现的呢, 一起来看一下

/**
    E_ERROR的值  = 1; 对应的二进制为 0000 0001
    E_NOTICE的值 = 8; 对应的二进制为 0000 1000
         当这两个值进行按位或运算之后 ---------
                            结果为  0000 1001
                            转化为10进制对应的数字就是9

    在php内部, 判断是否是对应的错误级别, 只需要使用 [对应的错误级别] & [设置的错误级别]
    下面我们假设php在运行中出现了一个NOTICE级别的错误,判断是否开启了该错误级别
*/
    if (E_NOTICE & $errorLevel) {
        // 开启了 NOTICE级别, 处理错误
    }
/**
    上面的代码中, 只要使用 按位&, 就可以判断
    E_NOTICE    的值 = 8; 对应的二进制为 0000 1000
    $errorLevel 的值 = 9; 对应的二进制为 0000 1001
                                       ---------
                      运算之后的结果为8  0000 1000

    那如果使用 E_WARNING 来判断呢, 请看下面
    E_WARNING   的值 = 2; 对应的二进制为 0000 0010
    $errorLevel 的值 = 9; 对应的二进制为 0000 1001
                                       ---------
                      运算之后的结果为0  0000 0000
    可以看到, 结果为0,不匹配当前错误级别

通过上面的说明以及上面的图片, 可以发现本质上就是修改对应的位的状态, 使用的时候通过判断该位的状态来进行不同的操作

3.5.2 ^ 异或方式 排除某一个状态

偷懒一下, 少写一点,可以参考 或运算,本质上是一样的

异或的规则是: 相同为0, 不同为1

// 使用 E_ALL, 并且排除 E_NOTICE 以及 E_WARNING, 可以这样写
$errorLevel = E_ALL ^ E_NOTICE ^ E_WARNING;
error_reporting($errorLevel);
/** 
    他们的运算过程是怎么样的呢, 来看一下
    E_ALL    的值 = 32767; 对应的二进制为 1111 1111 1111 1111
    E_NOTICE 的值 = 8;     对应的二进制为 0000 0000 0000 1000
                                        -------------------
                                 结果是  1111 1111 1111 0111

    看上面的结果, 是不是发现就是把8对应的二进制位的状态变成0了,其他的位状态都没有变, 
    所以就相当于排除了8也就是E_NOTICE, 下面用这个结果再与 E_WARNING 异或

    上一步的结果为                       1111 1111 1111 1111
    E_WARNING 的值 = 2;                 0000 0000 0000 0010
                                        -------------------
                                 结果是 1111 1111 1111 0101

    可以看到, 把E_WARNING对应的状态也置为0

3.5.3 先取反 ~再 与 &

结果为 异或, 这里不再多说

Reference

  • https://stackoverflow.com/questions/7115852/notice-undefined-index-zzzzzzwtf
  • https://www.runoob.com/php/func-error-reporting.html
  • https://www.php.net/manual/en/function.error-reporting.php
  • https://www.xstnet.com/article-148.html

写在最后

举报

相关推荐

Duplicate Number(翻译)

0 条评论