PHPcms v9 get标签sql语句limit无效及num和rows属性无效问题至今也已经是一个老问题了,网络上也有一些表面的解决办法,但是逐日者并没有找到从底层,层模板标签解析及模板引擎代码上真正解决此问题的办法和解释。今天在使用get标签sql语句调用数据的时候当然也遇到了此问题,经过研究找到了问题的原因并且整理出本文希望对php爱好者有所帮助。
错误描述:我想从数据表中调取最新的6条数据!

     <dl class="about_text1">
        <dt><img src="{get_memberavatar($m_info['userid'],1,45)}"  alt=""
  class="tupian"/> {$m_more['nick']}最新文章
        </dt>
	{pc:get sql="SELECT * FROM `cms_talkcar` a LEFT JOIN `cms_member` b 
ON a.username=b.username LEFT JOIN `cms_member_detail` c ON b.userid=c.userid 
WHERE a.catid=$catid AND status=99  and a.username='$username' ORDER BY 
inputtime DESC" num='8' }
	  {loop $data $r}
	    <dd><i></i><a href="{$r[url]}" title="" target="_blank">{$r[title]}</a></dd>
	  {/loop}
	{/pc}
      </dl>

但结果显示的数量超过了6条,把数据库中所有的10条数据都显示了出来,这说明rows属性无效。
后来对sql进行了更改:SELECT * FROM `cms_talkcar` a LEFT JOIN `cms_member` b ON a.username=b.username LEFT JOIN `cms_member_detail` c ON b.userid=c.userid WHERE a.catid=$catid AND status=99 and a.username='$username' ORDER BY inputtime DESC limit 0,8"结果系统报出如下sql语法错误:
错误显示:
很明显,这是phpcms系统解析标签的时候如果没有获得有效的指定数据条数的参数时会默认追加“limit 20”的限制量。现在看来简单的在源sql语句上追加limit 8也是不行的。
逐日者也很快知道了指定数量用num属性,但是正如网又们知道的,num属性也无效(为什么num属性是正确的指定数量的参数在后面的底层代码讲解中您将得到回答)。返回的仍然是系统默认追加的“limit 20”的限制。
如此说明,在解析源代码地方出现了获取num属性值和判断是否有此值是否要使用默认20的错误。

在下面先给出整理的网络上的解决方法,然后再给大家讲解怎样去除源代码上的错误来正常的使用num属性指定获取数据条数。
整理的网络上的解决方案(来源phpcms官方论坛):
1.方法一,加入start属性,比如
{pc:get sql="SELECT title,url FROM v9_news where catid=9 and status=99 order by updatetime desc" start="0" num="4" return="v"}
  可以加入start 和 num 来控制。这样就获得0到4的数据。
2.方法二(比较绝的方法),加入--将系统自动加上的limit 20注释掉:
{pc:get sql="SELECT title,url FROM v9_news where catid=9 and status=99 order by updatetime desc limit 0,4--" return="v"}
  注意4后面的两个减号,把v9自带的LIMIT 0,20语句给注释了!这样就不会和你加入的limit 0,4冲突了。

逐日者给出的层底层去掉源代码错误的办法(只要改一行代码哦!):

在/phpcms/libs/classes/template_cache.class.php模板解析缓存文件中找到pc_tag()方法,大约在115行左右,然后在

131 $str = '';
132 $num = isset($num) && intval($num) ? intval($num) : 20;

第131行和第132行之间插入一句,如下:

131 $str = '';
132 $num = eval("return ".$num.";");//插入语句
133 $num = isset($num) && intval($num) ? intval($num) : 20;
这样,大功告成!在后台更新一下缓存,然后测试一下,get标签中num属性指定数据数量就可以用了。
转载请注明转自:运达's blog 原文地址:http://www.yunda51.com/1393.html