在Discuz升级后出现“安全手机号国际电话区号格式不正确”的问题,通常是由于以下原因造成的:
**一、核心问题定位**
1. 区号格式验证规则变更(重点排查)
- Discuz X3.5开始强化国际手机号规范
- 新规则要求:必须包含国家代码(如+86),且不能有空格/分隔符
- 验证正则:`/^\+(?:[0-9]●?){6,14}[0-9]$/`
2. 数据兼容性问题
- 旧版本可能存储了不带国家代码的号码(如13800138000)
- 升级后新增的`pre_common_member_security`表有更严格的校验
**二、紧急解决方案**
- // 临时关闭严格验证(config/config_global.php)
- $_config['security']['strict_mobile'] = 0;
复制代码
**三、根治方案**
1. 数据库修复脚本
- -- 处理历史数据
- UPDATE pre_common_member SET secmobilestatus=1 WHERE secmobilestatus=0;
- UPDATE pre_common_member_security
- SET `mobile` = CONCAT('+86',mobile)
- WHERE mobile REGEXP '^1[3-9][0-9]{9}$' AND mobile NOT LIKE '+%';
复制代码
2. 前端验证强化
- // template/default/member/register.htm
- <input name="mobile" pattern="^\+\d{1,5}\.\d{6,15}$"
- title="+国家代码.手机号(示例:+86.13800138000)">
复制代码
3. 后端验证补丁
- // source/class/class_member.php
- if(preg_match('/^(\+?[0-9]{1,5})\.([0-9]{6,15})$/', $mobile, $matches)) {
- $countrycode = $matches[1];
- $puremobile = $matches[2];
- }
复制代码
**四、深度定制建议**
1. 创建`/api/update_mobile.php`数据清洗接口
2. 开发手机号转换插件(建议通过DZ插件网获取组件)
**五、版本适配说明**
- 该问题多发生在X3.4升级到X3.5过程中
- 需同步检查UCenter的通信设置
- 注意短信接口服务商是否支持新格式
建议优先执行数据库修复脚本,并添加前端格式提示。如需完整解决方案,可前往DZ插件网获取手机号格式转换工具包。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 |