最新在做一个PHP项目米扑代理: https://proxy.mimvp.com

线上服务器运行正常,被同事拿到本机测试的时候总是出现“Notice: Undefined index:”这样的警告,这只是一个因为PHP版本不同而产生的警告(NOTICE或者WARNING),而非错误(ERROR)。

PHP Notice:  Undefined index: 3_desc in /home/homer/workspace/proxy_client/usercenter/orderdetail.php on line 352

PHP中的变量在不声明的情况下使用的时候,PHP4运行正常,但是到了PHP5环境下就会出现上述的警告或者提示。

经过搜索查询,总结以下几种解决Notice: Undefined index的方法。

 

0. PHP 错误参数

如果参数 level 未指定,当前报错级别将被返回。下面几项是 level 可能的值:

值   常量        描述

1 E_ERROR 致命的运行错误。错误无法恢复,暂停执行脚本。

2 E_WARNING 运行时警告(非致命性错误)。非致命的运行错误,脚本执行不会停止。

4 E_PARSE 编译时解析错误。解析错误只由分析器产生。

8 E_NOTICE 运行时提醒(这些经常是你代码中的bug引起的,也可能是有意的行为造成的。)

16 E_CORE_ERROR PHP启动时初始化过程中的致命错误。

32 E_CORE_WARNING PHP启动时初始化过程中的警告(非致命性错)。

64 E_COMPILE_ERROR 编译时致命性错。这就像由Zend脚本引擎生成了一个E_ERROR。

128 E_COMPILE_WARNING 编译时警告(非致命性错)。这就像由Zend脚本引擎生成了一个E_WARNING警告。

256 E_USER_ERROR 用户自定义的错误消息。这就像由使用PHP函数trigger_error(程序员设置E_ERROR)

512 E_USER_WARNING 用户自定义的警告消息。这就像由使用PHP函数trigger_error(程序员设定的一个E_WARNING警告)

1024 E_USER_NOTICE 用户自定义的提醒消息。这就像一个由使用PHP函数trigger_error(程序员一个E_NOTICE集)

2048 E_STRICT 编码标准化警告。允许PHP建议如何修改代码以确保最佳的互操作性向前兼容性。

4096 E_RECOVERABLE_ERROR 开捕致命错误。这就像一个E_ERROR,但可以通过用户定义的处理捕获(又见set_error_handler())

8191 E_ALL 所有的错误和警告(不包括 E_STRICT, 在 php 6.0+版本中才包含) (E_STRICT will be part of E_ALL as of PHP 6.0)

示例:

<?php
	// 禁用错误报告
	error_reporting(0);
	 
	// 报告运行时错误
	error_reporting(E_ERROR | E_WARNING | E_PARSE);
	 
	// 报告所有错误
	error_reporting(E_ALL);
?>

 

PHP 官网示例:error_reporting

<?php
// 关闭所有PHP错误报告
error_reporting(0);
 
// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);
 
// 报告 E_NOTICE也挺好 (报告未初始化的变量或者捕获变量名的错误拼写)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
 
// 除了 E_NOTICE,报告其他所有错误
error_reporting(E_ALL ^ E_NOTICE);
 
// 报告所有 PHP 错误 (参见 changelog)
error_reporting(E_ALL);
 
// 报告所有 PHP 错误
error_reporting(-1);
 
// 和 error_reporting(E_ALL); 一样
ini_set('error_reporting', E_ALL);
?>

 

1. 修改 php.ini 文件中 已验证,OK

这样当程序中存在NOTICE或WARNING的不足之处时,提示都将会被忽略。

当然这对于新手来说并不合适,不仅不方便调试程序,而且不利于养成好的代码习惯。

sudo vim /usr/local/php5/lib/php.ini

error_reporting = E_ALL                                 // 显示所有错误(线下开发环境的推荐,方便调试,发现错误

error_reporting = E_ALL & ~E_NOTICE
      // 显示除提示(E_NOTICE)以外的所有错误,即显示警告WARNING、错误提示ERROR等等级的日志

error_reporting = E_ALL & ~E_WARNING & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT      // 显示除警告、提示、过期、脚本错误等提示,即只显示错误提示(线上生产环境

 

