PHP 出现 Notice: Undefined index: 的几种解决方法
最新在做一个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 获取网页标题(title)、描述(description)、关键字(keywords)等meta信息
PHP + Selenium + WebDriver 抓取米扑科技首页
PHP 路径详解 dirname,realpath,__FILE__,getcwd
PHP 文件导入 require, require_once, include, include_once 区别
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2019-12-20 16:25:37
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!