Jun 4

[原]PHP的警告信息对Ajax页面的影响 晴

linuxing , 23:36 , 编程 » Php , 评论(0) , 引用(0) , 阅读(19440) , Via 本站原创 | |
    今天,把程序部署到红旗Linux平台上,遇到一个问题:原来在Windows XAMPP环境中好好的一个用Ajax提交请求的页面,在Linux下失效了。经查看后台日志,发现如下的Notice信息:
引用
PHP Notice:  Use of undefined constant action - assumed 'action' in /var/www/html/phpcrm/inc/xml_projects.php on line 13
PHP Notice:  Use of undefined constant child - assumed 'child' in /var/www/html/phpcrm/inc/xml_projects.php on line 13

问题也正是出在这里。

一、问题描述
在我的Web页面中,是通过jQuery的.post()方法往后台的PHP服务端脚本提交了一个查询,查询结果以XML格式的字符串返回到Web页面,并通过.post()方法的回调函数进行分析和调用,类似这样:

$.post(xmlPost,queryObj,function(data) {
  var rowNodes = $(data).find('row');
  if ( rowNodes.length > 0 ) {
    rowNodes.each(function(i) {
    ......
    }
  }
}

但是,现在后台没有返回信息。Apache的日志显示:
引用
PHP Notice:  Use of undefined constant action - assumed 'action' in /var/www/html/phpcrm/inc/xml_projects.php on line 13
PHP Notice:  Use of undefined constant child - assumed 'child' in /var/www/html/phpcrm/inc/xml_projects.php on line 13
"POST /inc/xmlpost.php HTTP/1.1" 200 6477

可见,POST请求确实已经发送成功,但出现PHP的Notice警告:“使用了没有定义的常量!”。
这确实比较奇怪,因为对应的13行代码是:

switch (${action}.'_'.${child}) {

这段代码是写得不好,但当时怎么看都没发现问题。而且Windows XAMPP环境中是正常的,故怀疑与PHP的配置php.ini 有关。
※ 实际上,后来再分析,这段代码确实也是有问题的,留待下一篇日志中说明。

二、问题分析
1、参考
从Google得知,该警告信息大多出现在数组的引用上,当引用数组的元素时,没有用单引号区分元素。可参考这里。例如:

$username = $_POST[username];

应该写为:

$username = $_POST['username'];

这情况与我的不同,但按道理只是警告,不应该影响程序的运行。

2、分析
但是,对于当前的Ajax应用来说,后台PHP是以字符串的形式返回XML数据的:

echo $db->db_xml_result($query);

这是我定义的一个对象方法,正常情况,将会输出一个XML格式的字符串:
引用
<?xml version="1.0" encoding="utf-8"?><rows><numbers>1</numbers><row><companyid>10</companyid></row></rows>

前台.post()的回调函数收到该数据后,会对其进行分析。
可是,如果若出现PHP警告信息,并且php.ini 中设置为显示在前台Web页面上,那么,PHP输出的结果将变为类似:
引用
PHP Notice:  Use of undefined constant action - assumed 'action' in /var/www/html/phpcrm/inc/xml_projects.php on line 13
<?xml version="1.0" encoding="utf-8"?><rows><numbers>1</numbers><row><companyid>10</companyid></row></rows>

由于首行没有定义为xml 格式,因此,.post()的回调函数无法对其处理。

三、解决问题
知道原因,问题就容易解决了。方法至少有两个:
1、PHP的错误信息不输出到前台
也就是,修改/etc/php.ini 中的display_errors为:
引用
display_errors = Off

2、不显示PHP的Notice警告
同样的,修改/etc/php.ini 中的error_reporting为:
引用
error_reporting = E_ALL & ~E_NOTICE

此时,可保留display_errors = On,择其一即可,这也是Windows XAMPP环境中PHP的配置情况,所以,该环境中没有发现问题。
※ 修改php.ini后,必须重启Apache服务才能生效。

四、补充
由上可见,这里的解决办法仅是屏蔽了警告信息,并没有彻底解决问题。完美的方法,应该是把PHP代码中的语句修改为:

switch ("${action}_${child}") {

或者

switch ($action.'_'.$child) {

这样,即使不修改php.ini,也不会再有Notice警告信息了。原因嘛,与PHP对变量使用大括号的定义有关,留待后续说明。
Tags: , ,
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]