- 前端表单提交页面:处理用户输入和基本的客户端验证。
- 后端核心处理页面:执行真正的数据验证、入库和判定。
下面我将详细分解这两个部分,并指出关键的代码位置和判定逻辑。

前端表单提交页面
这是用户看到并填写注册信息的页面,它的主要作用是收集用户输入,并进行一些基础的、实时的验证(比如密码长度、两次密码是否一致等),以提升用户体验。
核心文件位置
- 默认路径:
/member/reg_new.php - 模板文件:
/member/templets/reg_new.htm
关键判定逻辑
当用户在前端填写完信息并点击“注册”按钮后,会触发JavaScript进行验证,这些验证通常位于 reg_new.php 文件中,或者在 reg_new.htm 模板文件里通过 <script> 标签嵌入。
在 reg_new.php 文件中,你可以找到类似这样的代码段:
// ... 其他代码 ...
if(empty($dopost))
{
$dopost = '';
}
// 处理注册提交
if($dopost == "reg")
{
// 1. 获取并过滤POST提交的数据
$mid = 0;
$userid = HtmlReplace($userid, 1);
$uname = HtmlReplace($uname, 1);
$pwd = preg_replace('# #', '', $pwd);
$pwd2 = preg_replace('# #', '', $pwd2);
$email = HtmlReplace($email, 1);
$safequestion = isset($safequestion) ? HtmlReplace($safequestion, 1) : '';
$safeanswer = HtmlReplace($safeanswer, 1);
$sex = isset($sex) ? intval($sex) : 0;
$birthday = HtmlReplace($birthday, 1);
// 2. 核心判定逻辑开始
// a. 检查用户名是否为空
if(empty($userid))
{
ShowMsg('用户名不能为空!', '-1');
exit();
}
// b. 检查密码是否为空
if(empty($pwd))
{
ShowMsg('密码不能为空!', '-1');
exit();
}
// c. 检查两次输入的密码是否一致
if($pwd != $pwd2)
{
ShowMsg('两次输入的密码不一致!', '-1');
exit();
}
// d. 检查用户名是否已被注册(这是一个非常重要的判定!)
$row = $dsql->GetOne("SELECT * FROM `#@__member` WHERE userid='$userid' OR uname='$uname' ");
if(is_array($row))
{
ShowMsg('您注册的用户名已经存在,请更换一个!', '-1');
exit();
}
// e. 检查Email格式是否正确,以及是否已被注册
if(!preg_match("/^[_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,4}$/", $email))
{
ShowMsg('Email格式不正确!', '-1');
exit();
}
$row = $dsql->GetOne("SELECT * FROM `#@__member` WHERE email='$email' ");
if(is_array($row))
{
ShowMsg('您注册的Email已经存在,请更换一个!', '-1');
exit();
}
// f. 检查验证码(如果开启了)
if($safequestion != '')
{
if($safeanswer == '')
{
ShowMsg('请输入安全问题的答案!', '-1');
exit();
}
}
else
{
if($vdcode != $safequestion)
{
ShowMsg('验证码错误!', '-1');
exit();
}
}
// ... 其他判定,如用户名规则、邮箱规则等 ...
// 3. 如果所有判定都通过,则调用会员模型进行注册
$uid = $uid + 1;
$jointime = time();
$joinip = GetIP();
$pwd = md5($pwd);
// 准备插入数据库的数据
$inquery = "INSERT INTO `#@__member`(
`mid`, `mtype`, `userid`, `pwd`, `uname`, `sex`, `email`,
`scores`, `matt`, `rank`, `money`, `regdate`, `jointime`,
`joinip`, `logintime`, `loginip`
) VALUES (
'$uid', '个人', '$userid', '$pwd', '$uname', '$sex', '$email',
'0', '0', '10', '0', '$jointime', '$jointime',
'$joinip', '0', ''
);";
// 执行插入操作
if($dsql->ExecuteNoneQuery($inquery))
{
// 注册成功后的处理,如登录、跳转等
// ...
}
else
{
ShowMsg('注册失败,请联系管理员!', '-1');
exit();
}
}
// ... 其他代码 ...
小结:前端的 reg_new.php 是第一道防线,负责执行绝大多数的“判定”操作,