php.ini 配置文件,还有一种全局关闭错误提示的方案:

sudo vim /usr/local/php5/lib/php.ini

将 display_errors = On 修改  display_errors = Off,这将全局关闭错误提示

若设置后出错,请修改 php-fpm.conf

vim /usr/local/php/etc/php-fpm.conf

php_flag[display_errors] = off
php_admin_flag[log_errors] = on

打开php-fpm.conf,找到:

<value name="php_defines"></value>
<value name="sendmail_path">/usr/sbin/sendmail -t -i</value>
<value name="display_errors">0</value>

将其中的值从1改为0,就可以了

 

2. 使用代码,在每个文件头添加一行 error_reporting(0);   已验证,OK

error_reporting(0);

PHP 错误报告参数详解:

error_reporting(0);    // 禁用错误报告  
error_reporting(E_ALL ^ E_NOTICE);  // 显示除去 E_NOTICE 之外的所有错误信息  
error_reporting(E_ALL^E_WARNING^E_NOTICE);  // 显示除去E_WARNING E_NOTICE 之外的所有错误信息  
error_reporting(E_ERROR | E_WARNING | E_PARSE);  // 显示运行时错误,与error_reporting(E_ALL ^ E_NOTICE);效果相同。  
error_reporting(E_ALL);  // 显示所有错误 

 

3. 初始化变量

对变量进行初始化,规范书写;

$mimvp = "https://mimvp.com"

但是如果有大量的变量,则会比较烦琐。

 

4. 使用@抑制错误 已验证,OK

''@''的作用是表示这行如果有错误或是警告,不要输出提示

@$name = $_GET['name'];

 

5. 初始化 + 赋值前判断已验证,OK

$name = "";
if( !empty($_GET['name']) ) {
      $name = $_GET['name'];
}

// 或者

$name = "";
if( isset($_GET['name']) ) {
      $name = $_GET['name'];
}

 

以上解决方案中,推荐第4和第5两种搭配使用

第1种全局配置,将会屏蔽所有的提示,不利于新手和发现潜在的错误,但线上生产环境可推荐,不暴露错误给用户和老板哈。

 

 

错误日志用于调试

在用php做网站开发的时候 , 为防止用户看到错误信息,而出现的不友好界面。

一般会关闭报错,在php.ini里设置:display_errors = Off

不过在开发的时候,我们有时候需要打开错误信息。这时候,可以在php文件里设置:

ini_set("display_errors","On");

error_reporting(E_ALL);

有时候我们这样设置了  还是无法显示php里的语法错误。

这是由于php文件的语法错误导致该文件根本没有被执行,所以当然不会显示错误信息

解决方法:

假设这个php里有语法错误,你可以新建一个test.php,然后在 test.php里如下编辑:

ini_set("display_errors","On");

error_reporting(E_ALL);

include("目标文件");

这样,当你在运行test.php的时候  程序就会报其中的错误语法.

 

error_reporting("E_ALL") 和 ini_set("display_errors", "On")的区别?

后者 ini_set("display_errors", "On") 的权限大于前者,后者是OFF的话,前者就算是E_ALL也没用。

因此,在 php 文件里,最好设置为

ini_set("display_errors","On");

error_reporting(E_ALL);   或  error_reporting(E_ALL & ~E_NOTICE);   

 

注:实测这么写是不对的: 

ini_set("error_reporting","E_ALL");

ini_set("error_reporting","E_ALL & ~E_NOTICE");

正确写法应该是:

error_reporting(E_ALL);   

error_reporting(E_ALL & ~E_NOTICE); 

 

 

参考推荐

PHP 数组提示Notice: Undefined offset解决办法

PHP 常见错误处理

PHP在 linux上执行外部命令

PHP 获取网页标题(title)、描述(description)、关键字(keywords)等meta信息

PHP + Selenium + WebDriver 抓取米扑科技首页

PHP 文件操作常用函数

PHP 常用函数总结(数组,字符串,时间,文件操作)

PHP 路径详解 dirname,realpath,__FILE__,getcwd

PHP 下载保存文件到本地

PHP下载远程图片

PHP抓取网站ico图标

PHP 文件导入 require, require_once, include, include_once 区别