dede完美支持sql分页
- 格式:doc
- 大小:227.50 KB
- 文档页数:34
SQLserver分页的4种⽅法⽰例(很全⾯)这篇博客讲的是SQL server的分页⽅法,⽤的SQL server 2012版本。
下⾯都⽤pageIndex表⽰页数,pageSize表⽰⼀页包含的记录。
并且下⾯涉及到具体例⼦的,设定查询第2页,每页含10条记录。
⾸先说⼀下SQL server的分页与MySQL的分页的不同,mysql的分页直接是⽤limit (pageIndex-1),pageSize就可以完成,但是SQL server 并没有limit关键字,只有类似limit的top关键字。
所以分页起来⽐较⿇烦。
SQL server分页我所知道的就只有四种:三重循环;利⽤max(主键);利⽤row_number关键字,offset/fetch next关键字(是通过搜集⽹上的其他⼈的⽅法总结的,应该⽬前只有这四种⽅法的思路,其他⽅法都是基于此变形的)。
要查询的学⽣表的部分记录⽅法⼀:三重循环思路先取前20页,然后倒序,取倒序后前10条记录,这样就能得到分页所需要的数据,不过顺序反了,之后可以将再倒序回来,也可以不再排序了,直接交给前端排序。
还有⼀种⽅法也算是属于这种类型的,这⾥就不放代码出来了,只讲⼀下思路,就是先查询出前10条记录,然后⽤not in排除了这10条,再查询。
代码实现-- 设置执⾏时间开始,⽤来查看性能的set statistics time on ;-- 分页查询(通⽤型)select *from (select top pageSize *from (select top (pageIndex*pageSize) *from studentorder by sNo asc ) -- 其中⾥⾯这层,必须指定按照升序排序,省略的话,查询出的结果是错误的。
as temp_sum_studentorder by sNo desc ) temp_orderorder by sNo asc-- 分页查询第2页,每页有10条记录select *from (select top 10 *from (select top 20 *from studentorder by sNo asc ) -- 其中⾥⾯这层,必须指定按照升序排序,省略的话,查询出的结果是错误的。
SQL语句(六)分页查询和联合查询⽬录⼀、分页查询语法格式SELECT 查询列表FROM 表WHERE ...GROUP BYHAVING ...ORDER BYLIMIT 偏移, 记录数; <--特点:limit语句放在查询语句的最后公式select 查询列表from 表limit (page-1)*size, size;应⽤取前⾯5条记录:SELECT * FROM employees LIMIT 0,5;SELECT * FROM employees LIMIT 5;第11条到第25条:SELECT * FROM employees LIMIT 10, 15有奖⾦的员⼯信息,⽽且将⼯资较⾼的前10名显⽰出来:SELECT *FROM employeesWHERE commission_pct IS NOT NULLORDER BY salary DESCLIMIT 10;⼆、联合查询语法和作⽤作⽤:将多条查询语句的结果合并成⼀个结果语法:查询语句1UNION查询语句2应⽤场景:要查询的信息来⾃多个表特点1.要求多条查询语句中的列数是⼀致的2.多条查询语句的查询的每⼀列的类型和顺序最好⼀致3.使⽤union是默认去重的应⽤查询部门编号>90或邮箱包含a的员⼯信息原来的操作【使⽤OR逻辑运算】SELECT *FROM employeesWHERE department_id>90 OR email LIKE '%a%';【使⽤UNION联合查询】SELECT * FROM employees WHERE email LIKE '%a%'UNIONSELECT * FROM employees WHERE department_id>90;查询中国以及外国男性⽤户的信息此时不同的信息被存储到了不同的表中,使⽤UNION来合并两次查询的结果SELECT id, cname, csex FROM t_ca WHERE csex='男'UNIONSELECT t_id, tName, tGender FROM t_ua WHERE tGender='male';UNION和UNION ALL的区别使⽤UNION时结果会默认去重,⽽UNION ALL不会:#UNION 会去重SELECT id, cname FROM t_ca WHERE csex='男'UNIONSELECT t_id, tName FROM t_ua WHERE tGender='male';# UNION ALL不会去重SELECT id, cname FROM t_ca WHERE csex='男'UNION ALLSELECT t_id, tName FROM t_ua WHERE tGender='male';。
sql的limit分页执行流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!当使用 SQL 的 LIMIT 进行分页时,其执行流程通常如下:1. 客户端发送查询请求:客户端向数据库服务器发送包含 LIMIT 子句的SQL 查询语句,指定要获取的每页数据的数量和起始位置。
dede的sql用法(SQL usage of dede)1. Function Description: add custom attributesStatement details:Insert into `dede_arcatt` (sortid, ATT, attname) values (9,'d',' comment ');Alter table `dede_archives` modify `flag` set('c','H','p','f','s','j','a','b','d') default NULL;2. Function Description: batch for author and source assignmentStatement details:UPDATE dede_archives SET writer='to assign the value of' WHERE writer=''';UPDATE dede_archives SET source='to assign the value of' WHERE source=''';3. Function Description: delete the specified IP commentsStatement details:DELETE FROM `dede_feedback` WHERE `dede_feedback`.`ip`='000.000.000.000'000.000.000.000 is IP for spam publisher4. Function Description: empty the key field in the articleStatement details:Update dede_archives set keywords=''5. Function Description: batch replacement release time, storage time, update timeStatement details:First step. Add an article in the background.Get a time, such as 2009-01-13 14:13:32, which can be seen through the management article.The second step, the background execution SQL statement SELECT * FROM dede_archives order by ID DESC limit 1So you can see all of the field values you just added to the new Gaga article.Observe the following data:Pubdate:1231846313Senddate:1231846313Sortrank:12318463131231846313 of them are time data.And then it's replaced.UPDATE dede_archives SET sortrank = 1231846313;UPDATE dede_archives SET senddate = 1231846313;UPDATE dede_archives SET PubDate = 1231846313;6. Function Description: batch modify column for dynamic or staticStatement details:UPDATE `dede_arctype` SET `isdefault` ='-1'dynamicsUPDATE `dede_arctype` SET `isdefault` ='1'staticFunction Description: batch replacement of SQL statement in article contentStatement details:Update `dede_addonarticle` set body=REPLACE (body, 'Forum', 'community') where body like '% forum%"The above SQL statement function is to find all the articles with "forum" phrase, and replace the forum as "community""The SQL statement of the data calling type has the following:1. label Description: common content statistics codeStatement details:There are articles in this article{dede:sql sql= "select count as C from (*) dede_archives where channel=1} - Total article: [field:c /] {/dede:sql}Atlas: * *{dede:sql sql= "select count as C from (*) dede_archives where channel=2", a total of} Atlas: [field:c /] {/dede:sql}Common software: * *{dede:sql sql= "select count as C from (*) dede_archives where channel=3} - there are basically a {/dede:sql} software: [field:cShared comments: * *{dede:sql sql= "select count as C from dede_feedback (*) - Total"} review: [field:c /] {/dede:sql}General membership: * *{dede:sql sql= "select count (MID) as C from dede_member" - a total membership: [field:c} /] {/dede:sql}Article reading: * * trips{dede:sql sql= "select sum (click) as C from dede_archives"} reading: [field:c /] people {/dede:sql}Update today: * *{迪迪:SQL语句“select count(*)为C dede_archives哪里出版日期> unix_timestamp(CURDATE())“}今日更新:[领域:C / ]篇{ /迪迪:SQL }总共留言:{迪迪:SQL语句“select count(*)为CCdede_guestbook”} [领域:CC / ] { }条/迪迪:SQL2。
sql语句分页多种方式ROW_NUMBER()OVER方式一select top @pageSize * from company where id not in(select top @pageSize*(@pageIndex-1) id from company)方式二ROW_NUMBER()OVER--ROW_NUMBER() 就是生成一个有顺序的行号,而他生成顺序的标准,就是后面紧跟的OVER(ORDER BY ID)--还必须添加OVER语句以便告诉SQL Server你希望怎样添加行序号。
select getdate()select * from company where id in (--搜索出settable表中所有的编号,也就是company表中的id,这里只不过要得到num(即有顺序的编号)select id from--搜索出出表中的所有的id,并且新建一列num用来存取排序的编号,并且把这张表赋值给settable(select id,row_number() over (order by id) asnum from company)as settable--添加搜索条件页索引和页大小where num between (@pageIndex-1)*@pageSize+1 and @pageIndex*@pageSize)select getdate()方式三SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY id asc) AS rownum,idFROM company ) AS DWHERE rownum BETWEEN (@pageIndex-1)*@pageSize+1 AND@pageIndex*@pageSizeORDER BY id ascSql Server 2000的自定义分页,但是在sql server 2000中,要实现显示某一页,就返回那一页数据的效果的方法实在不尽人意.网上很多通用的分页存储过程,但看着就头大.如果使用我前面提到的使用in,not in,top来进行返回特定页,特殊的限制又会比较多(比如ID要递增).现在Sql Server 2005中提供了一个函数ROW_NUMBER(),可以使自定义分页变得简单许多.我们先来看看ROW_NUMBER()是干什么的.执行下面这段SQL语句:SELECT [ReportID],[UserName], [ReportID],[TimeStart], [TimeEnd],ROW_NUMBER() OVER (ORDER BY ReportID) AS RowNoFROM [ExecutionLog]很简单,ROW_NUMBER() 就是生成一个顺序的行号,而他生成顺序的标准,就是后面紧跟的OVER(ORDER BY ReportID).现在,你看到了自定义分页的影子了吗?:)下面,我们看看怎么具体应用这个RowNo进行分页.现在,假设我每一页的数据是10条,我们就可以使用如下所示的SQL语句返回指定页的数据:@"SELECT TOP 10 *FROM(SELECT top 10 [InstanceName], [UserName], [ReportID],[TimeStart], [TimeEnd],ROW_NUMBER() OVER (ORDER BY ReportID) AS RowNoFROM [ExecutionLog]) AS AWHERE RowNo > " + pageIndex*10pageIndex就是我们需要数据的页数.很简单,不是吗?并且,这种方式几乎没有什么限制,因为他相当于对于任何检索,都生成了一个新的排序列.我们就可以使用该列进行自定义分页.================下面举个例子:ROW_NUMBER函数SQL Server2005为我们引入了一个ROW_NUMBER函数。
帝国CMSSQL语句调用技巧ecmsdedecmskingcmsphpcms定...帝国CMS SQL语句调用技巧(2010-04-19)1、标签上面的“操作类型”参数要设为24,然后“栏目id”为SQL语句2、开启支持按SQL语句调用,默认是开启的,如果没有开启:打开e/class/config.php文件进行配置(粗体文字的设置)//部分参数设置$do_theloginlog=0; //是否记录登陆日志(0为记录,1为不记录)$do_thedolog=0; //是否记录操作日志(0为记录,1为不记录)$do_openbqquery=1; //开启标签支持sql语句查询(0为不支持,1为开启)$do_openreadfile=0; //开启支持读取本地文件,为了安全,一般情况请不要开启(0为不支持,1为开启)$do_txtpath="../../d/txt/"; //文本型数据存放目录$saveurlimgclearurl=1; //远程保存图片自动去除图片的链接(0为保留,1为去除)$ecmsdeftempid=0; //默认模板组ID3、调用例子。
以ecmsinfo为例:[ecmsinfo]"select * from phome_ecms_news where classid=1 order by id desc limit 10",10,30,0,24,1,0[/ecmsinfo]注:显示栏目ID为1的10条新闻表记录让标签参数支持系统变量说明:以实现按各种条件调用信息数据。
根据程序扩展变量的说明得出我们可以在标签参数中直接使用“字段值数组”变量。
例如:我们要列出所有信息来源相同的10条信息,标签如下(按sql语句调用):[phomenews]"select * from phome_ecms_news where befrom='".$navinfor[befrom]."' order by id desc limit 10",10,32,0,24,0[/phomenews]附加说明:$navinfor[字段名]本月热点排行之类的sql标签已带模版的标签为例:[ecmsinfo]"select * from phome_ecms_news where newstime>SUBDATE(NOW(),INTERVAL 30 DAY) order by onclick desc limit 10",10,30,0,24,7,0[/ecmsinfo]注意红色部分:30 是单位(天,当然你也可以修改单位为hour(小时),month(月)等…),自己修改合适的时间。
分页查询sql语句分页查询是指在查询大量数据时,将数据分成若干页进行显示,并根据用户的需求,动态地加载不同页的数据。
在MySQL数据库中,可以使用LIMIT关键词来实现分页查询。
LIMIT关键词有两个参数,第一个参数指定返回的记录起始位置,第二个参数指定返回的记录数量。
例如,LIMIT 0,10表示返回从第一条记录开始的10条记录。
在进行分页查询时,还需要获取总记录数以计算总页数。
可以使用COUNT函数来获取总记录数,COUNT函数用于统计满足查询条件的记录数。
例如,SELECT COUNT(*) FROMtable_name WHERE condition可以获取满足条件的总记录数。
在应用程序中,一般会根据用户的需求动态地生成分页查询的SQL语句。
以下是一个示例的分页查询SQL语句:```SELECT * FROM table_name WHERE condition LIMITstart_index, page_size;```其中,start_index为起始位置,计算公式为(start_page - 1) * page_size;page_size为每页记录数。
在实际应用中,可以通过计算总记录数和每页记录数来确定总页数,以便提供用户导航和显示页码等功能。
以下是一个示例的获取总记录数的SQL语句:```SELECT COUNT(*) FROM table_name WHERE condition;```获取到总记录数后,可以根据总记录数和每页记录数计算总页数。
例如,总页数 = CEIL(总记录数 / 每页记录数)。
在应用程序中,通常还会根据当前页数和总页数来控制上一页和下一页的导航功能。
可以使用IF语句来判断当前页是否为第一页或最后一页,然后生成相应的SQL语句。
分页查询在实际应用中经常用到,可以提高数据显示效率,减少网络传输时间,并节省服务器和客户端的资源。
在使用分页查询时,还可以结合其他功能,如排序、筛选等,提供更灵活的数据浏览和查询功能。
利⽤SQL语句实现分页1.概述在⽹页中如果显⽰的数据太多就会占据过多的页⾯,⽽且显⽰速度也会很慢。
为了控制每次在页⾯上显⽰数据的数量,就可以利⽤分页来显⽰数据。
2.技术要点在SQL Server中要实现SQL分页,需要使⽤⼦查询来获取上⼀页的数据进⾏对⽐,进⽽获取最新的数据。
使⽤⼦查询获取分页数据的语法格式如下:"SELECT TOP [pageSize] * FROM [table] WHERE id NOT IN(SELECT TOP [preNum] id FROM [table] ORDER BY ID DESC) ORDER BY ID DESC";a. pageSize:数据分页的分页⼤⼩。
b. preNum:上⼀页数据查询的起始范围。
c. table:数据表名称。
例如要从数据库的第10条数据开始查询5条数据,编写的 SQL查询语句如下:"SELECT TOP 5 * FROM tb_SQLServerFenye WHERE id NOT IN(SELECT TOP 10 id FROM tb_SQLServerFenye ORDER BY ID DESC) ORDER BY ID DESC";在JDBCDao数据库操作类的getPageArgs()⽅法中就使⽤getProducts()⽅法中就使⽤了该语法获取指定页码的分页数据,关键代码如下:// 定义查询数据库的SQL语句String sql = "SELECT TOP " + pageSize + " * FROM tb_SQLServerFenye" +" WHERE id NOT IN(SELECT TOP " + (page - 1) * pageSize + " id FROM" +" tb_SQLServerFenye ORDER BY ID DESC) ORDER BY ID DESC";stmt = conn.createStatement();rs = stmt.executeQuery(sql); // 执⾏SQL并获取查询结果集3.实现过程(1)创建操作数据库类UserDao。
织梦dederunphp=yesSQL语句操作个⼈实例dede:channelartlist 下循环出 channel 栏⽬中的⽂章{dede:sql sql='select * from dede_arctype where reid =~id~ limit 6'}<blockquote style='display:[field:global name='autoindex' runphp=yes]@me=@me ==1?'block':'none';[/field:global]'><div class="td1"><dl><per>[field:id runphp=yes]global $dsql;$id = @me;$sql='select * from dede_archives where typeid='.$id;$row=$dsql->getone($sql);$description = cn_substr($row[description],120);$url = GetOneArchive($row[id]);$url = $url['arcurl'];@me =<<<str<dt><a target="_blank" href="$url"><img src="$row[litpic]" width="100px" height="93px" title="$row[title]"></a><h3><a target="_blank" href="$url" title="$row[title]">$row[title]</a></h3><p>$description</p></dt>str;[/field:id]<dd>[field:id runphp=yes]global $dsql;$id = @me;$sql='select * from dede_archives where typeid='.$id.' limit 6';$dsql->SetQuery($sql);//将SQL查询语句格式化$dsql->Execute();//执⾏SQL操作//通过循环输出执⾏查询中的结果while($row = $dsql->GetArray()){$url = GetOneArchive($row[id]);$url = $url['arcurl'];$str .=<<<str<p><a target="_blank" href="$url" title="$row[title]"class="red"></a><a target="_blank" href="$url" title="$row[title]">$row[title]</a></p> str;@me = $str;}[/field:id]</dd></div></blockquote>{/dede:sql}dedecms的数据库操作类,⾮常实⽤,在⼆次开发中尤其重要,这个数据库操作类说明算是奉献给⼤家的⼩礼物了。
dedecms 织梦dede:sql 标签实现分页相信很多使用dedecms的朋友正在网上查找关于dede:sql标签进行分页的解决方案时都不尽如人意,尤其是正在列表页使用dede:sql调用外部数据(所谓调用外部数据就是指正在后台只是创建个空栏目,然后对应的列表模板文件中使用dede:sql指定自界说的数据源,数据源与该栏目本身是没有逻辑关系的,目的是为了让织梦能按照它的规则来帮我们将数据源生成静态文件予以展示)时,我本人也搜索了很多资料,网上的答案都不敷完美,有的是直接正在模板文件中执行php代码来实现分页,显然此方法无法生成静态文件,有的直接正在sql里面指定limit参数,但又无法实现智能分页,织梦官方也没有给出具体的解决方案,在dede论坛有看到织梦核心人物天涯给出的回复是采用自由列表的方法,显然自由列表无法指定外部数据源,最后实在没办法只能自己动手了,首先想到的思路是将dede:list标签进行改造了,熟悉dede的朋友应该知道这个列表页专用标签的工作原理大致是先通过栏目变量id获取到对应的数据源再呈现到页面上来,那么我们就可让它不仅仅通过栏目变量id还可以通过指定的sql语句来获取数据源了,比如我们可以另外嵌入一个类似{dede:listsql sql='select * from wp_posts' pagesize='10'}的标签来使用。
OK,思路已经有了,接下来我们打开include/arc.listview.class.php这个文件来给它动个小手术吧!找到:if(!is_object($ctag)) { $ctag = $this->dtp->GetTag("list"); }这一段,在其后添加以下代码:if(!is_object($ctag)){$ctag=$this->dtp->GetTag("listsql");if(is_object($ctag)){$cquery=$ctag->GetAtt("sql");$cquery=preg_replace("/SELECT(.*?)FROM/is"," SELECT count(*) as dd FROM ",$cquery);$cquery=preg_replace("/ORDER(.*?)SC/is","",$cquery);$row=$this->dsql->GetOne($cquery);if(is_array($row)){$this->TotalResult=$row['dd'];}else{$this->TotalResult=0;}}}//end然后找到:if($ctag->GetName()=="list"){$limitstart=($this->PageNo-1)*$this->PageSize;$row=$this->PageSize;if(trim($ctag->GetInnerText())==""){$InnerText= GetSysTemplets("list_fulllist.htm");}else{$InnerText=trim($ctag->GetInnerText());}$this->dtp->Assign($tagid,$this->GetArcList($limitstart,$row,$ctag->GetAtt("col"),$ctag->GetAtt("titlelen"),$ctag->GetAtt("infolen"),$ctag->GetAtt("imgwidth"),$ctag->GetAtt("imgheight"),$ctag->GetAtt("listtype"),$ctag->GetAtt("orderby"),$InnerText,$ctag->GetAtt("tablewidth"),$ismake,$ctag->GetAtt("orderway")));}这一段,在其后添加以下代码:elseif($ctag->GetName()=="listsql"){$limitstart=($this->PageNo-1)*$this->PageSize;$row=$this->PageSize;if(trim($ctag->GetInnerText())==""){$InnerText=GetSysTemplets("list_fulllist.htm");}else{$InnerText=trim($ctag->GetInnerText());}$this->dtp->Assign($tagid,$this->GetSqlList($limitstart,$row,$ctag->GetAtt("sql"),$InnerText));}//end最后找到function GetArcList这个方法,在其后添加一个可以通过传入sql参数获取指定数据源的方法,代码以下:/** * 通过listsql标签中sql属性传入的参数来获得一个单列的文档列表**/function GetSqlList($limitstart=0,$row=10,$sql='',$innertext){ global$cfg_list_son; $innertext=trim($innertext); if($innertext==''){$innertext=GetSysTemplets('list_fulllist.htm');}//处理SQL语句$limitStr="LIMIT{$limitstart},{$row}"; $this->dsql->SetQuery($sql.$limitStr);$this->dsql->Execute('al');$t2= ExecTime(); //echo $t2-$t1;$sqllist='';$this->dtp2->LoadSource($innertext);$GLOBALS['autoindex']=0; //获取字段while($row=$this->dsql->GetArray("al")){ $GLOBALS['autoindex']++; if(is_array($this->dtp2->CTags)){foreach($this->dtp2->CTagsas$k=>$ctag){if($ctag->GetName()=='array'){//通报整个数组,在runphp模式中有特殊作用$this->dtp2->Assign($k,$row);}else{if(isset($row[$ctag->GetName()])){$this->dtp2->Assign($k,$row[$ctag->GetName()]);}else{$this->dtp2->Assign($k,'');}}}}$sqllist.=$this->dtp2->GetResult(); }//while $t3= ExecTime();//echo ($t3-$t2);$this->dsql->FreeResult('al'); return$sqllist;}//end总共就添加三段代码,每一段代码基本都参考它紧接着的上面那段原始代码,而无需改变它原来任何一个地方的代码,应该算是比较完美的手术了,接下来在模板文件中的使用方法就跟一开始思路中所提到的那样,分页标签依旧沿用原来的,调用范例:{dede:listsql sql='select ID,post_title from wp_posts' pagesize='10'} <li><a href="http://gump.me/[field:ID /].html">[field:post_title /]</a></li> {/dede:listsql} <!--分页--> {dede:pagelist listsize='2' listitem='index pre pageno next end '/}注:以上解决方案适用于dedecms5.6版本。
今天小编在做dede二次开发的时候,发现dede的模板机制中并不支持Sql分页,于是小编在网上找了几个说明,都不能用!于是小编就自己对网上的进行了改良!把include/archives.class.php 内的所有内容替换为如下即可<?phpif(!defined('DEDEINC')) exit("Request Error!");/*** 文档类** @version $Id: arc.archives.class.php 4 15:13 2010年7月7日Z tianya $* @package DedeCMS.Libraries* @copyright Copyright (c) 2007 - 2010, DesDev, Inc.* @license /usersguide/license.html* @link */require_once(DEDEINC."/typelink.class.php");require_once(DEDEINC."/channelunit.class.php");require_once(DEDEINC."/downmix.inc.php");require_once(DEDEINC.'/ftp.class.php');@set_time_limit(0);/*** 主文档类(Archives类)** @package TypeLink* @subpackage DedeCMS.Libraries* @link */class Archives{var $TypeLink;var $ChannelUnit;var $dsql;var $Fields;var $dtp;var $ArcID;var $SplitPageField;var $SplitFields;var $NowPage;var $TotalPage;var $NameFirst;var $ShortName;var $FixedValues;var $TempSource;var $IsError;var $SplitTitles;var $PreNext;var $addTableRow;var $ftp;var $remoteDir;/*** php5构造函数** @access public* @param int $aid 文档ID* @return string*/function __construct($aid){global $dsql,$ftp;$this->IsError = FALSE;$this->ArcID = $aid;$this->PreNext = array();$this->dsql = $dsql;$query = "SELECT channel,typeid FROM `#@__arctiny` WHERE id='$aid' ";$arr = $this->dsql->GetOne($query);if(!is_array($arr)){$this->IsError = TRUE;}else{if($arr['channel']==0) $arr['channel']=1;$this->ChannelUnit = new ChannelUnit($arr['channel'], $aid);$this->TypeLink = new TypeLink($arr['typeid']);if($this->ChannelUnit->ChannelInfos['issystem']!=-1){// 如果当前文档不是系统模型,为单表模型$query = "SELECT arc.*,tp.reid,tp.typedir,ch.addtableFROM `#@__archives` arcLEFT JOIN #@__arctype tp on tp.id=arc.typeidLEFT JOIN #@__channeltype as ch on arc.channel =ch.idWHERE arc.id='$aid' ";$this->Fields = $this->dsql->GetOne($query);}else{$this->Fields['title'] = '';$this->Fields['money'] = $this->Fields['arcrank'] = 0;$this->Fields['senddate'] = $this->Fields['pubdate'] = $this->Fields['mid'] = $this->Fields['adminid'] = 0;$this->Fields['ismake'] = 1;$this->Fields['filename'] = '';}if($this->TypeLink->TypeInfos['corank'] > 0 &&$this->Fields['arcrank']==0){$this->Fields['arcrank'] =$this->TypeLink->TypeInfos['corank'];}$this->Fields['tags'] = GetTags($aid);$this->dtp = new DedeTagParse();$this->dtp->SetRefObj($this);$this->SplitPageField = $this->ChannelUnit->SplitPageField;$this->SplitFields = '';$this->TotalPage = 1;$this->NameFirst = '';$this->ShortName = 'html';$this->FixedValues = '';$this->TempSource = '';$this->ftp = &$ftp;$this->remoteDir = '';if(empty($GLOBALS['pageno'])){$this->NowPage = 1;}else{$this->NowPage = $GLOBALS['pageno'];}//特殊的字段数据处理$this->Fields['aid'] = $aid;$this->Fields['id'] = $aid;$this->Fields['position'] =$this->TypeLink->GetPositionLink(TRUE);$this->Fields['typeid'] = $arr['typeid'];//设置一些全局参数的值foreach($GLOBALS['PubFields'] as $k=>$v){$this->Fields[$k] = $v;}//为了减少重复查询,这里直接把附加表查询记录放在 $this->addTableRow 中,在 ParAddTable() 不再查询if($this->ChannelUnit->ChannelInfos['addtable']!=''){$query = "SELECT * FROM`{$this->ChannelUnit->ChannelInfos['addtable']}` WHERE `aid` = '$aid'";$this->addTableRow = $this->dsql->GetOne($query);}//issystem==-1 表示单表模型,单表模型不支持redirecturl这类参数,因此限定内容普通模型才进行下面查询if($this->ChannelUnit->ChannelInfos['addtable']!='' &&$this->ChannelUnit->ChannelInfos['issystem']!=-1){if(is_array($this->addTableRow)){$this->Fields['redirecturl'] =$this->addTableRow['redirecturl'];$this->Fields['templet'] =$this->addTableRow['templet'];$this->Fields['userip'] =$this->addTableRow['userip'];}$this->Fields['templet'] =(empty($this->Fields['templet']) ? '' :trim($this->Fields['templet']));$this->Fields['redirecturl'] =(empty($this->Fields['redirecturl']) ? '' :trim($this->Fields['redirecturl']));$this->Fields['userip'] =(empty($this->Fields['userip']) ? '' : trim($this->Fields['userip'])); }else{$this->Fields['templet'] = $this->Fields['redirecturl'] = '';}}//!error}//php4构造函数function Archives($aid){$this->__construct($aid);}/*** 解析附加表的内容** @access public* @return void*/function ParAddTable(){//读取附加表信息,并把附加表的资料经过编译处理后导入到$this->Fields中,以方便在模板中用 {dede:field name='fieldname' /} 标记统一调用if($this->ChannelUnit->ChannelInfos['addtable']!=''){$row = $this->addTableRow;if($this->ChannelUnit->ChannelInfos['issystem']==-1){$this->Fields['title'] = $row['title'];$this->Fields['senddate'] = $this->Fields['pubdate'] = $row['senddate'];$this->Fields['mid'] = $this->Fields['adminid'] =$row['mid'];$this->Fields['ismake'] = 1;$this->Fields['arcrank'] = 0;$this->Fields['money']=0;$this->Fields['filename'] = '';}if(is_array($row)){foreach($row as $k=>$v) $row[strtolower($k)] = $v;}if(is_array($this->ChannelUnit->ChannelFields)&& !empty($this->ChannelUnit->ChannelFields)){foreach($this->ChannelUnit->ChannelFields as $k=>$arr) {if(isset($row[$k])){if(!empty($arr['rename'])){$nk = $arr['rename'];}else{$nk = $k;}$cobj = $this->GetCurTag($k);if(is_object($cobj)){foreach($this->dtp->CTags as $ctag){if($ctag->GetTagName()=='field' &&$ctag->GetAtt('name')==$k){//带标识的专题节点if($ctag->GetAtt('noteid') != '') {$this->Fields[$k.'_'.$ctag->GetAtt('noteid')] =$this->ChannelUnit->MakeField($k, $row[$k], $ctag);}//带类型的字段节点else if($ctag->GetAtt('type') != '') {$this->Fields[$k.'_'.$ctag->GetAtt('type')] =$this->ChannelUnit->MakeField($k, $row[$k], $ctag);}//其它字段else {$this->Fields[$nk] =$this->ChannelUnit->MakeField($k, $row[$k], $ctag);}}}}else{$this->Fields[$nk] = $row[$k];}if($arr['type']=='htmltext' &&$GLOBALS['cfg_keyword_replace']=='Y'&& !empty($this->Fields['keywords'])){$this->Fields[$nk] =$this->ReplaceKeyword($this->Fields['keywords'],$this->Fields[$nk]); }}}//End foreach}//设置全局环境变量$this->Fields['typename'] =$this->TypeLink->TypeInfos['typename'];@SetSysEnv($this->Fields['typeid'],$this->Fields['typename'],$this->F ields['id'],$this->Fields['title'],'archives');}//完成附加表信息读取unset($row);//处理要分页显示的字段$this->SplitTitles = Array();if($this->SplitPageField!='' && $GLOBALS['cfg_arcsptitle']='Y'&& isset($this->Fields[$this->SplitPageField])){$this->SplitFields =explode("#p#",$this->Fields[$this->SplitPageField]);$i = 1;foreach($this->SplitFields as $k=>$v){$tmpv = cn_substr($v,50);$pos = strpos($tmpv,'#e#');if($pos>0){$st = trim(cn_substr($tmpv,$pos));if($st==""||$st=="副标题"||$st=="分页标题"){$this->SplitFields[$k] =preg_replace("/^(.*)#e#/is","",$v);continue;}else{$this->SplitFields[$k] =preg_replace("/^(.*)#e#/is","",$v);$this->SplitTitles[$k] = $st;}}else{continue;}$i++;}$this->TotalPage = count($this->SplitFields);$this->Fields['totalpage'] = $this->TotalPage;}//处理默认缩略图等if (isset($this->Fields['litpic'])){if($this->Fields['litpic'] == '-' || $this->Fields['litpic'] == ''){$this->Fields['litpic'] =$GLOBALS['cfg_cmspath'].'/images/defaultpic.gif';}if(!preg_match("#^http:\/\/#i", $this->Fields['litpic']) && $GLOBALS['cfg_multi_site'] == 'Y'){$this->Fields['litpic'] =$GLOBALS['cfg_mainsite'].$this->Fields['litpic'];}$this->Fields['picname'] = $this->Fields['litpic'];//模板里直接使用{dede:field name='image'/}获取缩略图$this->Fields['image'] = (!preg_match('/jpg|gif|png/i', $this->Fields['picname']) ? '' : "<img src='{$this->Fields['picname']}' />");}// 处理投票选项if (isset($this->Fields['voteid'])&& !empty($this->Fields['voteid'])){$this->Fields['vote'] = '';$voteid = $this->Fields['voteid'];$this->Fields['vote'] = "<script language='javascript'src='{$GLOBALS['cfg_cmspath']}/data/vote/vote_{$voteid}.js'></script> ";if ($GLOBALS['cfg_multi_site'] == 'Y'){$this->Fields['vote'] = "<script language='javascript' src='{$GLOBALS['cfg_mainsite']}/data/vote/vote_{$voteid}.js'></script >";}}if (isset($this->Fields['goodpost']) &&isset($this->Fields['badpost'])){//diggif($this->Fields['goodpost'] + $this->Fields['badpost'] == 0) {$this->Fields['goodper'] = $this->Fields['badper'] = 0; }else{$this->Fields['goodper'] =number_format($this->Fields['goodpost']/($this->Fields['goodpost']+$t his->Fields['badpost']), 3)*100;$this->Fields['badper'] = 100 - $this->Fields['goodper']; }}}//获得当前字段参数function GetCurTag($fieldname){if(!isset($this->dtp->CTags)){return '';}foreach($this->dtp->CTags as $ctag){if($ctag->GetTagName()=='field' &&$ctag->GetAtt('name')==$fieldname){return $ctag;}else{continue;}}return '';}/*** 生成静态HTML** @access public* @param int $isremote 是否远程* @return string*/function MakeHtml($isremote=0){global $cfg_remote_site,$fileFirst;if($this->IsError){return '';}$this->Fields["displaytype"] = "st";//预编译$th$this->LoadTemplet();$this->ParAddTable();$this->ParseTempletsFirst();$this->Fields['senddate'] = empty($this->Fields['senddate'])? '' : $this->Fields['senddate'];$this->Fields['title'] = empty($this->Fields['title'])? '' : $this->Fields['title'];$this->Fields['arcrank'] = empty($this->Fields['arcrank'])? 0 : $this->Fields['arcrank'];$this->Fields['ismake'] = empty($this->Fields['ismake'])? 0 : $this->Fields['ismake'];$this->Fields['money'] = empty($this->Fields['money'])? 0 : $this->Fields['money'];$this->Fields['filename'] = empty($this->Fields['filename'])? '' : $this->Fields['filename'];//分析要创建的文件名称$filename = GetFileNewName($this->ArcID,$this->Fields['typeid'],$this->Fields['senddate'],$this->Fields['title'],$this->Fields['ismake'],$this->Fields['arcrank '],$this->TypeLink->TypeInfos['namerule'],$this->TypeLink->TypeInfos['ty pedir'],$this->Fields['money'],$this->Fields['filename']);$filenames = explode(".", $filename);$this->ShortName = $filenames[count($filenames)-1];if($this->ShortName=='') $this->ShortName = 'html';$fileFirst = preg_replace("/\.".$this->ShortName."$/i", "", $filename);$this->Fields['namehand'] = basename($fileFirst);$filenames = explode("/", $filename);$this->NameFirst= preg_replace("/\.".$this->ShortName."$/i", "", $filenames[count($filenames)-1]);if($this->NameFirst==''){$this->NameFirst = $this->arcID;}//获得当前文档的全名$filenameFull = GetFileUrl($this->ArcID,$this->Fields['typeid'],$this->Fields["senddate"], $this->Fields["title"],$this->Fields["ismake"],$this->Fields["arcrank"],$this->TypeLink->TypeInfos['namerule'],$this ->TypeLink->TypeInfos['typedir'],$this->Fields["money"],$this->Fields ['filename'],$this->TypeLink->TypeInfos['moresite'],$this->TypeLink->TypeInfos['si teurl'],$this->TypeLink->TypeInfos['sitepath']);$this->Fields['arcurl'] = $this->Fields['fullname'] = $filenameFull;//对于已设置不生成HTML的文章直接返回网址if($this->Fields['ismake']==-1 || $this->Fields['arcrank']!=0 || $this->Fields['money']>0|| ($this->Fields['typeid']==0 && $this->Fields['channel'] != -1) ){return $this->GetTrueUrl($filename);}//循环生成HTML文件else{for($i=1;$i<=$this->TotalPage;$i++){if($this->TotalPage > 1) {$this->Fields['tmptitle'] =(empty($this->Fields['tmptitle']) ? $this->Fields['title'] :$this->Fields['tmptitle']);if($i>1) $this->Fields['title'] =$this->Fields['tmptitle']."($i)";}if($i>1){$TRUEfilename =$this->GetTruePath().$fileFirst."_".$i.".".$this->ShortName;}else{$TRUEfilename = $this->GetTruePath().$filename;}$this->ParseDMFields($i,1);$this->dtp->SaveTo($TRUEfilename);//如果启用远程发布则需要进行判断if($cfg_remote_site=='Y' && $isremote == 1){//分析远程文件路径$remotefile = str_replace(DEDEROOT, '', $TRUEfilename);$localfile = '..'.$remotefile;//创建远程文件夹$remotedir = preg_replace("#[^\/]*\.html#", '', $remotefile);$this->ftp->rmkdir($remotedir);$this->ftp->upload($localfile, $remotefile, 'ascii'); }}}$this->dsql->ExecuteNoneQuery("Update `#@__archives` SETismake=1 WHERE id='".$this->ArcID."'");return $this->GetTrueUrl($filename);}/*** 获得真实连接路径** @access public* @param string $nurl 连接* @return string*/function GetTrueUrl($nurl){return GetFileUrl($this->Fields['id'],$this->Fields['typeid'],$this->Fields['senddate'],$this->Fields['title'],$this->Fields['ismake'],$this->Fields['arcrank'],$this->TypeLink->TypeInfos['namerule'],$this->TypeLink->TypeInfos['typedir'],$this->Fields['money'],$this->Fields['filename'],$this->TypeLink->TypeInfos['moresite'],$this->TypeLink->TypeInfos['siteurl'],$this->TypeLink->TypeInfos['sitepath'] );}/*** 获得站点的真实根路径** @access public* @return string*/function GetTruePath(){$TRUEpath = $GLOBALS["cfg_basedir"];return $TRUEpath;}/*** 获得指定键值的字段** @access public* @param string $fname 键名称* @param string $ctag 标记* @return string*/function GetField($fname, $ctag){//所有Field数组 OR 普通Fieldif($fname=='array'){return $this->Fields;}//指定了ID的节点else if($ctag->GetAtt('noteid') != ''){if( isset($this->Fields[$fname.'_'.$ctag->GetAtt('noteid')]) ){return$this->Fields[$fname.'_'.$ctag->GetAtt('noteid')];}}//指定了type的节点else if($ctag->GetAtt('type') != ''){if( isset($this->Fields[$fname.'_'.$ctag->GetAtt('type')]) ) {return $this->Fields[$fname.'_'.$ctag->GetAtt('type')]; }}else if( isset($this->Fields[$fname]) ){return $this->Fields[$fname];}return '';}/*** 获得模板文件位置** @access public* @return string*/function GetTempletFile(){global $cfg_basedir,$cfg_templets_dir,$cfg_df_style;$cid = $this->ChannelUnit->ChannelInfos['nid'];if(!empty($this->Fields['templet'])){$filetag = MfTemplet($this->Fields['templet']);if( !preg_match("#\/#", $filetag) ) $filetag =$GLOBALS['cfg_df_style'].'/'.$filetag;}else{$filetag =MfTemplet($this->TypeLink->TypeInfos["temparticle"]);}$tid = $this->Fields['typeid'];$filetag = str_replace('{cid}', $cid,$filetag);$filetag = str_replace('{tid}', $tid,$filetag);$tmpfile = $cfg_basedir.$cfg_templets_dir.'/'.$filetag;if($cid=='spec'){if( !empty($this->Fields['templet']) ){$tmpfile = $cfg_basedir.$cfg_templets_dir.'/'.$filetag; }else{$tmpfile =$cfg_basedir.$cfg_templets_dir."/{$cfg_df_style}/article_spec.htm"; }}if(!file_exists($tmpfile)){$tmpfile =$cfg_basedir.$cfg_templets_dir."/{$cfg_df_style}/".($cid=='spec' ?'article_spec.htm' : 'article_default.htm');}if (!preg_match("#.htm$#", $tmpfile)) return FALSE;return $tmpfile;}/*** 动态输出结果** @access public* @return void*/function display(){global $htmltype;if($this->IsError){return '';}$this->Fields["displaytype"] = "dm";if($this->NowPage > 1) $this->Fields["title"] =$this->Fields["title"]."({$this->NowPage})";//预编译$this->LoadTemplet();$this->ParAddTable();$this->ParseTempletsFirst();//跳转网址$this->Fields['flag']=empty($this->Fields['flag'])? "" :$this->Fields['flag'];if(preg_match("#j#", $this->Fields['flag']) &&$this->Fields['redirecturl'] != ''){if($GLOBALS['cfg_jump_once']=='N'){$pageHtml = "<html>\r\n<head>\r\n<metahttp-equiv=\"Content-Type\" content=\"text/html;charset=".$GLOBALS['cfg_soft_lang']."\">\r\n<title>".$this->Fields['t itle']."</title>\r\n";$pageHtml .= "<meta http-equiv=\"refresh\"content=\"3;URL=".$this->Fields['redirecturl']."\">\r\n</head>\r\n<bo dy>\r\n";$pageHtml .= "现在正在转向:".$this->Fields['title'].",请稍候...<br/><br/>\r\n转向内容简介:".$this->Fields['description']."\r\n</body>\r\n</html>\r\n";echo $pageHtml;}else{header("location:{$this->Fields['redirecturl']}");}exit();}$pageCount = $this->NowPage;$this->ParseDMFields($pageCount,0);$this->dtp->display();}/*** 载入模板** @access public* @return void*/function LoadTemplet(){if($this->TempSource==''){$tempfile = $this->GetTempletFile();if(!file_exists($tempfile) || !is_file($tempfile)){echo "文档ID:{$this->Fields['id']} -{$this->TypeLink->TypeInfos['typename']}- {$this->Fields['title']}<br />";echo "模板文件不存在,无法解析文档!";exit();}$this->dtp->LoadTemplate($tempfile);$this->TempSource = $this->dtp->SourceString;}else{$this->dtp->LoadSource($this->TempSource);}}/*** 解析模板,对固定的标记进行初始给值** @access public* @return void*/function ParseTempletsFirst(){if(empty($this->Fields['keywords'])){$this->Fields['keywords'] = '';}if(empty($this->Fields['reid'])){$this->Fields['reid'] = 0;}$GLOBALS['envs']['tags'] = $this->Fields['tags'];if(isset($this->TypeLink->TypeInfos['reid'])){$GLOBALS['envs']['reid'] =$this->TypeLink->TypeInfos['reid'];}$GLOBALS['envs']['keyword'] = $this->Fields['keywords'];$GLOBALS['envs']['typeid'] = $this->Fields['typeid'];$GLOBALS['envs']['topid'] = GetTopid($this->Fields['typeid']);$GLOBALS['envs']['aid'] = $GLOBALS['envs']['id'] =$this->Fields['id'];$GLOBALS['envs']['adminid'] = $GLOBALS['envs']['mid'] =isset($this->Fields['mid'])? $this->Fields['mid'] : 1;$GLOBALS['envs']['channelid'] =$this->TypeLink->TypeInfos['channeltype'];if($this->Fields['reid']>0){$GLOBALS['envs']['typeid'] = $this->Fields['reid'];}MakeOneTag($this->dtp, $this, 'N');}/*** 解析模板,对内容里的变动进行赋值** @access public* @param string $pageNo 页码数* @param string $ismake 是否生成* @return string*/function ParseDMFields($pageNo, $ismake=1){$this->NowPage = $pageNo;$this->Fields['nowpage'] = $this->NowPage;if($this->SplitPageField!='' &&isset($this->Fields[$this->SplitPageField])){$this->Fields[$this->SplitPageField] =$this->SplitFields[$pageNo - 1];if($pageNo>1) $this->Fields['description'] =trim(preg_replace("/[\r\n\t]/", ' ',cn_substr(html2text($this->Fields[$this->SplitPageField]), 200)));}//解析模板if(is_array($this->dtp->CTags)){foreach($this->dtp->CTags as $i=>$ctag){if($ctag->GetName()=='field'){$this->dtp->Assign($i,$this->GetField($ctag->GetAtt('name'), $ctag) );}else if($ctag->GetName()=='pagebreak'){if($ismake==0){$this->dtp->Assign($i,$this->GetPagebreakDM($this->TotalPage,$this->N owPage,$this->ArcID));}else{$this->dtp->Assign($i,$this->GetPagebreak($this->TotalPage,$this->Now Page,$this->ArcID));}}else if($ctag->GetName()=='pagetitle'){if($ismake==0){$this->dtp->Assign($i,$this->GetPageTitlesDM($ctag->GetAtt("style"),$ pageNo));}else{$this->dtp->Assign($i,$this->GetPageTitlesST($ctag->GetAtt("style"),$ pageNo));}}else if($ctag->GetName()=='prenext'){$this->dtp->Assign($i,$this->GetPreNext($ctag->GetAtt('get')));}else if($ctag->GetName()=='fieldlist'){$innertext = trim($ctag->GetInnerText());if($innertext=='') $innertext =GetSysTemplets('tag_fieldlist.htm');$dtp2 = new DedeTagParse();$dtp2->SetNameSpace('field','[',']');$dtp2->LoadSource($innertext);$oldSource = $dtp2->SourceString;$oldCtags = $dtp2->CTags;$res = '';if(is_array($this->ChannelUnit->ChannelFields) &&is_array($dtp2->CTags)){foreach($this->ChannelUnit->ChannelFields as$k=>$v){if(isset($v['autofield']) &&empty($v['autofield'])) {continue;}$dtp2->SourceString = $oldSource;$dtp2->CTags = $oldCtags;$fname = $v['itemname'];foreach($dtp2->CTags as $tid=>$ctag2){if($ctag2->GetName()=='name'){$dtp2->Assign($tid,$fname);}else if($ctag2->GetName()=='tagname'){$dtp2->Assign($tid,$k);}else if($ctag2->GetName()=='value'){$this->Fields[$k] =$this->ChannelUnit->MakeField($k,$this->Fields[$k],$ctag2);@$dtp2->Assign($tid,$this->Fields[$k]); }}$res .= $dtp2->GetResult();}}$this->dtp->Assign($i,$res);}//end case}//结束模板循环}}/*** 关闭所占用的资源** @access public* @return void*/function Close(){$this->FixedValues = '';$this->Fields = '';}/*** 获取上一篇,下一篇链接** @access public* @param string $gtype 获取类型* pre:上一篇 preimg:上一篇图片 next:下一篇 nextimg:下一篇图片* @return string*/function GetPreNext($gtype=''){$rs = '';if(count($this->PreNext)<2){$aid = $this->ArcID;$preR = $this->dsql->GetOne("Select id From `#@__arctiny` where id<$aid And arcrank>-1 And typeid='{$this->Fields['typeid']}' order by id desc");$nextR = $this->dsql->GetOne("Select id From `#@__arctiny` where id>$aid And arcrank>-1 And typeid='{$this->Fields['typeid']}' order by id asc");$next = (is_array($nextR) ? " where arc.id={$nextR['id']}": ' where 1>2 ');$pre = (is_array($preR) ? " where arc.id={$preR['id']} " : ' where 1>2 ');$query = "Selectarc.id,arc.title,arc.shorttitle,arc.typeid,arc.ismake,arc.senddate,ar c.arcrank,arc.money,arc.filename,arc.litpic,t.typedir,t.typename,rule,rule2,t.ispart,t.moresite,t.sit eurl,t.sitepathfrom `#@__archives` arc left join #@__arctype t on arc.typeid=t.id ";$nextRow = $this->dsql->GetOne($query.$next);$preRow = $this->dsql->GetOne($query.$pre);if(is_array($preRow)){$mlink =GetFileUrl($preRow['id'],$preRow['typeid'],$preRow['senddate'],$preRo w['title'],$preRow['ismake'],$preRow['arcrank'],$preRow['namerule'],$preRow['typedir'],$preRow['money'],$preRow['file name'],$preRow['moresite'],$preRow['siteurl'],$preRow['sitepath']);$this->PreNext['pre'] = "上一篇:<ahref='$mlink'>{$preRow['title']}</a> ";$this->PreNext['preimg'] = "<a href='$mlink'><imgsrc=\"{$preRow['litpic']}\" alt=\"{$preRow['title']}\"/></a> ";}else{$this->PreNext['pre'] = "上一篇:没有了 ";$this->PreNext['preimg'] ="<img。