Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

DZ 7.2 提醒状态不正常的解决方法

[复制链接]
mark35 发表于 2012-8-29 11:07:26 | 显示全部楼层 |阅读模式
本帖最后由 mark35 于 2012-12-3 19:51 编辑

DZ 7.2有个小问题时不时会出现,就是时不时header上会显示有新提醒,点击查看后过一会又有新提醒,但点击进去之后却发现没有新的。此状况不定期出现,有时候在无新提醒记录的情况下也会误报。

截图用这位朋友的  https://discuz.dismall.com/forum.php?mod=viewthread&tid=3069016

解决办法如下

1、备份 notice.php 和 include/global.func.php 文件

2、
编辑 /notice.php文件,
找到

  1. $filter = !empty($filter) && in_array($filter, $promptkeys) ? $filter : '';
  2. $newexists = FALSE;
复制代码
替换为

  1. $tarr = array();
  2. foreach ($promptpmids as $id) {
  3.     $id = (int) $id;
  4.     $id && $tarr[] = $id;
  5. }
  6. $promptpmids = $tarr;
  7. unset($tarr, $id);

  8. $filter = !empty($filter) && in_array($filter, $promptkeys) ? $filter : '';
  9. $newexists = FALSE;
复制代码


找到

  1. $today = $timestamp - ($timestamp + $timeoffset * 3600) % 86400;

  2. $count = $db->result_first("SELECT count(*) FROM {$tablepre}promptmsgs WHERE uid='$discuz_uid' $typeadd");
复制代码
修改为

  1. $today = $timestamp - ($timestamp + $timeoffset * 3600) % 86400;

  2. // waiting: ADD work around for new prompt always show even no new one
  3. foreach ($prompts as $row) {
  4.     $newexists || isset($row['new']) && ($newexists = $newexists || $row['new']);
  5. }
  6. $newexists = $newexists || $db->result_first("SELECT 1 FROM {$tablepre}promptmsgs WHERE uid = '$discuz_uid' AND "new" = 1 LIMIT 1");

  7. $count = $db->result_first("SELECT count(*) FROM {$tablepre}promptmsgs WHERE uid='$discuz_uid' $typeadd");
复制代码


