• 9983阅读
  • 203回复

2016年1月15日:修正电脑版论坛统计数据主题数和帖子数误差(部分与拆分操作有关) [复制链接] [手机版]

上一主题 下一主题
离线zhangjingyu

只看该作者 168楼 发表于: 2020-09-11 00:06:50 星期五  点亮(0)
之前的输出结果页面比较简单,信息不多,如166楼引用内容部分(也可以参考下面的图片)。

经过此次不断的修改,调试,最终的输出信息多了不少,也更美观了。

当然了,说起来简单,其实用的时间可不少啊。

查询有了,对比起来也更直观了,也就基本上可以确定哪里有问题了。那如何修改数据呢?然后又写了一个文件。其实,这两个文件完全可以组合在一起的,写在一起的话,反而添加的代码并不多。但并不一定每次执行都要修改数据(article字段。统计数据正确的话就没有必要执行,修改数据了),所以还是分开比较好。那这个文件如何执行呢?手动输入文件路径当然可以,但有没有更好,或者更懒的方法呢?想来想去,最后想到可以放在前面的那个文件里啊!于是,就有了上面附件图片中最下面的那个链接(新写的文件中同样的加了之前文件的链接,这样,这两个文件就形成了无限循环)。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!
离线zhangjingyu

只看该作者 169楼 发表于: 2020-09-11 00:15:49 星期五  点亮(0)
就写这些吧,不早了,把两个文件上传到家园空间,测试下。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!
离线zhangjingyu

只看该作者 170楼 发表于: 2020-09-11 00:22:25 星期五  点亮(0)
顺利通过测试(前面提到统计数据比实际多一个帖子,这是修改数据后再执行的结果)!
benban字段总和为(准确数据):44358
article字段总和减去子版块帖子为:44358
父版块FID14“仙妻凡夫◇爱人伴侣”帖子总数为(数据表查询):1072,准确数据为:1072
父版块FID15“聪儿慧女◇教育成长”帖子总数为(数据表查询):868,准确数据为:868
父版块FID47“隐藏版块◇历史版块”帖子总数为(数据表查询):139,准确数据为:139

如果上述两组数据的差值对应不上,请仔细检查数据表pw_forumdata(除去14,15,47外,其它版块的article字段与更新后的benban字段的值应该是一样的)
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!
离线zhangjingyu

只看该作者 171楼 发表于: 2020-09-11 00:23:06 星期五  点亮(0)
不要睡得太晚了,注意身体。晚安!
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!
离线zhangjingyu

只看该作者 172楼 发表于: 2020-09-13 22:06:11 星期日  点亮(0)
44楼提到的完整代码贴下。
require/updateforum.php
  1. function updateforum($fid,$lastinfo='') {//TODO 慢查询
  2.     global $db,$db_fcachenum,$todayTopicNum;
  3.     $fm = $db->get_one("SELECT fup,type,password,allowvisit,f_type FROM pw_forums WHERE fid=".S::sqlEscape($fid));
  4.     if ($fm['type'] != 'category') {
  5.         $subtopics = $subrepliess = 0;
  6.         $query = $db->query("SELECT fid FROM pw_forums WHERE fup=".S::sqlEscape($fid));
  7.         while ($subinfo = $db->fetch_array($query)) {
  8.             @extract($db->get_one("SELECT COUNT(*) AS subtopic,SUM( replies ) AS subreplies FROM pw_threads WHERE fid=".S::sqlEscape($subinfo['fid'])." AND ifcheck='1'"));
  9.             $subtopics   += $subtopic;
  10.             $subrepliess += $subreplies;
  11.             $query2 = $db->query("SELECT fid FROM pw_forums WHERE fup=".S::sqlEscape($subinfo['fid']));
  12.             while ($subinfo2 = $db->fetch_array($query2)) {
  13.                 @extract($db->get_one("SELECT COUNT(*) AS subtopic,SUM( replies ) AS subreplies FROM pw_threads WHERE fid=".S::sqlEscape($subinfo2['fid'])." AND ifcheck='1'"));
  14.                 $subtopics   += $subtopic;
  15.                 $subrepliess += $subreplies;
  16.             }
  17.         }
  18.         $rs       = $db->get_one("SELECT COUNT(*) AS topic,SUM( replies ) AS replies FROM pw_threads WHERE fid=".S::sqlEscape($fid)."AND ifcheck='1' AND topped<=3");
  19.         $topic    = $rs['topic'];
  20.         $replies  = $rs['replies'];
  21.         $article  = $topic + $replies + $subtopics + $subrepliess;
  22.         if (!$lastinfo) {
  23.             $lt = $db->get_one("SELECT tid,author,postdate,lastpost,lastposter,subject FROM pw_threads WHERE fid=".S::sqlEscape($fid)." AND specialsort=0 AND ifcheck=1 AND lastpost>0 ORDER BY lastpost DESC LIMIT 1");
  24.             if ($lt['postdate'] == $lt['lastpost']) {
  25.                 $subject = addslashes(substrs($lt['subject'],26));
  26.             } else {
  27.                 $subject = 'Re:'.addslashes(substrs($lt['subject'],26));
  28.             }
  29.             $author  = addslashes($lt['lastposter']);
  30.             $lastinfo = $lt['tid'] ? $subject."\t".$author."\t".$lt['lastpost']."\t"."read.php?tid=$lt[tid]&page=e#a" : '' ;
  31.         }
  32.         /**
  33.         $db->update("UPDATE pw_forumdata"
  34.             . " SET ".S::sqlSingle(array(
  35.                     'topic'        => $topic,
  36.                     'article'    => $article,
  37.                     'subtopic'    => $subtopics,
  38.                     'lastpost'    => $lastinfo
  39.                 ))
  40.             . " WHERE fid=".S::sqlEscape($fid));
  41.         **/
  42.         pwQuery::update('pw_forumdata', 'fid=:fid', array($fid), array(
  43.                     'topic'        => $topic,
  44.                     'article'    => $article,
  45.                     'subtopic'    => $subtopics,
  46.                     'lastpost'    => $lastinfo
  47.                 ));
  48.         $todayTopicNum && $db->update("UPDATE pw_forumdata SET tpost = tpost+$todayTopicNum WHERE fid    =    " . S::sqlEscape($fid));
  49.         if ($fm['password'] != '' || $fm['allowvisit'] != '' || $fm['f_type'] == 'hidden') {
  50.             $lastinfo = '';
  51.         }
  52.         delfcache($fid,$db_fcachenum);
  53.         if ($fm['type'] == 'sub' || $fm['type'] == 'sub2') {
  54.             updateforum($fm['fup'],$lastinfo);
  55.         }
  56.     }
  57. }
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!
离线zhangjingyu

