Discuz提示“帖子不存在”

在Discuz中提示帖子不存在有多种可能的情况,今天遇到一种,整理如下:

现象:
1. 帖子列表显示该帖子
2. 点击帖子提示“帖子不存在”
3. forum_thread displayorder为0
4. forum_post invisible为-1
5. forum_threadmod 有限时置顶、删除操作

结论:在删除帖子前执行过限时置顶操作,限时置顶到期后,计划任务(cron_threadexpiry_hourly.php)会自动重置 displayorder字段为 0 ,导致帖子出现在列表中,但是点击提示“帖子不存在”

解决方案:最直接的是更新mysql该行记录displayorder为-1 ,因为此贴本身应该是删除状态(如果有memcache缓存,为了实时生效,需要后台内存管理里更新相应tid fid缓存)。但是最佳优化方案还是要避免次类问题发生,后面抽时间补上方案。


相关资料:

Discuz pre_forum_thread displayorder字段

Discuz pre_forum_threadmod action字段

Discuz pre_forum_post invisible字段

Discuz! X2.5 的 forum_thread 和 forum_post 表的各标记位字段对应的值的说明


3
Feb 2017
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

Discuz pre_forum_thread displayorder字段

  • displayorder : 0  正常
  • displayorder : -1  回收站
  • displayorder : -2 待审核
  • displayorder : -4 草稿帖

3
Feb 2017
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

Discuz pre_forum_post invisible字段

  • invisible :0 正常
  • invisible :-3  已忽略
  • invisible :-2  待审核
  • invisible :-5  回收站
  • invisible : -1 主题帖在回收站中

3
Feb 2017
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

Discuz pre_forum_threadmod action字段

pre_forum_threadmod action字段定义了主题帖相关的操作,可以在这个文件中找到中文描述,source/language/forum/lang_modaction.php。

这里直接贴出来,方便直接查看

$lang = array
(

	'EDT' => '编辑',

	'DEL' => '删除',
	'DLP' => '删除回复',
	'DCM' => '删除点评',
	'PRN' => '批量删帖',
	'UDL' => '反删除',

	'DIG' => '加入精华',
	'UDG' => '解除精华',
	'EDI' => '限时精华',
	'UED' => '解除限时精华',

	'CLS' => '关闭',
	'OPN' => '打开',
	'ECL' => '限时关闭',
	'UEC' => '解除限时关闭',
	'EOP' => '限时打开',
	'UEO' => '解除限时打开',

	'STK' => '置顶',
	'UST' => '解除置顶',
	'EST' => '限时置顶',
	'UES' => '解除限时置顶',

	'SPL' => '分割',
	'MRG' => '合并',

	'HLT' => '设置高亮',
	'UHL' => '解除高亮',
	'EHL' => '限时高亮',
	'UEH' => '解除限时高亮',

	'BMP' => '提升',
	'DWN' => '下沉',

	'MOV' => '移动',
	'CPY' => '复制',
	'TYP' => '分类',

	'RFD' => '强制退款',

	'MOD' => '审核通过',

	'ABL' => '加入文集',
	'RBL' => '移除文集',

	'PTS' => '推送主题',
	'RFS' => '解除推送',
	'RMR' => '取消悬赏',
	'BNP' => '屏蔽帖子',
	'UBN' => '解除屏蔽',

	'REC' => '推荐',
	'URE' => '解除推荐',

	'WRN' => '警告',
	'UWN' => '解除警告',

	'SPA' => '添加图章',
	'SPD' => '撤销图章',

	'SLA' => '添加图标',
	'SLD' => '撤销图标',

	'REG' => '群组推荐',

	'PTA' => '生成文章',

	'MAG' => '道具',

	'REB' => '推送',

	'LIV' => '直播',
	'LIC' => '取消直播',

);


3
Feb 2017
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

Flock,你知多少?

PHP 中的 flock 函数可以让你的站点挂了,你信吗?不可能,不就是一个锁文件嘛。

我们所使用的是 Discuz! X3.2 版本,其中这个helper_log::writelog 函数中使用了 @flock($fp, 2); 此时如果你的日志目录(data/log/)使用了NFS(网络文件系统),这将在某些情况下是有问题的。

阅读剩余部分...

2
Feb 2015
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

Discuz! 自由风格插件

让你的站点个性起来吧。门户、空间、论坛、应用等等每个模块,每个页面都可以使用独有风格。

详情:http://addon.discuz.com/?@tplstyle.plugin


28
Jul 2014
AUTHOR WiFeng
CATEGORY Asset
COMMENTS 2 Comments

Discuz! 链接提示插件

