在 DedeCMS (织梦CMS) 中,判断会员是否登录是一个非常常见的需求,主要有以下几种方法,从最推荐到最不推荐排序。

(图片来源网络,侵删)
使用 global $cfg_ml (最推荐、最标准)
这是 DedeCMS 官方和最推荐的方式。$cfg_ml 是一个全局的会员登录对象,包含了当前登录会员的所有信息。
核心代码:
<?php
require_once(dirname(__FILE__).'/include/common.inc.php'); // 确保引入了核心文件
// 1. 判断会员对象是否存在
if ($cfg_ml) {
// 2. 判断会员ID是否大于0(这是判断是否登录的关键)
if ($cfg_ml->M_ID > 0) {
// 已登录
$memberInfo = $cfg_ml->M_LoginID; // 获取会员用户名
$memberUid = $cfg_ml->M_ID; // 获取会员ID
$memberName = $cfg_ml->M_UserName; // 获取会员昵称
echo "欢迎您," . $memberName . "!";
echo "您的ID是:" . $memberUid;
echo "您的登录名是:" . $memberInfo;
} else {
// 未登录
echo "您尚未登录,请先登录。";
}
} else {
// 在某些特殊页面,$cfg_ml 可能未被初始化,此时也视为未登录
echo "系统未加载会员模块,请确保在正确的页面使用。";
}
?>
代码解析:
require_once(dirname(__FILE__).'/include/common.inc.php');:这是必须的,它初始化了 DedeCMS 的核心环境,包括创建$cfg_ml全局变量。$cfg_ml:这是一个MemberLogin类的实例,代表当前登录的会员。$cfg_ml->M_ID:这是判断是否登录的核心标志,如果会员已登录,M_ID是一个大于 0 的整数;如果未登录,M_ID的值为 0。$cfg_ml->M_LoginID:会员的登录用户名(注册时填写的用户名)。$cfg_ml->M_UserName:会员的昵称。
使用 is_object($cfg_ml) 和 isset($cfg_ml->M_ID)
这是方法一的变体,通过检查对象和属性是否存在来判断,更加严谨一些,可以避免一些潜在的警告。

(图片来源网络,侵删)
<?php
require_once(dirname(__FILE__).'/include/common.inc.php');
// 检查 $cfg_ml 是否是一个对象,M_ID 属性是否存在且大于0
if (is_object($cfg_ml) && isset($cfg_ml->M_ID) && $cfg_ml->M_ID > 0) {
// 已登录
echo "欢迎," . $cfg_ml->M_UserName . "!";
} else {
// 未登录
echo "您尚未登录。";
}
?>
使用 DedeGetMemberLoginInfo() 函数 (不推荐)
这个函数在早期版本中比较常见,它会直接返回一个包含会员信息的数组,但它的可靠性不如直接使用 $cfg_ml 对象,并且在某些情况下可能返回 false 或空数组,判断逻辑稍显复杂。
<?php
require_once(dirname(__FILE__).'/include/common.inc.php');
$memberInfo = DedeGetMemberLoginInfo();
if (is_array($memberInfo) && isset($memberInfo['mid']) && $memberInfo['mid'] > 0) {
// 已登录
echo "欢迎," . $memberInfo['uname'] . "!";
} else {
// 未登录
echo "您尚未登录。";
}
?>
为什么不推荐?
直接操作全局对象 $cfg_ml 是 DedeCMS 的设计模式,更符合其架构,调用额外的函数增加了不必要的开销,且可能因版本不同而产生兼容性问题。
在模板文件中判断 (.htm)
如果你想在 DedeCMS 的模板文件(通常是 templets 目录下的 .htm 文件)里进行判断,可以使用 DedeCMS 的模板标签。
核心标签:
{dede:if} 和 {dede:else}

(图片来源网络,侵删)
示例代码:
{dede:if $cfg_ml->M_ID > 0}
<!-- 会员已登录时显示的内容 -->
<div class="member-logged-in">
欢迎,<strong>[field:uname/]</strong>!
<a href="/member/">会员中心</a>
<a href="/member/index_do.php?fmdo=login&dopost=exit">退出登录</a>
</div>
{dede:else}
<!-- 会员未登录时显示的内容 -->
<div class="member-not-logged-in">
<a href="/member/index_do.php?fmdo=login&dopost=login">登录</a>
<a href="/member/reg_new.php">注册</a>
</div>
{/dede:if}
注意:
- 在模板中,你同样需要确保页面是由 PHP 解析的(首页的
index.htm需要在后台设置为“仅动态”)。 [field:uname/]这个标签在这里可能无法直接获取到$cfg_ml->M_UserName,更稳妥的方式是在 PHP 文件中把会员信息赋值给模板变量,然后在模板中调用,但如果只是简单的判断,$cfg_ml->M_ID在模板中通常是可用的。
总结与最佳实践
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
global $cfg_ml |
PHP 文件中(推荐) | 官方标准,高效,信息全面 | 需要先引入 common.inc.php |
is_object($cfg_ml) |
PHP 文件中(推荐) | 比方法一更严谨,避免警告 | 代码稍长 |
DedeGetMemberLoginInfo() |
PHP 文件中(不推荐) | 早期版本常见 | 可靠性低,不推荐使用 |
{dede:if} |
模板文件中(推荐) | 专为模板设计,使用方便 | 功能相对有限 |
最终建议:
-
在 PHP 逻辑文件中(如
index.php,article.php等),始终使用 方法一:if ($cfg_ml && $cfg_ml->M_ID > 0) { // 已登录逻辑 } -
在模板文件
.htm中,使用 方法四 的{dede:if} -
永远不要依赖
$_SESSION变量来判断,因为 DedeCMS 的会员登录状态是通过$cfg_ml对象来统一管理的,直接操作$_SESSION可能导致状态不一致。
