下面我将从基础到高级,详细讲解如何在帝国CMS模板中调用数据库。

帝国cms 模板调用数据库
(图片来源网络,侵删)

核心基础:[ecms]SQL 语句

在帝国CMS模板中,所有数据库查询操作都围绕一个核心标签:[ecms],这个标签的作用是执行一段SQL查询语句,并将查询结果以特定格式输出到模板中。

[ecms] 标签的基本语法结构:

[e:loop={栏目ID/专题ID, 显示条数, 操作类型, 只看头条, 循环内变量名, 结束符}]
    循环内容,通常包含字段调用标签如:`<?=$bqr[字段名]?>`
[/e:loop]
  • e:loop: 这是循环调用的标签,注意它不是 [ecms][ecms] 是更广义的说法,e:loop 是最常用的数据库调用方式。
  • : 内部是参数,用逗号分隔。
  • [/e:loop]: 循环结束标签。

最常用的调用方式:e:loop 调用栏目信息

这是最常见的需求,比如调用某个栏目下的文章列表。

场景1:调用指定ID的栏目文章

假设我们要调用 栏目ID为 "1" 的栏目下的 10条 文章。

模板代码:

帝国cms 模板调用数据库
(图片来源网络,侵删)
<h2>栏目ID为1的最新文章</h2>
<ul>
[e:loop={1,10,0,0,'newstime DESC'}]
    <li>
        <a href="<?=$bqsr[titleurl]?>" target="_blank"><?=$bqr[title]?></a>
        <span><?=date('Y-m-d', $bqr[newstime])?></span>
    </li>
[/e:loop]
</ul>

参数详解:

  • 1: 栏目ID,如果你想调用多个栏目,可以用逗号隔开,如 1,2,3
  • 10: 显示条数,显示多少条记录。
  • 0: 操作类型
    • 0: 按发布时间排序(默认)。
    • 1: 按ID排序。
    • 2: 按置顶级别排序。
    • 3: 按点击排序。
    • 4: 按评分排序。
    • 5: 按评论排序。
  • 0: 只看头条
    • 0: 不限。
    • 1: 只看头条。
    • 2: 只看非头条。
  • 'newstime DESC': 自定义排序,这是一个强大的功能,可以直接写SQL的 ORDER BY 子句。newstime DESC 表示按发布时间倒序排列,常用的还有 id DESC (按ID倒序)、onclick DESC (按点击量倒序)。

场景2:调用当前栏目下的文章

在栏目列表页或内容页,经常需要调用当前栏目的子栏目或同级栏目文章,这时可以使用 $GLOBALS['navclassid'] 获取当前栏目ID。

模板代码(在栏目列表页):

<h2>当前栏目下的文章</h2>
<ul>
[e:loop={$GLOBALS['navclassid'],10,0,0,'newstime DESC'}]
    <li>
        <a href="<?=$bqsr[titleurl]?>" target="_blank"><?=$bqr[title]?></a>
    </li>
[/e:loop]
</ul>

高级调用:使用自定义SQL语句

e:loop 的参数无法满足复杂需求时,我们可以直接写SQL语句,这提供了最大的灵活性。

帝国cms 模板调用数据库
(图片来源网络,侵删)

场景:调用自定义表中的数据

假设我们有一个自定义数据表 phome_enewsuser(用户表),我们想查询其中的用户名和邮箱。

模板代码:

<h2>用户列表</h2>
<ul>
[e:loop={"select userid, username, email from phome_enewsuser order by userid desc limit 10",10,24,0}]
    <li>
        用户名:<?=$bqr['username']?> | 邮箱:<?=$bqr['email']?>
    </li>
[/e:loop]
</ul>

参数详解:

  • "select userid, username, email from phome_enewsuser order by userid desc limit 10": 这就是完整的 SQL查询语句,注意SQL语句需要用双引号包裹。
  • 10: 显示条数,这里的 limit 10 在SQL中已经写了,这个参数可以写0或保持一致。
  • 24: 操作类型,非常重要!
    • 0: 查询主表 phome_ecms_news 等系统表。
    • 1: 查询附表。
    • 24: 查询任意表,当你查询自定义表或者非标准的系统表时,必须使用 24
  • 0: 只看头条,对自定义表无效,可以写0。