第一个插件终于开发完成了。
下载地址:http://addon.discuz.com/?@linktips.plugin
功能:论坛、微博中的链接,当鼠标滑过时进行提示:打开、复制、举报。后台可以看到举报信息哦,管理员可以根据用户举报的地址进行核对,如果是违法地址,既可以放入黑名单,如果确定是合理的地址,即可放入白名单。

31
May 2012
AUTHOR WiFeng
CATEGORY Web,Asset
COMMENTS 1 Comment

Discuz! X2.5 添加自定义数据调用模块(简单方法)

Discuz!X系列的diy功能还是相当不错的,在对其进行二次开发的过程中,或许需要加入新的数据调用模块,这样可以使你开发的功能模块也像原来的模块一样,只需要点点鼠标,填写一些简单的信息,就可以在各个页面的各个位置显示你想显示的数据啦。

以下就目前最新版X2.5做一个简答的介绍:
大致可以分为以下三个步骤:
一、添加数据调用程序
二、后台更新diy模块分类缓存
三、添加相应的数据模板

具体操作如下:
一、添加数据调用程序
1> 在  source/class/block/ 目录下新建文件夹如 :news
2>
在news文件夹下,新建 blockclass.php,内容如下:

<?php
if(!defined('IN_DISCUZ')) {
	exit('Access Denied');
}
$blockclass = array(
	'name' => lang('blockclass', 'blockclass_resource'),
);
?>

再在news文件夹下,新建 block_news.php,内容如下:

<?php
if(!defined('IN_DISCUZ')) {
	exit('Access Denied');
}

class block_news extends discuz_block {
	
	public $setting = array();

	public function block_news() {
		$this->setting = array(.........); //这儿对setting进行初始化
	}
	
	public function name() {
                // 这儿设置数据来源
		return lang('blockclass', 'blockclass_news_script_news');
	}
	
	public function blockclass() {
                // 这儿设置调用模块类型
		return array('news', lang('blockclass', 'blockclass_news'));
	}
	
	public function fields() {
		$fields = array(.........); //这儿对fields进行设置,除了discuz本身支持的变量外,只有这儿设置的字段才可以在模板中调用。
                return $fields;
	}
	
	public function getsetting() {
		return $this->setting;
	}

	public function getdata($style, $parameter) {
		$list = array(.........);  // 这儿根据实际情况从数据库或许相应的数据
                return array('html' => '', 'data' => $list);
	}
}

?>

以上代码中 lang(....),均为语言处理,这里略过。还有 $setting,$fields,$list的格式可以参考 source/class/block/member/block_member.php中对应变量的格式。

二、进入后台-工具-更新缓存,一定要勾选“DIY 模块分类缓存”,然后开始更新。

三、进入后台-门户-模块模板,在这个下添加你对应的模板。

以上,只是简单说明,~~,因时间有限,只能到此为止啦。。。。。

22
May 2012
AUTHOR WiFeng
CATEGORY Web
COMMENTS 10 Comments

preg_replace的/e修饰符妙用与慎用

preg_replace — 执行正则表达式的搜索和替换
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit ] )
在 subject 中搜索 pattern 模式的匹配项并替换为 replacement 。如果指定了 limit ,则仅替换 limit 个匹配,如果省略 limit 或者其值为 -1,则所有的匹配项都会被替换。

特别注意:
/e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码(在适当的逆向引用替换完之后)。提示:要确保 replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错误。
在Discuz程序中很聪明的利用了这个“e”,比如说在生成模板缓冲的时候,部分php代码执行了,而部分php代码未执行。如下代码:

$template = preg_replace("/([\n\r]+)\t+/s", "\\1", $template);
$template = preg_replace("/\<\!\-\-\{(.+?)\}\-\-\>/s", "{\\1}", $template);
$template = preg_replace("/\{lang\s+(.+?)\}/ies", "\$this->languagevar('\\1')", $template);
$template = preg_replace("/[\n\r\t]*\{block\/(\d+?)\}[\n\r\t]*/ie", "\$this->blocktags('\\1')", $template);

可以看出文字替换就是提前处理了。
上面的这种写法完全可以用下面的方式,显得更加易读易懂

$template = preg_replace("/\{lang\s+(.+?)\}/is", $this->languagevar('\\1'), $template);
在有这些好处的同时,这个"e"往往在不注意的情况下很容易产生漏洞,还请慎用。下面举例说明:

比如说某程序文件中有这样的写法

<?php
function test($str){
	//......
	//......
	return $str;
}
echo preg_replace("/\s*\[php\](.+?)\[\/php\]\s*/ies", 'test("\1")', $_GET["h"]);
?>