只看该作者 173楼 发表于: 2020-09-13 23:28:23 星期日  点亮(0)
—— 管理操作 •  zhangjingyu 执行 帖内置顶 操作 (2020-09-13 23:40) ——
假设版块a下面有b和c,也就是a是b和c的父版块,b和c是a的子版块。现在的情况是,在父版块a的版块信息里显示的帖子总数(自己修改过代码,以是否含有子版块加以判断:如果有子版块,也就是当前版块是父版块,那提示文字为“总帖数(含子版)”,否则这个版块就是一级版块,也就是没有子版块,提示文字为“帖数”。因为经过研究发现,在父版块的“帖数”里是包含所有子版块的帖子数的,所以才会尝试修改代码)的计算公式为:Sum(a)=a+b+c。

其实,在版块信息里把子版块的帖子数也计算进去(我们看到的是显示出来)并没有什么意义。就像当初,我也是经过研究才知道是这么一回事(并研究如何修改代码,以区分)。然而,这样计算,除了没有什么实际意义外,影响却是不折不扣。最主要的就是,这样很可能导致论坛帖子总数出现偏差。因为,论坛管理里的拆分操作是避免不了的,而当初的这个拆分操作并不能及时的更新版块信息里的帖子总数,后来自己添加了代码才算基本解决。也就是,当源版块减少n个帖子后,目标版块会增加n个帖子,这个帖子数的变化自己用代码实现的。

再把拆分操作放到版块b或c里。无论b或c是目标版块,还是源版块,经过自己修改过的代码后,版块信息里的帖子总数是实时变化的,也就是版块b或c,也包括对方版块的帖子总数总是正确的。然而,这个变化却无法实时反馈到父版块a的版块信息里。

不区分父版块和子版块,所有版块的帖子数都是对的,意外情况就是求和,因为有动态变化,而这个动态变化却无法如实反馈到求和的结果上。

由于客观偏差的存在,我们才会有后续的不断的努力。按照“原理”,父版块的帖子总数是包含所有子版块的。所以,我们后来在版块信息数据表里添加了新的字段benban记录当前版块的帖子数,所有版块求和,再和数据表里的数据进行对比、校对。并且专门写了如何更新这个benban字段数据的php文件,而且前两天又重新做了修改,补充,和完善。其实,细看数据表,后来添加的benban字段的数据和原表自带的记录版块帖子数的article字段基本没什么差别,因为它本身就是用来校对,对比的。除了目前三个包含子版块的父版块的数据。

其实,我们被带偏了。

就像前面说的,其实所有版块的帖子数都是对的(不区分父版块和子版块),而且在父版块把子版块的帖子数也计算进来根本就没有什么意义,而正是这个求和很可能出现意外。

那么,重新思考。不让父版块把子版块的帖子数计算进去,而是如实反应版块自身的帖子数,也就是,论坛总帖数是所有版块的帖子数之和,不就从根本上解决问题了吗?

这就是今晚想到的,其实就一点,而文字却打了不少。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!
离线zhangjingyu

只看该作者 174楼 发表于: 2020-09-13 23:39:57 星期日  点亮(0)
说了半天绕口令,但也应该算说到点子上了,另外也是对辛苦打字的奖励,帖内置顶。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!
离线zhangjingyu

只看该作者 175楼 发表于: 2020-09-13 23:51:48 星期日  点亮(0)
如172楼代码所示,其实跟我们说到的这些直接相关的只是前面的21行代码。这些代码什么意思,我也只能理解个大概(但用途知道),就像是那句:只能意会,不可言传。 其中最为关键的就是第21行代码:
  $article  = $topic + $replies + $subtopics + $subrepliess;
它非要把子版块(我理解是一级子版块,如果有二级子版块的话,也包括二级子版块)的主题数和回复数计算进去(帖子总数等于主题数加回复数,没毛病)!就是这个公式的问题!只是,直到现在才知道,才明白。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!
离线zhangjingyu

只看该作者 176楼 发表于: 2020-09-14 00:03:11 星期一  点亮(0)
第18行查询,第19行得到主题数,第20行得到回复数,第21行的计算公式改为直接这两项相加,不要后面的,就对了。也就是:
$article  = $topic + $replies;
其实,这就是我的那个自写php文件的核心,在44楼有提到,就是仿照这个。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!
离线zhangjingyu

只看该作者 177楼 发表于: 2020-09-14 00:06:48 星期一  点亮(0)
我想,这一难题,终于有终极解决方案了,很是期待。
不早了,睡觉去。 明天开始本机测试。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!