DedeCMS 技术问答

织梦会员模型扩展字段添加

会员模型与字段总览

织梦会员系统存储于 dede_member 主表,包含账号、密码、邮箱、积分、等级等基础字段。实际业务中常需要扩展更多会员信息,例如:手机号、真实姓名、性别、生日、公司、行业、所在地、头像、个人简介等。

扩展方式有两种:原生会员字段管理会员附加表。掌握二者区别与用法,能灵活满足不同业务场景。

方式一:原生会员字段管理

织梦后台提供了可视化的会员字段管理界面,无需写 SQL 即可添加字段。

操作步骤

1. 登录后台 → 会员会员模型管理

2. 点击“添加新字段”,填写:

字段名称:tel
字段标题:手机号码
字段类型:单行文本
数据类型:varchar
最大长度:20
默认值:(留空)
是否必填:是
前台显示:是
字段值校验:手机号正则 ^1[3-9]\d{9}$

3. 保存后系统会自动在 dede_member 表中新增 tel 字段。

典型扩展字段清单

realname    真实姓名    varchar(50)
gender      性别        radio(男,女)
birthday    生日        date
company     公司        varchar(100)
industry    行业        select
nativeplace 所在地       联动字段
face        头像        img
intro       个人简介    textarea

方式二:会员附加表(高级)

当扩展字段非常多(数十个),直接堆在 dede_member 主表会拖慢登录、查询。此时建议创建独立的“会员附加表”,例如 dede_member_ext,用 mid 与主表关联。

创建附加表

CREATE TABLE `dede_member_ext` (
  `mid` mediumint(8) unsigned NOT NULL,
  `tel` varchar(20) NOT NULL DEFAULT '',
  `realname` varchar(50) NOT NULL DEFAULT '',
  `gender` tinyint(1) NOT NULL DEFAULT '0',
  `birthday` date DEFAULT NULL,
  `company` varchar(100) NOT NULL DEFAULT '',
  `intro` text,
  PRIMARY KEY (`mid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

读写扩展数据

// 读取
function GetMemberExt($mid) {
    global $dsql;
    $row=$dsql->GetOne("SELECT * FROM `dede_member_ext` WHERE mid='{$mid}'");
    return $row ? $row : [];
}

// 写入
function SaveMemberExt($mid, $data) {
    global $dsql;
    $tel=$data['tel'];
    $realname=$data['realname'];
    // 先判断是否存在
    $row=$dsql->GetOne("SELECT mid FROM `dede_member_ext` WHERE mid='{$mid}'");
    if ($row) {
        $dsql->ExecuteNoneQuery("UPDATE `dede_member_ext` SET
            tel='$tel', realname='$realname' WHERE mid='$mid'");
    } else {
        $dsql->ExecuteNoneQuery("INSERT INTO `dede_member_ext`
            (mid, tel, realname) VALUES ('$mid','$tel','$realname')");
    }
}

前台调用会员扩展字段

会员中心首页

{dede:php}
global $dsql, $cfg_ml;
$ext=GetMemberExt($cfg_ml->M_ID);
echo "手机号:".$ext['tel'];
echo "真实姓名:".$ext['realname'];
{/dede:php}

文章页显示作者信息

{dede:field.mid runphp='yes'}
global $dsql;
$mid=@me;
$row=$dsql->GetOne("SELECT m.userid, m.face, e.realname, e.intro
    FROM `dede_member` m
    LEFT JOIN `dede_member_ext` e ON m.mid=e.mid
    WHERE m.mid='$mid'");
@me="<div class='author'>
  <img src='{$row['face']}'>
  <span>{$row['realname']}</span>
  <p>{$row['intro']}</p>
</div>";
{/dede:field.mid}

编辑表单开发

/member/templets/edit_info.htm 中扩展编辑表单:

<form action="edit_info.php" method="post">
  <label>真实姓名:</label>
  <input type="text" name="realname" value="<?php echo $ext['realname']; ?>">

  <label>手机号:</label>
  <input type="text" name="tel" value="<?php echo $ext['tel']; ?>">

  <label>性别:</label>
  <label><input type="radio" name="gender" value="1" <?php if($ext['gender']==1)echo 'checked'; ?>>男</label>
  <label><input type="radio" name="gender" value="2" <?php if($ext['gender']==2)echo 'checked'; ?>>女</label>

  <label>个人简介:</label>
  <textarea name="intro" rows="4"><?php echo $ext['intro']; ?></textarea>

  <button type="submit">保存</button>
</form>

处理脚本 edit_info.php 中调用 SaveMemberExt($cfg_ml->M_ID, $_POST)

注意事项

1. 直接修改 dede_member 表结构会影响织梦升级,建议升级前备份表结构并对照官方 changelog。
2. 扩展字段在注册页(reg_new.php)默认不显示,需手动修改注册模板与处理逻辑。
3. 手机号、邮箱等敏感字段建议加唯一索引,避免重复注册。
4. 用户提交的数据必须用 htmlspecialchars 转义后入库,防止 XSS 注入。
5. 联动字段(如地区)需要先在“联动类别管理”中配置枚举,会员字段才能正常调用。

后续行动建议

会员字段扩展后,建议同步梳理“字段-表单-调用”清单,标注每个字段是否必填、是否对外展示、由谁维护。对于业务复杂的站点,可考虑把会员附加表拆为多个领域表(如基础信息表、企业信息表、社交信息表),通过 mid 关联,避免单表字段膨胀。同时开发会员数据导出功能,便于运营做精准营销与用户画像分析,让会员数据真正支撑业务决策。