关于您在Discuz! X3.5中使用【ror_user_vest】插件遇到的马甲发帖报错问题,结合DZ插件网技术团队的实践经验,给出如下专业解决方案:
---
### **问题根源分析**
Discuz! X3.5的`common_session`表结构已优化为:
- sid CHAR(32), ip VARCHAR(255), groupid SMALLINT(...), ... )
复制代码
原插件使用X3.4的四段式IP存储方式(ip1/ip2/ip3/ip4字段),与新版单字段`ip`的结构冲突导致SQL执行异常。
---
### **完整修复方案**
#### 1. PC端核心文件修改
**文件路径**:`source/plugin/ror_user_vest/ror_user_vest.class.php`
- // 原错误代码(X3.4结构):
- $sql = "REPLACE INTO ".DB::table('common_session')."(sid, ip1, ip2, ip3, ip4, groupid, lastactivity, action, fid, tid, uid, username) VALUES (...)";
- // 修正为(X3.5结构):
- $ip = sprintf('%d.%d.%d.%d', $ips[0], $ips[1], $ips[2], $ips[3]); // 确保IP格式正确
- $sql = "REPLACE INTO ".DB::table('common_session')."
- (sid, ip, groupid, lastactivity, action, fid, tid, uid, username)
- VALUES
- ('$now_sid', '".DB::quote($ip)."', '$vest', '$timestamp', '".DB::quote($discuz_action)."', '".DB::quote($discuz_fid)."', '".DB::quote($discuz_tid)."', '".DB::quote($_G['uid'])."', '".DB::quote($_G['username'])."')";
复制代码
*关键修改点:*
- 使用`DB::quote()`防止SQL注入
- 通过`$_G['uid']`和`$_G['username']`获取当前用户信息
- 用`sprintf`规范IP格式
#### 2. 移动端适配文件修改
**文件路径**:`source/plugin/ror_user_vest/mobileror_user_vest.class.php`
同步应用上述字段调整及安全过滤逻辑,特别注意移动端可能涉及的`$_G`全局变量作用域。
---
### **附加注意事项**
1. **缓存清理**:修改后需到后台 _工具 > 更新缓存_,勾选"模板缓存"和"数据缓存"
2. **IP数据兼容**:若历史马甲账号存在旧版IP分段数据,建议通过SQL迁移:
- UPDATE pre_common_session SET ip = CONCAT(ip1,'.',ip2,'.',ip3,'.',ip4);
复制代码
3. **权限校验**:检查马甲用户组的发帖权限是否在X3.5的 _用户 > 用户组 > 论坛相关_ 中正确配置
4. **HTTPS兼容**:若站点启用SSL,需同步修改插件中所有硬编码HTTP资源为协议自适应格式`//domain.com/path`
---
### **深度优化建议**
若需增强马甲行为真实性,可在插件中集成:
1. 随机延时功能(模拟人工操作间隔)
2. 用户行为轨迹记录(参考`common_member_action`表结构)
3. 马甲池权重分配算法(通过`common_member`表的`extgroupids`字段实现)
如需进一步的技术实施方案或定制开发服务,欢迎到DZ插件网技术交流版块提交需求工单,我们的开发团队可提供深度适配支持。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 |