`
tw198611
  • 浏览: 18249 次
  • 性别: 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核心功能的重要参考资料。为了帮助读者更好地理解和掌握...

    ThinkPHP5.0的助手函数汇总

    ThinkPHP5.0的助手函数汇总,url:Url生成 1. /** 2. * Url生成 3. * @param string $url 路由地址 4. * @param string|array $vars 变量 5. * @param bool|string $suffix 生成的URL后缀 6. * @param bool|string $...

    腾讯云-云函数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社区的函数详解文章,方便大家离线状态下学习!

    thinkphp单字母函数

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

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

    模板变量的函数调用格式:{$varname|function1|function2=arg1,arg2,### } 说明: { 和 $ 符号之间不能有空格,后面参数的空格就没有问题; ###表示模板变量本身的参数位置 ; 支持多个函数,函数之间支持空格 ;...

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

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

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

    主要介绍了thinkPHP简单调用函数与类库的方法,简单讲述了thinkPHP公共函数库的文件位置并结合实例分析了类库的调用方法,需要的朋友可以参考下

    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。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

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

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

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

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

    ThinkPHP_v5.0.7.zip_ThinkPHP V5.0.7_thinkphp

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

    ThinkPHP中公共函数路径和配置项路径的映射分析

    主要介绍了ThinkPHP中公共函数路径和配置项路径的映射,较为通俗的分析了ThinkPHP中公共函数路径和配置项路径的映射关系与对应修改位置,有助于更好的理解ThinkPHP底层代码原理,需要的朋友可以参考下

    thinkphp_thinkphp_thinkphp5_

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

Global site tag (gtag.js) - Google Analytics