本帖最后由 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文件,
找到
- $filter = !empty($filter) && in_array($filter, $promptkeys) ? $filter : '';
- $newexists = FALSE;
复制代码 替换为
- $tarr = array();
- foreach ($promptpmids as $id) {
- $id = (int) $id;
- $id && $tarr[] = $id;
- }
- $promptpmids = $tarr;
- unset($tarr, $id);
- $filter = !empty($filter) && in_array($filter, $promptkeys) ? $filter : '';
- $newexists = FALSE;
复制代码
找到
- $today = $timestamp - ($timestamp + $timeoffset * 3600) % 86400;
- $count = $db->result_first("SELECT count(*) FROM {$tablepre}promptmsgs WHERE uid='$discuz_uid' $typeadd");
复制代码 修改为
- $today = $timestamp - ($timestamp + $timeoffset * 3600) % 86400;
- // waiting: ADD work around for new prompt always show even no new one
- foreach ($prompts as $row) {
- $newexists || isset($row['new']) && ($newexists = $newexists || $row['new']);
- }
- $newexists = $newexists || $db->result_first("SELECT 1 FROM {$tablepre}promptmsgs WHERE uid = '$discuz_uid' AND "new" = 1 LIMIT 1");
- $count = $db->result_first("SELECT count(*) FROM {$tablepre}promptmsgs WHERE uid='$discuz_uid' $typeadd");
复制代码
找到
- while($row = $db->fetch_array($query)) {
- if($row['new']) {
- $newexists = 1;
- }
复制代码 修改为
- while($row = $db->fetch_array($query)) {
- // if($row['new']) {
- // $newexists = 1;
- // }
复制代码
打开 include/global.func.php 文件,找到
- function updateprompt($key, $uid, $number, $updatedb = 1) {
- global $db, $tablepre, $prompts;
- $prompts = $prompts ? $prompts : $GLOBALS['_DCACHE']['settings']['prompts'];
- if($updatedb) {
- if($number) {
- $db->query("REPLACE INTO {$tablepre}prompt (uid, typeid, number) VALUES ('$uid', '".$prompts[$key]['id']."', '$number')");
- $db->query("UPDATE {$tablepre}members SET prompt=prompt|1 WHERE uid='$uid'", 'UNBUFFERED');
- } else {
- $db->query("DELETE FROM {$tablepre}prompt WHERE uid='$uid' AND typeid='".$prompts[$key]['id']."'");
- if(!$db->result_first("SELECT count(*) FROM {$tablepre}prompt WHERE uid='$uid'")) {
- $db->query("UPDATE {$tablepre}members SET prompt=prompt^1 WHERE uid='$discuz_uid' AND prompt=prompt|1", 'UNBUFFERED');
- }
- }
- }
- return '$(\'prompt_'.$key.'\').innerHTML=\''.$prompts[$key]['name'].($number ? ' ('.$number.')\';$(\'prompt_'.$key.'\').parentNode.style.display=\'\';' : '\';');
- }
复制代码 全部替换成
- function updateprompt($key, $uid, $number, $updatedb = 1) {
- global $db, $tablepre, $prompts, $timestamp;
- $prompts = $prompts ? $prompts : $GLOBALS['_DCACHE']['settings']['prompts'];
- $uid = $uid > 0 ? $uid : 0;
- if ($uid && $updatedb) {
- $timestamp || $timestamp = time();
- if ($number) {
- $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')");
- $db->query("UPDATE {$tablepre}members SET prompt = prompt | 1 WHERE uid = '$uid'");
- } else {
- $db->query("DELETE FROM {$tablepre}prompt WHERE uid = '$uid' AND typeid = '{$prompts[$key]['id']}'");
- $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");
- }
- // waiting: 随机重置
- 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");
- }
- }
- return "\$('prompt_{$key}').innerHTML='{$prompts[$key]['name']}". ($number ? " ($number)';\$('prompt_{$key}').parentNode.style.display='';" : "';");
- }
复制代码 至此提醒状态不正常的bug基本解决
原来代码的- $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]了。
另外,此段代码
- $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");
- while($row = $db->fetch_array($query)) {
- if($row['new']) {
- $newexists = 1; // <----
- }
- .....
- }
复制代码 在结果集循环内判断新提醒的做法似乎存在问题,因为这个结果集是 LIMIT 限定取出部分结果,会导致对新提醒判断的遗漏。也许这样做是避免分页外新提醒在刷新后也被处理成已读从而让会员忽视吧。
|