ThinkPHP的模板解析函数parseXmlAttrs在阿里云服务器上偶尔会出现BUG。
具体原因是$xml = (array)($xml->tag->attributes());
这一句转换类型失败,导致模板解析返回空。基本上20次会出现一次失败。
解决方案
需要修改TP的两个文件:
1:ThinkPHP/Library/Think/Template/TagLib.class.php 85行
2:ThinkPHP/Library/Think/Template.class.php 274行
修改方法:
通过循环的方式来解析XML
将
$xml = (array)($xml->tag->attributes());
改为
foreach($xml->tag->attributes() as $key=>$value){
$xml_to_list[(string)$key] = (string)$value;
}
修改后的parseXmlAttrs
private function parseXmlAttrs($attrs) {
$xml = '<tpl><tag '.$attrs.' /></tpl>';
$xml = simplexml_load_string($xml);
if(!$xml)
E(L('_XML_TAG_ERROR_'));
// $xml = (array)($xml->tag->attributes());
foreach($xml->tag->attributes() as $key=>$value){
$xml_to_list[(string)$key] = (string)$value;
}
$array = array_change_key_case($xml_to_list);
return $array;
}
public function parseXmlAttr($attr,$tag) {
//XML解析安全过滤
$attr = str_replace('&','___', $attr);
$xml = '<tpl><tag '.$attr.' /></tpl>';
$xml = simplexml_load_string($xml);
if(!$xml) {
E(L('_XML_TAG_ERROR_').' : '.$attr);
}
// $xml = (array)($xml->tag->attributes());
foreach($xml->tag->attributes() as $key=>$value){
$xml_to_list[(string)$key] = (string)$value;
}
if(isset($xml_to_list)){
$array = array_change_key_case($xml_to_list);
if($array) {
$tag = strtolower($tag);
if(!isset($this->tags[$tag])){
// 检测是否存在别名定义
foreach($this->tags as $key=>$val){
if(isset($val['alias']) && in_array($tag,explode(',',$val['alias']))){
$item = $val;
break;
}
}
}else{
$item = $this->tags[$tag];
}
$attrs = explode(',',$item['attr']);
if(isset($item['must'])){
$must = explode(',',$item['must']);
}else{
$must = array();
}
foreach($attrs as $name) {
if( isset($array[$name])) {
$array[$name] = str_replace('___','&',$array[$name]);
}elseif(false !== array_search($name,$must)){
E(L('_PARAM_ERROR_').':'.$name);
}
}
return $array;
}
}else{
return array();
}
}
分享到:
相关推荐
《ThinkPHP5函数详解系列》是一份专为ThinkPHP5框架初学者准备的详细学习资料。这个CHM类型的文件包含了丰富的函数用法和实践指导,是深入理解ThinkPHP5核心功能的重要参考资料。为了帮助读者更好地理解和掌握...
"serverless-thinkphp6.0专用的入口文件.zip"是一个包含关键组件的压缩包,用于在腾讯云函数平台上部署基于ThinkPHP6.0的应用。解压后,您会发现两个核心文件:`index.php`和`serverless.yml`。`index.php`是...
ThinkPHP函数详解 ThinkPHP函数详解 ThinkPHP函数详解
本文实例讲述了ThinkPHP自定义函数解决模板标签加减运算的方法。分享给大家供大家参考。具体如下: 实际项目中,我们经常需要标签变量加减运算的操作。但是,在ThinkPHP中,并不支持模板变量直接运算的操作。 幸运的...
ThinkPHP 是一个流行的 PHP 开发框架,其内置了一系列便捷的函数,便于开发者高效地构建Web应用。以下是对这些函数的详细解释: 1. **A 函数**:此函数用于实例化控制器。它允许你根据指定的模块和控制器名称创建一...
在ThinkPHP框架中,模板引擎提供了使用自定义函数的功能,这极大地增强了模板文件的灵活性和功能性。下面将详细讲解如何在ThinkPHP模板中使用自定义函数。 首先,自定义函数必须放置在项目应用目录下的`common`...
thinkphp单字母函数功能及用法总结PPT资料,(C U I A D M T E G S F )推荐下载
在 ThinkPHP 中,函数和类库的调用是开发中的常见需求,以下是对ThinkPHP简单调用函数与类库方法的详细说明。 ### 函数调用 ThinkPHP 的函数调用非常简单。通常,我们可以直接通过 `F()` 函数来调用系统内置的函数...
本文汇总了ThinkPHP的字符串处理函数及其他一些常用函数,可供开发人员参考使用。详情如下: get_client_ip() 获取客户端的IP地址 msubstr($str, $start=0, $length, $charset=”utf-8″, $suffix=true) $str:要...
《ThinkPHP请求函数远程代码执行漏洞详解》 在2019年1月11日,ThinkPHP框架被曝出存在一个严重的远程代码执行(RCE)漏洞,该漏洞主要涉及ThinkPHP 5.0.*版本。这个漏洞的根源在于框架处理HTTP请求方法的方式,特别...
在ThinkPHP中,字母函数是一组简短的封装,用于简化代码编写和提高开发效率。本文将对以下字母函数进行详细解析:T、I、N、D、M、A、R、U。 1. T(模板资源定位) - T函数用于获取模板文件路径,支持模块、主题、...
在ThinkPHP框架中,构造函数承担着类初始化的重要职责,它在对象创建时自动执行,以确保对象在使用前处于正确的状态。在PHP原生中,构造函数的标准名称为`__construct()`,而在ThinkPHP框架中,除了标准的构造函数外...
《深入理解ThinkPHP V5.0.7框架》 ThinkPHP,作为一个广受开发者欢迎的开源PHP框架,其V5.0.7版本是其发展过程中一个重要里程碑。这个版本不仅继承了ThinkPHP一贯的轻量级和面向对象设计原则,还引入了诸多新特性和...
在ThinkPHP手册中,你可以找到关于如何快速搭建项目结构、创建控制器、定义模型、操作数据库以及使用各种助手函数的详细说明。 Smart模板引擎,另一方面,是一个轻量级的PHP模板系统,它的设计目标是使开发者能够...
* 构造函数 * @access public * @param array $config 数据库配置数组 */ public function __construct($config) { $this->config = $config; } /** * 连接数据库方法 * @access public * @return PDO ...
【标题】"thinkphp+mysql中英文伪静态企业网站、完整无BUG源码"涉及到的主要技术包括ThinkPHP框架、MySQL数据库以及伪静态技术,这些在构建一个高效、稳定且易于SEO优化的企业级网站中扮演着关键角色。 ThinkPHP是...
本压缩包“thinkphp_thinkphp_thinkphp5_”包含了一个基于ThinkPHP5的模板开发实例,旨在帮助开发者快速理解和运用ThinkPHP5框架进行项目开发。 首先,我们要理解ThinkPHP5的核心设计理念——“简洁、快速、优雅”...
计算机后端-PHP视频教程. php之thinkphp85 C函数.wmv