使用 {dede:sql} 标签(最推荐、最常用)

这是DedeCMS专门为在模板中执行SQL查询而设计的标签,也是最安全、最方便的方法。

dede模板详情执行php 内sql
(图片来源网络,侵删)

语法

{dede:sql sql='你的SQL语句'}
    // 循环体内的HTML代码,使用[field:字段名/]来显示数据
    <li>[field:title/]</li>
{/dede:sql}

核心参数

  • sql (必需): 你要执行的SQL查询语句。
  • itemindex (可选): 设置循环中每个记录的索引变量名,默认为 iitemindex='page',就可以在循环内使用 [field:page/]
  • islocal (可选): 是否将结果集缓存到本地,yesno,对于不常变的数据可以设为 yes 提高性能。

重要注意事项

  1. 表前缀:如果你的数据表有自定义前缀(abc_),而不是默认的 dede_,你需要在SQL语句中写全表名,查询文章表,应该是 SELECT * FROM #@__archives,而不是 SELECT * FROM dede_archives#@__ 是DedeCMS的表前缀占位符,系统会自动替换成你配置的前缀。
  2. 安全与权限{dede:sql} 标签的执行权限非常高,相当于直接执行数据库查询。请务必注意SQL注入风险! 不要直接将用户提交的数据(如URL参数)拼接到SQL语句中,如果必须使用,请进行严格的过滤或使用DedeCMS提供的函数。

示例1:查询指定分类下的文章

假设我们要在首页显示 "产品分类" (ID=5) 下的最新5篇文章。

模板代码:

<h3>最新产品</h3>
<ul>
    {dede:sql sql='SELECT a.id, a.title, a.litpic, c.typename 
                 FROM #@__archives AS a 
                 LEFT JOIN #@__arctype AS c ON a.typeid = c.id 
                 WHERE a.typeid = 5 
                 ORDER BY a.pubdate DESC 
                 LIMIT 0,5'}
        <li>
            <a href="[field:arcurl/]" title="[field:title/]">
                <img src="[field:litpic/]" alt="[field:title/]">
                <span>[field:title/]</span>
            </a>
        </li>
    {/dede:sql}
</ul>

代码解析:

  • SELECT ... FROM #@__archives AS a ...: 从主表 archives (别名为 a) 查询数据。
  • LEFT JOIN #@__arctype AS c ...: 关联分类表 arctype (别名为 c),以获取分类名称 typename
  • WHERE a.typeid = 5: 筛选出分类ID为5的文章。
  • ORDER BY a.pubdate DESC: 按发布时间降序排列。
  • LIMIT 0,5: 只取前5条记录。
  • [field:arcurl/]: 这是一个DedeCMS的内置字段,用于自动生成文章的链接,你也可以自己拼接,如 /plus/view.php?aid=[field:id/]
  • [field:litpic/]: 文章的缩略图。
  • [field:title/]: 文章标题。

使用PHP代码块(功能最强大,需谨慎)

如果你需要非常复杂的逻辑,或者 {dede:sql} 标签无法满足需求,可以直接在模板中嵌入PHP代码。

dede模板详情执行php 内sql
(图片来源网络,侵删)

语法

在模板文件中,使用 <?php ... ?> 标签包裹PHP代码。

<?php
    // 1. 引入数据库操作类
    // 在DedeCMS中,全局变量 $db 已经是数据库连接对象,可以直接使用
    // 2. 编写SQL语句
    $sql = "SELECT id, title FROM #@__archives WHERE typeid = 10 ORDER BY id DESC LIMIT 10";
    // 3. 执行查询
    $dsql = $GLOBALS['dsql']; // 更规范地获取数据库对象
    $arr = $dsql->GetAll($sql); // 使用GetAll获取所有结果,返回一个二维数组
    // 4. 循环输出结果
    if(is_array($arr)){
        foreach($arr as $row){
            echo "<li><a href='/plus/view.php?aid={$row['id']}'>{$row['title']}</a></li>";
        }
    }
?>

代码解析

  • $GLOBALS['dsql']$db: 这是DedeCMS的全局数据库连接对象,使用它来执行SQL查询。
  • $dsql->GetAll($sql): 执行查询并返回一个包含所有结果的数组,如果结果可能很多,可以考虑使用 $dsql->Execute('me', $sql) 然后循环 while($row = $dsql->GetArray('me')) 来节省内存。
  • is_array($arr): 判断查询结果是否为空数组,避免在没有数据时出错。
  • {$row['id']}{$row['title']}: 在PHP双引号字符串中,可以直接使用花括号 来输出数组元素的值,这在模板中非常方便。

使用自定义函数(适用于复用逻辑)

如果你的这段SQL查询需要在多个地方使用,或者逻辑比较复杂,可以将其封装成一个自定义函数,然后在模板中调用。

步骤1:在 include/common.func.php 中添加函数

打开 /include/common.func.php 文件,在文件末尾添加你的函数:

/**
 * 获取指定分类下的文章列表
 * @param int $typeid 分类ID
 * @param int $limit 获取数量
 * @return array 文章列表数组
 */
function GetArticlesByTypeid($typeid, $limit = 10)
{
    global $dsql;
    $sql = "SELECT id, title, litpic FROM #@__archives WHERE typeid = {$typeid} ORDER BY pubdate DESC LIMIT 0, {$limit}";
    $arr = $dsql->GetAll($sql);
    return $arr;
}

步骤2:在模板中调用函数

<h3>热门资讯</h3>
<ul>
    <?php 
        $articles = GetArticlesByTypeid(8, 5); // 获取分类ID为8的最新5篇文章
        if(is_array($articles)){
            foreach($articles as $art){
                echo "<li><a href='/plus/view.php?aid={$art['id']}'><img src='{$art['litpic']}'><span>{$art['title']}</span></a></li>";
            }
        }
    ?>
</ul>

这种方法代码结构更清晰,易于维护和复用。

dede模板详情执行php 内sql
(图片来源网络,侵删)

总结与对比

方法 优点 缺点 适用场景
{dede:sql} 简单、直接、官方推荐,模板代码清晰。 功能相对固定,处理复杂逻辑(如多次查询、循环内嵌套)较麻烦。 绝大多数场景,特别是简单的列表查询、数据统计等。
PHP代码块 功能最强大、最灵活,可以实现任何PHP逻辑。 代码量较大,容易破坏模板的简洁性,如果对PHP不熟悉容易出错。 需要复杂业务逻辑、多次数据库交互、或对数据进行深度处理时。
自定义函数 代码复用性高,逻辑与视图分离,易于维护。 需要修改核心文件(common.func.php),对于新手有一定门槛。 某个功能需要在多个模板中重复使用时。

给你的建议:

  • 首选 {dede:sql},它能解决90%以上的模板内执行SQL的需求。
  • {dede:sql} 标签写出的SQL语句过于复杂和臃肿,或者需要结合PHP的流程控制(如 if/else),再考虑使用 PHP代码块
  • 如果发现同样的查询逻辑在好几个地方都出现了,再考虑将其封装成 自定义函数