最近给Discuz站点搬家,发现普通用户在下载附件时,出现‘抱歉,该附件无法读取’的提示。于是我开始网上搜索,发现也有很多类似问题,但网上的解答不是路径、权限不对,就是附件本身有问题,要么就是同样的问题没人解答。没办法,只好自己想办法了。
先是在 forum_attachment.php 里看了半天,确定那个提示是从这里报出的。报这个提示的情况有很多处,我遇到的是附件不存在。于是我进一步跟踪数据库,终于发现了问题。Discuz的附件是分表存放的,表名像这样 pre_forum_attachment_0, pre_forum_attachment_1, 我这里共有0~9,共10个表,另外有一个表 pre_forum_attachment,保存了全是编号,像aid(附件ID),tid(帖子ID),uid(用户ID),tableid(这个就是表示具体附件信息保存在哪个表中)。于是我找出下载失败的附件的id,搜索 pre_fourm_attachment,得到tableid,再从相应的附件表中查找,发现没有找到,但在另一个附件表中找到了,说明这个问题的原因是附件表中的tableid不同步造成的。这样的话解决方法就明朗了,就是同步tabeid。
解决方法就是执行几条sql语句,像这样:
update workdiz_forum_attachment a, workdiz_forum_attachment_0 b set a.tableid = 0 where a.aid = b.aid;
update workdiz_forum_attachment a, workdiz_forum_attachment_1 b set a.tableid = 1 where a.aid = b.aid;
update workdiz_forum_attachment a, workdiz_forum_attachment_2 b set a.tableid = 2 where a.aid = b.aid;
update workdiz_forum_attachment a, workdiz_forum_attachment_3 b set a.tableid = 3 where a.aid = b.aid;
update workdiz_forum_attachment a, workdiz_forum_attachment_4 b set a.tableid = 4 where a.aid = b.aid;
update workdiz_forum_attachment a, workdiz_forum_attachment_5 b set a.tableid = 5 where a.aid = b.aid;
update workdiz_forum_attachment a, workdiz_forum_attachment_6 b set a.tableid = 6 where a.aid = b.aid;
update workdiz_forum_attachment a, workdiz_forum_attachment_7 b set a.tableid = 7 where a.aid = b.aid;
update workdiz_forum_attachment a, workdiz_forum_attachment_8 b set a.tableid = 8 where a.aid = b.aid;
update workdiz_forum_attachment a, workdiz_forum_attachment_9 b set a.tableid = 9 where a.aid = b.aid;
方法有点土,执行了很多次类似的语句,注意其中的两个数字要相同,否则麻烦大了。执行后,问题解决。
PS: 我的版本是 Discuz! x3, 安装的时候表前缀是可以改的,所以你的表前缀可能不是 workdiz_,所以注意查看实际的表前缀。
评论留言