最新在做一个PHP项目米扑代理: http://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) (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);
?>

 

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

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

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

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

error_reporting = E_ALL                                 // 显示所有错误(线下开发环境

error_reporting = E_ALL & ~E_NOTICE
      // 显示除提示的所有错误,即显示警告、错误提示等

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 = "http://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种全局配置,将会屏蔽所有的提示,不利于新手和发现潜在的错误,但线上生产环境可推荐。