- 数据非空判定。
- 密码一致性判定。
- 用户名唯一性判定(查数据库)。
- Email唯一性判定(查数据库)。
- 验证码判定。
- 用户名/Email格式判定。
后端核心处理页面(涉及更复杂的判定)
除了 reg_new.php,织梦还有一个更底层的会员处理类,它封装了会员注册、登录等核心逻辑,如果你在后台开启了“会员需审核”等功能,那么这里的判定就至关重要。
核心文件位置
- 核心类文件:
/include/membermodel.class.php
关键判定逻辑
这个 MemberModel 类是所有会员操作的核心,当你调用它的注册方法时,会执行一系列更深层次的判定。
在 reg_new.php 中,如果开启了更复杂的会员模型,它可能会调用这个类的方法:
// 在 reg_new.php 的某个位置,可能会看到这样的调用 // $member = new MemberModel(); // $result = $member->addUser($data);
在 membermodel.class.php 的 addUser 或类似方法中,你会找到以下判定:

-
会员模型类型判定:
织梦支持多种会员模型(如普通会员、企业会员等),这里会判定你提交的数据是否符合当前所选会员模型的要求,比如企业会员需要填写公司名称、营业执照等。
-
字段有效性判定:
会检查所有必填字段是否都已填写,并且符合字段的定义(如文本长度、数字类型等)。
-
扩展字段的判定:
如果注册表单包含了自定义的扩展字段(如手机号、地址等),这里的逻辑会负责验证这些字段的唯一性、格式等。
-
会员审核状态判定:
- 这是最重要的一个后台判定,在数据库的
#@__member表中,有一个status字段。status = -1:禁用status = 0:未审核(需要管理员在后台手动审核)status = 1:正常
- 在
membermodel.class.php中,系统会根据后台的全局设置(系统设置 -> 会员设置 -> 新注册用户是否需要审核)来决定新注册用户的status值。 - 如果设置为“需要审核”,那么即使前端注册成功,用户也无法立即登录。后端判定会将其
status设为0,并可能发送一封通知邮件给管理员。
- 这是最重要的一个后台判定,在数据库的
数据库表中的判定
所有的判定结果都会反映在数据库里,你需要关注以下几个表:
-
#@__member(主会员表):userid,uname: 用户名,唯一索引,数据库层面会防止重复。email: 邮箱,唯一索引,数据库层面会防止重复。pwd: 密码,存储的是MD5哈希值。status: 核心状态字段,决定会员是否可用。
-
#@__member_purview(会员权限表):新会员注册成功后,系统会自动为该会员创建一条权限记录。
-
#@__member_space(会员空间表):如果开启了会员空间,会为该会员创建一个空间记录。
| 位置 | 文件/表 | 主要判定功能 |
|---|---|---|
| 前端 | /member/reg_new.php |
数据非空、格式验证 用户名唯一性判定 Email唯一性判定 密码一致性判定 验证码判定 |
| 后端核心 | /include/membermodel.class.php |
会员模型类型判定 扩展字段验证 会员审核状态判定 ( status字段)调用数据库接口执行最终入库 |
| 数据库 | #@__member |
通过唯一索引强制保证用户名和邮箱的唯一性 通过 status 字段控制会员的可用状态 |
当你要修改注册判定逻辑时:
- 修改简单的验证规则(如用户名长度、密码强度):直接编辑
/member/reg_new.php。 - 修改核心业务逻辑(如增加新字段验证、修改审核流程):需要编辑
/include/membermodel.class.php。 - 检查为什么用户名重复还能注册:检查
reg_new.php里的查询逻辑,以及数据库#@__member表的userid和uname字段是否有正确的唯一索引。
