PHPcmsv9 get标签 sql语句limit无效及num和rows属性无效问题解决办法

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属性指定数据数量就可以用了

时间: 2024-09-29 22:10:22

PHPcmsv9 get标签 sql语句limit无效及num和rows属性无效问题解决办法的相关文章

MySQL的常用SQL语句

修改密码 这是常见的大家一般都要用的 首先安装成功了打开cmd –> mysql -u root -p –>输入你的密码 –>修改mysql root用户密码 格式:mysql> set password for 用户名@localhost = password('新密码'); 举例:mysql> set password for root@localhost = password('root'); 上面例子将用户root的密码更改为root: 如果是学习使用一般密码该简单些

select-Sql语句 limit 使用,查询某一行到全部数据

问题描述 Sql语句 limit 使用,查询某一行到全部数据 查询某一行到结束的所有数据.网上看了很多SELECT * FROM table LIMIT 95,-1; 是错的.有说查SELECT COUNT(*)FROM table 替换-1.还有其他方法能做到吗? 解决方案 SQL语句中的limit使用方法 解决方案二: 先order by 呢 没测试不知道对不? 解决方案三: 楼主大人,可以通过逆向思维去完成这样的题目哟,首先我们将前面需要排除的0到n行的id查出来,然后通过not exis

MySQL数据库学习笔记(三)----基本的SQL语句

  [正文] 主要内容: 一.cmd命令行的常用命令 二.数据定义语言(DDL) 三.数据操纵语言(DML) 四.数据查询语言(DRL) 五.事务控制语言(TCL) 一.cmd命令行的常用命令: 当我们使用MySQL 5.5 Command Line Client这个客户端登陆时,只能登陆root用户.如果今后创建了别的用户,就很麻烦了,所以我们不用MySQL 5.5 Command Line Client这个客户端,而是直接使用cmd. 登录MySQL数据库: 因为在这之前安装MySQL的时候

parameterclass-ibatis配置文件中的SQL语句可以默认不写parameterClass吗?

问题描述 ibatis配置文件中的SQL语句可以默认不写parameterClass吗? 主要是因为我在公司看ibatis SQL配置文件中的SQL语句使用到了map中的属性作为参数,但是在所有的SQL语句中并没有添加parameterClass,我想问一下大神门是不是可以默认不写,还是什么情况? 解决方案 可以不写..相当于默认值传一个map

ORM映射框架总结--SQL 语句生成组件

 1.       SQL 语句生成组建 之前说过ORM框架中有一个非常重要的组件,那就是SQL语句生成组件.SQL语句生成组件,顾名思义就是用于生成sql语句的一个组件.之前的Attribute 是用于修饰实体信息,而上一章讲的实体分析器分析了实体信息,在很大一部分程度上,以上做工作就是为这个SQL语句生成组件服务的. 该组件的核心接口是IDbFactory,它实现了接口IDisposable 目前该ORM支持SQL Server 数据库的sql语句生成,在后期过程中会逐步实现对Oracle,

dedecms-织梦中标签里面的sql语句中arc是什么表?

问题描述 织梦中标签里面的sql语句中arc是什么表? 这是arclist标签中的一段. 这个arc是什么表,估计是dede_archives ,但是怎么能这样写的呢? $query = "SELECT arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,tp.namerule,tp.namerule2,tp.ispart, tp.moresite,tp.siteurl,tp.sitepath $addfields

mssql 实现mysql limit sql语句

mssql 实现mysql教程 limit sql语句 在mysql中,可以用 limit 来查询第 m 列到第 n 列的记录,例如: select * from tablename limit m, n 但是,在sql server中,不支持 limit 语句.怎么办呢? 解决方案: 虽然sql server不支持 limit ,但是它支持 top. 我们以sql server 2005为例,就以它自带的示范数据库教程 adventureworks 作为测试数据: select address

[C#]无效的 SQL语句;期待 &amp;amp;#x27;DELETE&amp;amp;#x27;、&amp;amp;#x27;INSERT&amp;amp;#x27;、&amp;amp;#x27;PROCEDURE&amp;amp;#x27;、&amp;amp;#x27;SELECT&amp;amp;#x27;、或 &amp;amp;#x27;UPDATE&amp;amp;#x27;

问题描述 stringluru="insertintolyb(dyhm,dlyzt,dlynr,dlysj)values('"+Session["yhm"]+"','"+clyzt+"','"+clynr+"','"+Session["riqi"]+"')";OleDbCommandtianjia=newOleDbCommand(luru,conn);tianjia.

PgSQL · 捉虫动态 · 执行大SQL语句提示无效的内存申请大小

背景 我们执行一个大SQL时(长度大于512M),会返回如下错误: ERROR: invalid memory alloc request size 1073741824 复现 我们首先复现出来这个问题 创建表 create table byteatable(id int, obj bytea); 插入512M大对象 #!/bin/bash data='a' for ((i=1;i<=29;i++)); do data=$data$data done echo 'build ok' psql -