叛逆的孩子,叛逆的无可奈何! 注册 | 登陆

修改织梦CMS的一小BUG:批量管理_自动分页执行错误的方法

当网站有了点文章后,就想将长文章分页,好在后台有这么个批量管理的功能提供了自动分页的功能.不过,一用才发现,有BUG,不能正常使用这个自动分页的功能,报错如下:

Unknown column 'ID' in 'where clause' - Execute Query False! Select count(*) as dd From dede_addonarticle where ID>0 limit 0,1;

        一看就知道是SQL语句里有问题,错误原因应该是没有ID这个字段.开始想想,应该不会是这么简单的BUG吧,IT柏拉图不至于犯这种小错误吧.(呵呵,不自信的表现,其实,结果还真就是这么回事).于是到QQ群里问了问,没多少人说话,不过还是肥龙龙回答了下,不过,他说的原因和我想的一样简单.之后我再问了些话,他就没再回答了,也许这样的问题已经有人问过太多次了吧,烦了.呵呵.

        管他是不是IT柏拉图的不小心还是其它意外,动手改一下就可以证实到底怎么回事了.

       在那个功能执行区点右键,查看网页地址,如下:http://www.javabus.cn/dede/article_description_action.php?channel=1&dsize=250&table=dede_addonarticle&field=body&msize=512&pagesize=100&sid=&eid=&dojob=page&Submit=%BF%AA%CA%BC%D6%B4%D0%D0%B7%D6%CE%F6.

        OK,找到article_description_action.php文件,开始修改源码.在源码里查找出错时提示的这行SQL代码,晕,没找到,放大范围试试,搜索Select count(*) as dd From dede_addonarticle,还是没找到,妈的,见鬼了,再放大范围,搜索Select count(*) as dd,好了,找到几个地方.其实,不用查找,因为源码很少,就140多行代码,直接看一下,就可以看到注释里有
//--------------------------
//获取自动摘要
//--------------------------


//----------------------------
//更新自动分页
//----------------------------
在这里找一下就可以看到如下代码

//----------------------------
//更新自动分页
//----------------------------

if($dojob=='page'){
  require_once(dirname(__FILE__)."/inc/inc_archives_functions.php");
  //统计记录总数
  if($totalnum==0){
    $addquery  = " where ID>0 ";
     if($sid!=0) $addquery  = " And ID>='$sid' ";
     if($eid!=0) $addquery  = " And ID<='$eid' ";
    $row = $dsql->GetOne("Select count(*) as dd From $table $addquery");
    $totalnum = $row['dd'];
  }
  //获取记录,并分析
  if($totalnum > $startdd+$pagesize) $limitSql = " limit $startdd,$pagesize";
  else if(($totalnum-$startdd)>0) $limitSql = " limit $startdd,".($totalnum - $startdd);
  else $limitSql = "";
  $tjnum = $startdd;
  if($limitSql!=""){
    $addquery  = " where ID>0 ";
    if($sid!=0) $addquery  = " And ID>='$sid' ";
    if($eid!=0) $addquery  = " And ID<='$eid' ";
    $fquery = "Select aid,$field From $table $addquery $limitSql ;";
    $dsql->SetQuery($fquery);
    $dsql->Execute();
    while($row=$dsql->GetArray())
    {
     $tjnum++;
     $body = $row[$field];
     $aid = $row['aid'];
     if(strlen($body) < $msize) continue;
     if(!preg_match("/#p#/iU",$body)){
        $body = SpLongBody($body,$cfg_arcautosp_size*1024,"#p#分页标题#e#");
        $body = addslashes($body);
        $dsql->ExecuteNoneQuery("Update $table set $field='$body' where aid='$aid' ; ");
     }
    }
  }//end if limit

        在上一篇文章::手动使用SQL语句删除织梦DEDECMS系统中文章内容为空以及字数少于X时的文章 里提到了如何查看表结构,并且也说明了DEDE_CMS的文章是分两个表来储存的,所以我们知道,文章内容是存放在dede_addonarticle表里的,而系统的这个自动分页是如何实现的呢?其实就是更新这个表的body字段,自动在这个字段里要分页的地方(通过系统设置的分页字数来确定位置)加上分页符号就OK了,这种方法很简单哦,呵呵,没看源码以前,还以为他是分页后分别将各页存储为一条新记录,再通过外键来连接呢,这样就比较麻烦了.

         通过查看源码,发现了罪魁祸首"ID",我们通过查看dede_addonarticle这个表,发现,根本没有ID这个字段,所以,不报错才怪呢.dede_addonarticle这个表里只有aid,相信这个ID原本应该就是aid,把上面的那段代码里的ID都改成aid.好了,保存,上传到服务器,试一下吧.已经可以了.如果你是不会改,那就复制以下代码覆盖上面那些代码
//----------------------------
//更新自动分页
//----------------------------

if($dojob=='page'){
  require_once(dirname(__FILE__)."/inc/inc_archives_functions.php");
  //统计记录总数
  if($totalnum==0){
    $addquery  = " where aID>0 ";
     if($sid!=0) $addquery  = " And aID>='$sid' ";
     if($eid!=0) $addquery  = " And aID<='$eid' ";
    $row = $dsql->GetOne("Select count(*) as dd From $table $addquery");
    $totalnum = $row['dd'];
  }
  //获取记录,并分析
  if($totalnum > $startdd+$pagesize) $limitSql = " limit $startdd,$pagesize";
  else if(($totalnum-$startdd)>0) $limitSql = " limit $startdd,".($totalnum - $startdd);
  else $limitSql = "";
  $tjnum = $startdd;
  if($limitSql!=""){
    $addquery  = " where aID>0 ";
    if($sid!=0) $addquery  = " And aID>='$sid' ";
    if($eid!=0) $addquery  = " And aID<='$eid' ";
    $fquery = "Select aid,$field From $table $addquery $limitSql ;";
    $dsql->SetQuery($fquery);
    $dsql->Execute();
    while($row=$dsql->GetArray())
    {
     $tjnum++;
     $body = $row[$field];
     $aid = $row['aid'];
     if(strlen($body) < $msize) continue;
     if(!preg_match("/#p#/iU",$body)){
        $body = SpLongBody($body,$cfg_arcautosp_size*1024,"#p#分页标题#e#");
        $body = addslashes($body);
        $dsql->ExecuteNoneQuery("Update $table set $field='$body' where aid='$aid' ; ");
     }
    }
  }//end if limit

        问题解决,收功.如果上面的方法还不行,那你可要先检查一下看你的是哪个版本的哦,如果版本不对,自然会有差别的.我使用的是:织梦DEDECMS(版本名称:DedeCms OX 版本号:4_0RC1 ),

附件: 桌面.rar (3.47 K, 下载次数:42)

Tags: dedecms, 自动分页

« 上一篇 | 下一篇 »

只显示10条记录相关文章

发表评论

评论内容 (必填):