找到

  1. while($row = $db->fetch_array($query)) {
  2.     if($row['new']) {
  3.         $newexists = 1;
  4.     }
复制代码
修改为

  1. while($row = $db->fetch_array($query)) {
  2. //    if($row['new']) {
  3. //        $newexists = 1;
  4. //    }
复制代码



打开 include/global.func.php 文件,找到

  1. function updateprompt($key, $uid, $number, $updatedb = 1) {
  2.     global $db, $tablepre, $prompts;
  3.     $prompts = $prompts ? $prompts : $GLOBALS['_DCACHE']['settings']['prompts'];
  4.     if($updatedb) {
  5.         if($number) {
  6.             $db->query("REPLACE INTO {$tablepre}prompt (uid, typeid, number) VALUES ('$uid', '".$prompts[$key]['id']."', '$number')");
  7.             $db->query("UPDATE {$tablepre}members SET prompt=prompt|1 WHERE uid='$uid'", 'UNBUFFERED');
  8.         } else {
  9.             $db->query("DELETE FROM {$tablepre}prompt WHERE uid='$uid' AND typeid='".$prompts[$key]['id']."'");
  10.             if(!$db->result_first("SELECT count(*) FROM {$tablepre}prompt WHERE uid='$uid'")) {
  11.                 $db->query("UPDATE {$tablepre}members SET prompt=prompt^1 WHERE uid='$discuz_uid' AND prompt=prompt|1", 'UNBUFFERED');
  12.             }
  13.         }
  14.     }
  15.     return '$(\'prompt_'.$key.'\').innerHTML=\''.$prompts[$key]['name'].($number ? ' ('.$number.')\';$(\'prompt_'.$key.'\').parentNode.style.display=\'\';' : '\';');
  16. }
复制代码
全部替换成

  1. function updateprompt($key, $uid, $number, $updatedb = 1) {
  2.     global $db, $tablepre, $prompts, $timestamp;
  3.     $prompts = $prompts ? $prompts : $GLOBALS['_DCACHE']['settings']['prompts'];
  4.     $uid = $uid > 0 ? $uid : 0;

  5.     if ($uid && $updatedb) {
  6.         $timestamp || $timestamp = time();
  7.         if ($number) {
  8.             $db->query("UPDATE {$tablepre}prompt SET number = '$number' WHERE uid = '$uid' AND typeid = '{$prompts[$key]['id']}'") || $db->query("INSERT INTO {$tablepre}prompt (uid, typeid, number) VALUES ('$uid', '{$prompts[$key]['id']}', '$number')");
  9.             $db->query("UPDATE {$tablepre}members SET prompt = prompt | 1 WHERE uid = '$uid'");
  10.         } else {
  11.             $db->query("DELETE FROM {$tablepre}prompt WHERE uid = '$uid' AND typeid = '{$prompts[$key]['id']}'");
  12.             $db->result_first("SELECT 1 FROM {$tablepre}prompt WHERE uid = '$uid' AND number > 0 LIMIT 1") || $db->query("UPDATE {$tablepre}members SET prompt = '0' WHERE uid = '$uid' AND prompt = 1");
  13.         }

  14.         // waiting: 随机重置
  15.         mt_rand(0, 10) || $db->result_first("SELECT prompt FROM {$tablepre}members WHERE uid = '$uid'") && $db->result_first("SELECT 2 FROM {$tablepre}prompt WHERE uid = '$uid' AND number > 0 LIMIT 1") && !$db->result_first("SELECT 3 FROM {$tablepre}promptmsgs WHERE uid = '$uid' AND "new" = 1 LIMIT 1") && $db->query("UPDATE {$tablepre}members SET prompt = 0 WHERE uid = '$uid'") && $db->query("DELETE FROM {$tablepre}prompt WHERE uid = '$uid'") && $db->query("UPDATE {$tablepre}promptmsgs SET "new" = 0 WHERE uid = '$uid' AND "new" = 1");
  16.         }
  17.     }
  18.     return "\$('prompt_{$key}').innerHTML='{$prompts[$key]['name']}". ($number ? " ($number)';\$('prompt_{$key}').parentNode.style.display='';" : "';");
  19. }

复制代码
至此提醒状态不正常的bug基本解决





原来代码的
  1. $db->query("UPDATE {$tablepre}members SET prompt=prompt^1 WHERE uid='$discuz_uid' AND prompt=prompt|1", 'UNBUFFERED');
复制代码
处理方式挺奇怪的,就是这条代码导致了 cdb_members.prompt 和 cdb_prompt 状态的不一致—— 前者表示有新提醒,但后者实际无记录。我没查到prompt大于1值是否有其他特殊用途,暂时限定值在[0,1]了。

另外,此段代码

  1. $query = $db->query("SELECT id AS pmid, new, message, dateline, typeid, actor FROM {$tablepre}promptmsgs WHERE uid='$discuz_uid' $typeadd ORDER BY dateline DESC LIMIT $start_limit, $ppp");
  2. while($row = $db->fetch_array($query)) {
  3.     if($row['new']) {
  4.         $newexists = 1;   // <----
  5.     }
  6. .....
  7. }
复制代码
在结果集循环内判断新提醒的做法似乎存在问题,因为这个结果集是 LIMIT 限定取出部分结果,会导致对新提醒判断的遗漏。也许这样做是避免分页外新提醒在刷新后也被处理成已读从而让会员忽视吧。






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

评分

2

查看全部评分

m.king 发表于 2012-8-29 11:12:29 | 显示全部楼层
感谢反馈,该问题我们稍后核查看!
回复

使用道具 举报

no334180 发表于 2012-8-29 13:39:42 | 显示全部楼层
我丟第一個檔沒問題,但是改好丟入 global.func.php 這個檔我論壇就會出現500內伺服器錯誤之類的。
回复

使用道具 举报

 楼主| mark35 发表于 2012-8-29 13:45:06 | 显示全部楼层
本帖最后由 mark35 于 2012-12-3 19:51 编辑
no334180 发表于 2012-8-29 13:39
我丟第一個檔沒問題,但是改好丟入 global.func.php 這個檔我論壇就會出現500內伺服器錯誤之類的。

问题查到,代码是从我修改的版本中抓出的,有些地方在原版dz72下存在兼容性问题。已经修正了。你再试试。
回复

使用道具 举报

no334180 发表于 2012-8-29 13:51:29 | 显示全部楼层
mark35 发表于 2012-8-29 13:45
问题查到,代码是从我修改的版本中抓出的,有些地方在原版dz72下存在兼容性问题。已经修正了。你再试试。

對了,我有一段查找是

$filter = !empty($filter) && in_array($filter, $promptkeys) ? $filter : '';
$newexists = 0;

下面跟你的不一樣?
回复

使用道具 举报

no334180 发表于 2012-8-29 13:56:34 | 显示全部楼层
本帖最后由 no334180 于 2012-8-29 13:59 编辑
mark35 发表于 2012-8-29 13:45
问题查到,代码是从我修改的版本中抓出的,有些地方在原版dz72下存在兼容性问题。已经修正了。你再试试。


發現這次沒有出錯了,不過頁面全都顯示空白而以。


似乎都跟這個檔有關?
global.func.php



我直接把我這兩個檔附上好了,給你看看。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

 楼主| mark35 发表于 2012-8-29 14:11:57 | 显示全部楼层
本帖最后由 mark35 于 2012-9-7 13:39 编辑
no334180 发表于 2012-8-29 13:56
發現這次沒有出錯了,不過頁面全都顯示空白而以。

试试这个


回复

使用道具 举报

no334180 发表于 2012-8-29 14:36:58 | 显示全部楼层
本帖最后由 no334180 于 2012-8-29 14:40 编辑
mark35 发表于 2012-8-29 14:11
试试这个


試了發現首頁一樣只呈現空白頁面而以。

我的論壇是 DZ7.2 UTF8 繁體,跟版本有關嗎?
回复

使用道具 举报

 楼主| mark35 发表于 2012-8-29 14:40:16 | 显示全部楼层
no334180 发表于 2012-8-29 14:36
試了發現首頁一樣只呈現空白頁面而以。

DZ7.2 UTF8 繁體,跟版本有關嗎?

修改的部分不涉及编码
这倒奇怪了,我这儿运行没问题的呀
你把php_displayerror打开,看看错误是什么。或者看web日志
回复

使用道具 举报

no334180 发表于 2012-8-29 14:55:28 | 显示全部楼层
mark35 发表于 2012-8-29 14:40
修改的部分不涉及编码
这倒奇怪了,我这儿运行没问题的呀
你把php_displayerror打开,看看错误是什么。 ...


抱歉,想問說這兩個要到哪看?是資料庫嗎?

因為我大概只會安裝論壇基礎,有些內容我就比較不懂了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2025-2-27 22:51 , Processed in 0.043354 second(s), 8 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表