1 Notice: Undefined index: ZZZZZZWTF? [duplicate]
再运行PHP脚本的时候,明明脚本语法什么的都没有问题,但是却有如下的提示信息:
1 | Notice: Undefined index: submit in C:\xampp\htdocs\globalautoparts\register.php on line 36 |
遇到这种情况,应该如何解决。
2 解决
修改PHP的日志提示等级,忽略这些提示信息即可。再脚本最上面添加如下语句,然后问题解决。
1 | error_reporting(E_ALL ^ E_NOTICE); |
3 error_reporting()函数
3.1 定义和用法
error_reporting() 函数规定报告哪个错误。
该函数设置当前脚本的错误报告级别。
该函数返回旧的错误报告级别。
3.2 error_reporting()中常用的几种写法
error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING)
: 这种方式代表报告除了E_NOTICE
,E_WARNING
之外的所有错误error_reporting(E_WARNING | E_ERROR)
: 这种方式代表只报告E_ERROR
和E_WARNING
这两个级别的错误error_reporting(E_ALL & ~E_NOTICE)
: 同^
代表报告除了E_NOTICE
之外的所有错误
3.3 PHP中的日志级别
值 | 常量 | 说明 | 备注(版本要求) |
---|---|---|---|
1 | E_ERROR | 致命的运行时错误。这类错误一般是不可恢复的情况,例如内存分配导致的问题。后果是导致脚本终止不再继续运行。 | |
2 | E_WARNING | 运行时警告 (非致命错误)。仅给出提示信息,但是脚本不会终止运行。 | |
4 | E_PARSE | 编译时语法解析错误。解析错误仅仅由分析器产生。 | |
8 | E_NOTICE | 运行时通知。表示脚本遇到可能会表现为错误的情况,但是在可以正常运行的脚本里面也可能会有类似的通知。 | |
16 | E_CORE_ERROR | 在PHP初始化启动过程中发生的致命错误。该错误类似 E_ERROR,但是是由PHP引擎核心产生的。 | since PHP 4 |
32 | E_CORE_WARNING | PHP初始化启动过程中发生的警告 (非致命错误) 。类似 E_WARNING,但是是由PHP引擎核心产生的。 | since PHP 4 |
64 | E_COMPILE_ERROR | 致命编译时错误。类似E_ERROR, 但是是由Zend脚本引擎产生的。 | since PHP 4 |
128 | E_COMPILE_WARNING | 编译时警告 (非致命错误)。类似 E_WARNING,但是是由Zend脚本引擎产生的。 | since PHP 4 |
256 | E_USER_ERROR | 用户产生的错误信息。类似 E_ERROR, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。 | since PHP 4 |
512 | E_USER_WARNING | 用户产生的警告信息。类似 E_WARNING, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。 | since PHP 4 |
1024 | E_USER_NOTICE | 用户产生的通知信息。类似 E_NOTICE, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。 | since PHP 4 |
2048 | E_STRICT | 启用 PHP 对代码的修改建议,以确保代码具有最佳的互操作性和向前兼容性。 | since PHP 5 |
4096 | E_RECOVERABLE_ERROR | 可被捕捉的致命错误。 它表示发生了一个可能非常危险的错误,但是还没有导致PHP引擎处于不稳定的状态。 如果该错误没有被用户自定义句柄捕获 (参见 | set_error_handler() ,将成为一个 E_ERROR 从而脚本会终止运行。 since PHP 5.2.0 |
8192 | E_DEPRECATED | 运行时通知。启用后将会对在未来版本中可能无法正常工作的代码给出警告。 | since PHP 5.3.0 |
16384 | E_USER_DEPRECATED | 用户产少的警告信息。 类似 E_DEPRECATED, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的 | since PHP 5.3.0 |
32767 | E_ALL | E_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.3
的 E_ALL
并不包含E_STRICT
级别的错误, 但是在php5.4
之中, E_ALL
已经默认将E_STRICT
包含进去了
这是因为PHP版本的升级过程,E_STRICT是一个严格模式,比如大家都知道类中的静态方法按理应该只能静态调用、非静态方法则需要实例化类后调用,但PHP也支持用::静态方式调用一个非静态方法,不过此时如果开启了严格模式E_STRICT;则会导致一个E_STRICT级别的错误
如下代码, 在php5.3
中运行没有问题, 但是在php5.4
中就会报错
1 | ini_set("display_errors", true); |
上面的代码, 如果在php5.3
中运行,那么没有问题,如果在php5.4
及以上的版本中运行, 将会报出下面的错误
1 | 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_ERROR
和 E_NOTICE
这两个级别的错误
1 | ini_set("display_errors", true); |
上面的代码, 我们设置的错误级别值为9, php将只报出E_ERROR
和 E_NOTICE
这两个级别的错误, 其他的都会屏蔽, 那么php内部是通过怎样的机制实现的呢, 一起来看一下
1 | /** |
通过上面的说明以及上面的图片, 可以发现本质上就是修改对应的位的状态, 使用的时候通过判断该位的状态来进行不同的操作
3.5.2 ^
异或方式 排除某一个状态
偷懒一下, 少写一点,可以参考 或运算,本质上是一样的
异或的规则是: 相同为0, 不同为1
1 | // 使用 E_ALL, 并且排除 E_NOTICE 以及 E_WARNING, 可以这样写 |
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
写在最后
欢迎大家关注鄙人的公众号【麦田里的守望者zhg】,让我们一起成长,谢谢。