欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

thinkphp的问题弄了半天了,还是不知道,各位大神帮忙看看吧

程序员文章站 2022-06-11 20:02:32
...
控制器中的代码:
public function testt(){
//$title="练习册";
//$content='
'.$_GET['name'];
//$this->assign('title',$title);
$User = M('name');
$list = $User->select();
$this->assign('list',$list);
$this->assign("title","SMARTY测试");
$this->display();
}
模板中的代码:
{$title}




{$vo.age}{$vo.name}


重要去掉foreach部分就正常,否则就会出显这样
syntax error, unexpected ')', expecting T_VARIABLE or '$' D:\AppServ\www\App\admin\Runtime\Cache\6e178638460c8ba2282739c247c2ce14.php 第 10 行.

cache文件中的代码为:





$): echo ($vo["age"]); echo ($vo["name"]); ?>


看来好久也没有头绪,怎么办啊?


回复讨论(解决方案)

list是空 你自己在检查下

list是为空,在控制器里面能查到数据,可是交给模板后,通过foreach标签函数处理后就变为空了。不知道哪里的错误???????????????????????????????????

public function _foreach($attr,$content) {        static $_iterateParseCache = array();        //如果已经解析过,则直接返回变量值        $cacheIterateId = md5($attr.$content);        if(isset($_iterateParseCache[$cacheIterateId]))            return $_iterateParseCache[$cacheIterateId];        $tag        =   $this->parseXmlAttr($attr,'foreach');        $name       =   $tag['name'];        $item       =   $tag['item'];        $key        =   !empty($tag['key'])?$tag['key']:'key';        $name       =   $this->autoBuildVar($name);        $parseStr   =   '$'.$item.'): ?>';        $parseStr  .=   $this->tpl->parse($content);        $parseStr  .=   '';        $_iterateParseCache[$cacheIterateId] = $parseStr;        if(!empty($parseStr)) {            return $parseStr;        }        return ;    }

稍微查了下解析foreach标签的源码,这个并不是list变量为空,其实是没取到标签里name和item的值,具体原因楼主可以自己去查源码排除下,当然最简单的解决办法就是改用volist标签。

你模板中的foreach应该写成{foreach name='' item=''}吧?

public function _foreach($attr,$content) {        static $_iterateParseCache = array();        //如果已经解析过,则直接返回变量值        $cacheIterateId = md5($attr.$content);        if(isset($_iterateParseCache[$cacheIterateId]))            return $_iterateParseCache[$cacheIterateId];        $tag        =   $this->parseXmlAttr($attr,'foreach');        $name       =   $tag['name'];        $item       =   $tag['item'];        $key        =   !empty($tag['key'])?$tag['key']:'key';        $name       =   $this->autoBuildVar($name);        $parseStr   =   '$'.$item.'): ?>';        $parseStr  .=   $this->tpl->parse($content);        $parseStr  .=   '';        $_iterateParseCache[$cacheIterateId] = $parseStr;        if(!empty($parseStr)) {            return $parseStr;        }        return ;    }

稍微查了下解析foreach标签的源码,这个并不是list变量为空,其实是没取到标签里name和item的值,具体原因楼主可以自己去查源码排除下,当然最简单的解决办法就是改用volist标签。

我看了是 $this->parseXmlAttr($attr,'foreach')执行后$tag没值??????????????

怎么办啊,我写的都是最简单的几句代码,
结果在源码里测就是parseXmlAttr函数里面出的问题。可是会是源码的问题么

怎么办啊,我写的都是最简单的几句代码,
结果在源码里测就是parseXmlAttr函数里面出的问题。可是会是源码的问题么


public function parseXmlAttr($attr,$tag) {        //XML解析安全过滤        $attr   =   str_replace('&','___', $attr);        $xml    =   '';        $xml    =   simplexml_load_string($xml);        if(!$xml) {            throw_exception(L('_XML_TAG_ERROR_').' : '.$attr);        }        $xml    =   (array)($xml->tag->attributes());        $array  =   array_change_key_case($xml['@attributes']);        if($array) {            $attrs  = explode(',',$this->tags[strtolower($tag)]['attr']);            if(isset($this->tags[strtolower($tag)]['must'])){                $must   =   explode(',',$this->tags[strtolower($tag)]['must']);            }else{                $must   =   array();            }            foreach($attrs as $name) {                if( isset($array[$name])) {                    $array[$name] = str_replace('___','&',$array[$name]);                }elseif(false !== array_search($name,$must)){                    throw_exception(L('_PARAM_ERROR_').':'.$name);                }            }            return $array;        }    }

再顺着查一下源码不就好了么,不清楚的变量就打印一下,很容易就能找出问题来,源码有错误也不是什么稀奇的事,也可能是书写格式不对。


怎么办啊,我写的都是最简单的几句代码,
结果在源码里测就是parseXmlAttr函数里面出的问题。可是会是源码的问题么


public function parseXmlAttr($attr,$tag) {        //XML解析安全过滤        $attr   =   str_replace('&','___', $attr);        $xml    =   '';        $xml    =   simplexml_load_string($xml);        if(!$xml) {            throw_exception(L('_XML_TAG_ERROR_').' : '.$attr);        }        $xml    =   (array)($xml->tag->attributes());        $array  =   array_change_key_case($xml['@attributes']);        if($array) {            $attrs  = explode(',',$this->tags[strtolower($tag)]['attr']);            if(isset($this->tags[strtolower($tag)]['must'])){                $must   =   explode(',',$this->tags[strtolower($tag)]['must']);            }else{                $must   =   array();            }            foreach($attrs as $name) {                if( isset($array[$name])) {                    $array[$name] = str_replace('___','&',$array[$name]);                }elseif(false !== array_search($name,$must)){                    throw_exception(L('_PARAM_ERROR_').':'.$name);                }            }            return $array;        }    }

再顺着查一下源码不就好了么,不清楚的变量就打印一下,很容易就能找出问题来,源码有错误也不是什么稀奇的事,也可能是书写格式不对。

控制器里面传给模板的数组是$select=array('id'=>1,'name'=>'yan');
在进过foreach标签处理就是它里面的函数parseXmlAttr($attr,$tag)中的这句话
$xml = (array)($xml->tag->attributes());得到的$xml是array(0){}
他处理后就变为空数组了,这个函数就没有返回数据。
就是这一步。和你发的对比了一下。源码就是这样的啊,到底那不错了啊?????????

public function _foreach($attr,$content) {        static $_iterateParseCache = array();        //如果已经解析过,则直接返回变量值        $cacheIterateId = md5($attr.$content);        if(isset($_iterateParseCache[$cacheIterateId]))            return $_iterateParseCache[$cacheIterateId];        $tag        =   $this->parseXmlAttr($attr,'foreach');        $name       =   $tag['name'];        $item       =   $tag['item'];        $key        =   !empty($tag['key'])?$tag['key']:'key';        $name       =   $this->autoBuildVar($name);        $parseStr   =   '$'.$item.'): ?>';        $parseStr  .=   $this->tpl->parse($content);        $parseStr  .=   '';        $_iterateParseCache[$cacheIterateId] = $parseStr;        if(!empty($parseStr)) {            return $parseStr;        }        return ;    }

稍微查了下解析foreach标签的源码,这个并不是list变量为空,其实是没取到标签里name和item的值,具体原因楼主可以自己去查源码排除下,当然最简单的解决办法就是改用volist标签。

volist和foreach还有for效果都是一样的。
纠结,好好地数组,传给源码后就被处理为空了。

上面说过了,list数组里的值并没有变化,只是在处理模版时没有正确的生成php代码罢了,我刚才下载了一个thinkphp,用楼主的代码试了下,结果是正常的,建议去thinkphp官网上重新下个最新版的看看

上面说过了,list数组里的值并没有变化,只是在处理模版时没有正确的生成php代码罢了,我刚才下载了一个thinkphp,用楼主的代码试了下,结果是正常的,建议去thinkphp官网上重新下个最新版的看看



我下载的是官网上的3.1.3,会不会是编程平台的问题我用的是EclipsePHP Studio v1.2.2。
开发环境用的是集成的appserv。

有弄了一下午,在网上也有人说是有bug,就是parseXmlAttr($attr,$tag) 中的
$xml = (array)($xml->tag->attributes());
使用foreach遍历给$array,我试了试,这样有输出数组正常,可是在TagLibCx中进行字符串链接的时候,出现字符串链接不上的情况

运行环境出问题了,以前用的appserv换了个新的。问题解决了。不过以前那个用的没啥问题。
为啥就thinkphp的标签出问题呢???????

php环境最好在php3.0以上

运行环境出问题了,以前用的appserv换了个新的。问题解决了。不过以前那个用的没啥问题。
为啥就thinkphp的标签出问题呢???????


你的问题解决了?必须更换环境吗?,我的ThinkPHP也是3.1.3,php版本是php6。这个也要重新换吗?

解决了,PHP6不行,我改成了PHP5,然后就可以了