疑是帝国CMS(EmpireCMS v 6.0)最新BUG

我是个茉鸟,在寻求建站系统时,找到了传说中灵活度最高,最好用的网站管理系统,也就是我要说的帝国cms,于是下载了个EmpireCMS v 6.0来研究一下,在学习帝国CMS的过程中,侧重了解了一下帝国的工作原理,大量的函数,耗了我几天时间才理清楚个来龙去脉。不经意间,发现一个疑是帝国CMS的bug,这个BUG不大不小,对平时的使用基本没什么影响,也就是在删除数据表的时候可能遇到。下面我就放出来吧,让高手们进一步确认。

在/e/class/moddofun.php中有个删除副表分表函数

function DelDataTable($add,$userid,$username){
 global $empire,$dbtbpre,$emod_r;
 //操作权限
 CheckLevel($userid,$username,$classid,"table");
 $tid=(int)$add['tid'];
 $tbname=RepPostVar($add['tbname']);
 $datatb=(int)$add['datatb'];
 if(!$tid||!$tbname||!$datatb)
 {
  printerror("NotChangeDataTable","history.go(-1)");
 }
 $tr=$empire->fetch1("select tid,tbname,datatbs,deftb from {$dbtbpre}enewstable where tid='$tid'");
 if(!$tr['tid'])
 {
  printerror("NotChangeDataTable","history.go(-1)");
 }
 if(!strstr($tr['datatbs'],','.$datatb.','))
 {
  printerror("NotChangeDataTable","history.go(-1)");
 }
 if($tr['deftb']==$datatb||$datatb==1)
 {
  printerror("NotDelDefDataTable","history.go(-1)");
 }
 $newdatatbs=str_replace(','.$datatb.',',',',$tr['datatbs']);
 $sql=$empire->query("update {$dbtbpre}enewstable set datatbs='$newdatatbs' where tid='$tid'");
 //删除信息
 $infosql=$empire->query("select * from {$dbtbpre}ecms_".$tr[tbname]." where stb='$datatb'");
 while($infor=$empire->fetch($infosql))
 {
  $mid=$emod_r[$infor[classid]]['modid'];
  $pf=$emod_r[$mid]['pagef'];
  $stf=$emod_r[$mid]['savetxtf'];
  //分页字段
  if($pf)
  {
   if(strstr($emod_r[$mid]['tbdataf'],','.$pf.','))
   {
    $finfor=$empire->fetch1("select ".$pf." from {$dbtbpre}ecms_".$tr[tbname]."_data_".$datatb." where id='$infor[id]'");
    $infor[$pf]=$finfor[$pf];
   }
  }
  //存文本
  if($stf)
  {
   $newstextfile=$infor[$stf];
   $infor[$stf]=GetTxtFieldText($infor[$stf]);
   DelTxtFieldText($newstextfile);//删除文件
  }
  //删除信息文件
  DelNewsFile($infor[filename],$infor[newspath],$infor[classid],$infor[$pf],$infor[groupid]);
  //删除其它表记录
  $empire->query("delete from {$dbtbpre}enewsqf where id='$infor[id]' and classid='$infor[classid]'");
  $empire->query("delete from {$dbtbpre}enewsinfovote where id='$infor[id]' and classid='$infor[classid]'");
  $empire->query("delete from {$dbtbpre}enewsdiggips where id='$infor[id]' and classid='$infor[classid]'");
  //删除附件
  DelNewsTheFile($infor['id'],$infor['classid']);
 }
 $deltb=$empire->query("delete from {$dbtbpre}ecms_".$tr[tbname]." where stb='$datatb'");
 //删除表
 $deltb=$empire->query("DROP TABLE IF EXISTS {$dbtbpre}ecms_".$tr[tbname]."_data_".$datatb.";");
 GetConfig(1);//更新缓存
 if($sql)
 {
  //操作日志
  insert_dolog("tid=".$tid."<br>tbname=".$tr[tbname]."&datatb=$datatb");
  printerror("DelDataTableSuccess","db/ListDataTable.php?tid=$tid&tbname=$tr[tbname]");
 }
 else
 {
  printerror("DbError","history.go(-1)");
 }
}

帝国CMS bug

红色部分,作者的意思应该是从模型缓存数组里获取当前要操作的栏目对应的模型ID,但本人通过输出emod_r的全部内容,发现这个数组里并没有以模型ID(modid元素),而其第一维下标应该是模板ID(newstempid),这条语句取出的mid可能是错误的。那么后续操作要么误操作,要么失败。我翻开当时学习时的记录(现在已经记得不清楚了),写了个替代的语句。
即:

$mid=$infor[newstempid];

不知道我的理解是否正确,请各位高手抛砖。。。。
文章首发:巴比站长( http://www.babi123.com),转载请注明出处,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值