字段调用与常用系统变量

在循环体内,如何获取字段的值?

调用文章/信息字段

系统通过一个数组变量 <?=$bqr?> 将当前循环记录的字段值传递给模板。

  • <?=$bqr[title]?>
  • 标题链接: <?=$bqsr[titleurl]?> (推荐使用,自动处理了动态/静态链接)
  • 缩略图: <?=$bqr[titlepic]?> (如果为空,可以设置默认图:<?=empty($bqr[titlepic]) ? '/images/default.jpg' : $bqr[titlepic]?>)
  • 简介: <?=$bqr[smalltext]?>
  • 发布时间: <?=$bqr[newstime]?> (这是时间戳,需要用 date() 函数格式化)
    • 格式化示例:<?=date('Y-m-d H:i:s', $bqr[newstime])?>
  • 点击数: <?=$bqr[onclick]?>
  • 自定义字段: 如果你在后台添加了自定义字段,address (地址),直接调用 <?=$bqr[address]?> 即可。

常用系统变量

  • $GLOBALS['navclassid']: 当前栏目ID。
  • $public_r['newsurl']: 网站根目录URL。
  • $bqno: 当前循环的序号,从1开始,可以用来实现隔行变色等效果。

示例:隔行变色

<ul>
[e:loop={1,10,0,0}]
    <li class="<?=($bqno % 2 == 0) ? 'even' : 'odd'?>">
        <a href="<?=$bqsr[titleurl]?>"><?=$bqr[title]?></a>
    </li>
[/e:loop]
</ul>

CSS中定义 .even { background-color: #f0f0f0; } 即可。


其他重要调用

调用子栏目列表

使用 GetClass() 函数。

[e:loop={"select classid, classname, classimg from phome_enewsclass where bclassid='$GLOBALS[navclassid]' order by myorder,classid asc",0,24,0}]
    <div class="class-item">
        <a href="<?=$public_r['newsurl']?><?=$bqr[classpath]?>">
            <img src="<?=$bqr[classimg]?:'/images/default-class.jpg'?>" alt="<?=$bqr[classname]?>">
            <span><?=$bqr[classname]?></span>
        </a>
    </div>
[/e:loop]

调用指定专题

专题调用和栏目调用类似,但参数是专题ID。

[e:loop={专题ID, 10, 87, 0}]
    <a href="<?=$bqsr[titleurl]?>"><?=$bqr[title]?></a>
[/e:loop]

操作类型 87 表示调用专题。


安全注意事项

  1. 防止SQL注入

    • 永远不要直接将用户输入(如URL参数)拼接到SQL语句中。
    • 如果需要根据条件查询,优先使用 e:loop 的参数。
    • 如果必须用自定义SQL,请对变量进行过滤或使用预处理语句(在帝国CMS中通常通过函数处理)。
  2. 字段命名规范

    • 调用字段时,确保字段名正确,如果字段名是数据库保留关键字(如 order, key),最好用反引号包裹,如 <?=$bqr[order]?>,但帝国CMS的标签系统通常已经做了处理,直接用 <?=$bqr[order]?> 也可以。
需求场景 推荐方法 示例
调用栏目下的文章 e:loop 基础调用 [e:loop={1,10,0,0}]...[/e:loop]
调用当前栏目文章 e:loop + $GLOBALS['navclassid'] [e:loop={$GLOBALS['navclassid'],10}]...[/e:loop]
复杂排序或筛选 e:loop + 自定义排序 [e:loop={1,10,0,0,'onclick DESC'}]...[/e:loop]
调用自定义表数据 e:loop + 自定义SQL + 操作类型24 [e:loop={"select ...",10,24,0}]...[/e:loop]
调用子栏目 e:loop + GetClass() SQL [e:loop={"select ... from phome_enewsclass ...",0,24,0}]...[/e:loop]

掌握 e:loop 的各种参数组合和自定义SQL的使用,你就可以在帝国CMS模板中实现几乎所有的数据库调用需求,建议多在后台的“自定义页面”功能中测试代码,确认无误后再应用到正式模板中。