今天,把程序部署到红旗Linux平台上,遇到一个问题:原来在Windows XAMPP环境中好好的一个用Ajax提交请求的页面,在Linux下失效了。经查看后台日志,发现如下的Notice信息:
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()方法的回调函数进行分析和调用,类似这样:
var rowNodes = $(data).find('row');
if ( rowNodes.length > 0 ) {
rowNodes.each(function(i) {
……
}
}
}
但是,现在后台没有返回信息。Apache的日志显示:
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行代码是:
这段代码是写得不好,但当时怎么看都没发现问题。而且Windows XAMPP环境中是正常的,故怀疑与PHP的配置php.ini 有关。
※ 实际上,后来再分析,这段代码确实也是有问题的,留待下一篇日志中说明。
二、问题分析
1、参考
从Google得知,该警告信息大多出现在数组的引用上,当引用数组的元素时,没有用单引号区分元素。可参考这里。例如:
应该写为:
这情况与我的不同,但按道理只是警告,不应该影响程序的运行。
2、分析
但是,对于当前的Ajax应用来说,后台PHP是以字符串的形式返回XML数据的:
这是我定义的一个对象方法,正常情况,将会输出一个XML格式的字符串:
前台.post()的回调函数收到该数据后,会对其进行分析。
可是,如果若出现PHP警告信息,并且php.ini 中设置为显示在前台Web页面上,那么,PHP输出的结果将变为类似:
<?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为:
2、不显示PHP的Notice警告
同样的,修改/etc/php.ini 中的error_reporting为:
此时,可保留display_errors = On,择其一即可,这也是Windows XAMPP环境中PHP的配置情况,所以,该环境中没有发现问题。
※ 修改php.ini后,必须重启Apache服务才能生效。
四、补充
由上可见,这里的解决办法仅是屏蔽了警告信息,并没有彻底解决问题。完美的方法,应该是把PHP代码中的语句修改为:
或者
这样,即使不修改php.ini,也不会再有Notice警告信息了。原因嘛,与PHP对变量使用大括号的定义有关,留待后续说明。
PHP设计模式——策略模式
PHP设计模式——命令模式
PHP设计模式——观察者模式
PHP设计模式——单元素模式
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/104522.html