`
tw198611
  • 浏览: 18574 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

ThinkPHP parseXmlAttrs 函数BUG

    博客分类:
  • php
阅读更多
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函数详解系列》是一份专为ThinkPHP5框架初学者准备的详细学习资料。这个CHM类型的文件包含了丰富的函数用法和实践指导,是深入理解ThinkPHP5核心功能的重要参考资料。为了帮助读者更好地理解和掌握...

    腾讯云-云函数serverless-thinkphp6.0专用的入口文件.zip

    "serverless-thinkphp6.0专用的入口文件.zip"是一个包含关键组件的压缩包,用于在腾讯云函数平台上部署基于ThinkPHP6.0的应用。解压后,您会发现两个核心文件:`index.php`和`serverless.yml`。`index.php`是...

    ThinkPHP函数详解

    ThinkPHP函数详解 ThinkPHP函数详解 ThinkPHP函数详解

    ThinkPHP自定义函数解决模板标签加减运算的方法

    本文实例讲述了ThinkPHP自定义函数解决模板标签加减运算的方法。分享给大家供大家参考。具体如下: 实际项目中,我们经常需要标签变量加减运算的操作。但是,在ThinkPHP中,并不支持模板变量直接运算的操作。 幸运的...

    ThinkPHP函数详解总结

    ThinkPHP 是一个流行的 PHP 开发框架,其内置了一系列便捷的函数,便于开发者高效地构建Web应用。以下是对这些函数的详细解释: 1. **A 函数**:此函数用于实例化控制器。它允许你根据指定的模块和控制器名称创建一...

    Thinkphp模板中使用自定义函数的方法

    在ThinkPHP框架中,模板引擎提供了使用自定义函数的功能,这极大地增强了模板文件的灵活性和功能性。下面将详细讲解如何在ThinkPHP模板中使用自定义函数。 首先,自定义函数必须放置在项目应用目录下的`common`...

    thinkphp单字母函数

    thinkphp单字母函数功能及用法总结PPT资料,(C U I A D M T E G S F )推荐下载

    thinkPHP简单调用函数与类库的方法

    在 ThinkPHP 中,函数和类库的调用是开发中的常见需求,以下是对ThinkPHP简单调用函数与类库方法的详细说明。 ### 函数调用 ThinkPHP 的函数调用非常简单。通常,我们可以直接通过 `F()` 函数来调用系统内置的函数...

    ThinkPHP字符串函数及常用函数汇总

    本文汇总了ThinkPHP的字符串处理函数及其他一些常用函数,可供开发人员参考使用。详情如下: get_client_ip() 获取客户端的IP地址 msubstr($str, $start=0, $length, $charset=”utf-8″, $suffix=true) $str:要...

    ThinkPHP-request函数远程代码执行1

    《ThinkPHP请求函数远程代码执行漏洞详解》 在2019年1月11日,ThinkPHP框架被曝出存在一个严重的远程代码执行(RCE)漏洞,该漏洞主要涉及ThinkPHP 5.0.*版本。这个漏洞的根源在于框架处理HTTP请求方法的方式,特别...

    thinkphp 字母函数详解T/I/N/D/M/A/R/U

    在ThinkPHP中,字母函数是一组简短的封装,用于简化代码编写和提高开发效率。本文将对以下字母函数进行详细解析:T、I、N、D、M、A、R、U。 1. T(模板资源定位) - T函数用于获取模板文件路径,支持模块、主题、...

    ThinkPHP_v5.0.7.zip_ThinkPHP V5.0.7_thinkphp

    《深入理解ThinkPHP V5.0.7框架》 ThinkPHP,作为一个广受开发者欢迎的开源PHP框架,其V5.0.7版本是其发展过程中一个重要里程碑。这个版本不仅继承了ThinkPHP一贯的轻量级和面向对象设计原则,还引入了诸多新特性和...

    ThinkPHP中类的构造函数_construct()与_initialize()的区别详解

    在ThinkPHP框架中,构造函数承担着类初始化的重要职责,它在对象创建时自动执行,以确保对象在使用前处于正确的状态。在PHP原生中,构造函数的标准名称为`__construct()`,而在ThinkPHP框架中,除了标准的构造函数外...

    PHP开发帮助手册(含thinkPHP,smart引擎,函数等手册)

    在ThinkPHP手册中,你可以找到关于如何快速搭建项目结构、创建控制器、定义模型、操作数据库以及使用各种助手函数的详细说明。 Smart模板引擎,另一方面,是一个轻量级的PHP模板系统,它的设计目标是使开发者能够...

    thinkphp+pgsql

    * 构造函数 * @access public * @param array $config 数据库配置数组 */ public function __construct($config) { $this-&gt;config = $config; } /** * 连接数据库方法 * @access public * @return PDO ...

    thinkphp+mysql中英文伪静态企业网站、完整无BUG源码

    【标题】"thinkphp+mysql中英文伪静态企业网站、完整无BUG源码"涉及到的主要技术包括ThinkPHP框架、MySQL数据库以及伪静态技术,这些在构建一个高效、稳定且易于SEO优化的企业级网站中扮演着关键角色。 ThinkPHP是...

    thinkphp_thinkphp_thinkphp5_

    本压缩包“thinkphp_thinkphp_thinkphp5_”包含了一个基于ThinkPHP5的模板开发实例,旨在帮助开发者快速理解和运用ThinkPHP5框架进行项目开发。 首先,我们要理解ThinkPHP5的核心设计理念——“简洁、快速、优雅”...

    计算机后端-PHP视频教程. php之thinkphp85 C函数.wmv

    计算机后端-PHP视频教程. php之thinkphp85 C函数.wmv

Global site tag (gtag.js) - Google Analytics