ThinkPHP parseXmlAttrs 函数BUG

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();
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值