提交 ?h=[php]phpinfo()[/php]phpinfo()会被执行吗?
肯定不会。
因为经过正则匹配后, replacement 参数变为'test("phpinfo()")',此时phpinfo仅是被当做一个字符串参数了。
有没有办法让它执行呢?
当然有。
在这里我们如果提交?h=[php]{${phpinfo()}}[/php]phpinfo()就会被执行。
为什么呢?
在php中,双引号里面如果包含有变量,php解释器会将其替换为变量解释后的结果;单引号中的变量不会被处理。
注意:双引号中的函数不会被执行和替换
在这里我们需要通过{${}}构造出了一个特殊的变量,'test("{${phpinfo()}}")',达到让函数被执行的效果 ${phpinfo()} 会被解释执行。

phpinfo() 可以获取到服务器端的各种信息,方便进一步攻击,所以这是每个网站基本应该预防的一点。

如何避免出现上面的漏洞呢?
可以把上面的代码这样写,用户就没有办法攻击了

echo preg_replace("/\s*\[php\](.+?)\[\/php\]\s*/ies", "test('\\1')", $_GET["h"]);

上面的内容仅供学习参考,并无任何恶意。

上面的程序还有一点点小的区别哦,看下面两行代码对比

echo preg_replace("/\s*\[php\](.+?)\[\/php\]\s*/ies", "test('\1')", $_GET["h"]);
//下面两行代码替换是等价的,注意单引号与双引号
echo preg_replace("/\s*\[php\](.+?)\[\/php\]\s*/ies", "test('\\1')", $_GET["h"]);
echo preg_replace("/\s*\[php\](.+?)\[\/php\]\s*/ies", 'test("\1")', $_GET["h"]);


17
May 2012
AUTHOR WiFeng
CATEGORY Web
COMMENTS 2 Comments

Discuz! X2.5 的 forum_thread 和 forum_post 表的各标记位字段对应的值的说明

forum_thread 的 status 字段备注 (位运算存储 0x0000 - FFFF 总共支持16个标志位,其中)
  6543 2109 8765 4321 序号
#B 0000 0000 0000 0001 是否缓存帖子位置信息
#B 0000 0000 0000 0010 是否回帖只对管理人员和发帖者可见
#B 0000 0000 0000 0100 是否抢楼贴
#B 0000 0000 0000 1000 是否倒序查看回帖
#B 0000 0000 0001 0000 是否存在主题图章标志位
#B 0000 0000 0010 0000 回复是否通知作者
#B 0000 0000 0100 0000 是否需要推送到QQ空间
#B 0000 0000 1000 0000 是否需要推送到腾讯微博
#B 0000 0001 0000 0000 是否被收入专辑
#B 0000 0010 0000 0000 是否被转播
#B 0000 0100 0000 0000 [手机标识(联动)] 001(1):含手机文本
#B 0000 1000 0000 0000 [手机标识(联动)] 010(2):含地理位置 011(3):含手机照片
#B 0001 0000 0000 0000 [手机标识(联动)] 100(4):含手机录音
#B 0010 0000 0000 0000 是否成功推送到腾讯微博

forum_thread/forum_post 的 attachment 字段备注
0        无附件
1        有附件
2        有图片附件

forum_thread 的 displayorder 字段备注
4        跨版块置顶
3        3级置顶
2        2级置顶
1        1级置顶
0        正常
-1        回收站
-2        审核中
-3        审核忽略
-4        草稿

forum_post 的 status 字段备注 (位运算存储 0x00000000 - FFFFFFFF 总共支持32个标志位,其中)
  2109 8765 4321 0987 6543 2109 8765 4321 序号
#B 0000 0000 0000 0000 0000 0000 0000 0001 帖子被屏蔽
#B 0000 0000 0000 0000 0000 0000 0000 0010 帖子被警告
#B 0000 0000 0000 0000 0000 0000 0000 0100 帖子审核后再编辑标记,用于防止重复加分
#B 0000 0000 0000 0000 0000 0000 0000 1000 手机版发帖标示
#B 0000 0000 0000 0000 0000 0000 0001 0000 微博回流的帖子标记
#B 0000 0000 0000 0000 0000 0000 0010 0000 [手机]是否显示地理位置
#B 0000 0000 0000 0000 0000 0000 0100 0000 [手机]含手机录音
#B 0000 0000 0000 0000 0000 0000 1000 0000 [手机型号(联动)] 001(1):iOS
#B 0000 0000 0000 0000 0000 0001 0000 0000 [手机型号(联动)] 010(2):Android 011(3):WindowsPhone
#B 0000 0000 0000 0000 0000 0010 0000 0000 [手机型号(联动)] 100:

forum_post 的 invisible 字段备注
0        正常
-1        回收站
-2        审核中
-3        审核忽略/草稿
-4        N/A
-5        回收站回帖

25
Apr 2012
AUTHOR WiFeng
CATEGORY Web
COMMENTS 5 Comments