使用系统后台的SQL命令运行器(最简单、最推荐)
这是最直接、最安全的方法,适用于管理员在后台进行一次性或少量的 SQL 操作。

(图片来源网络,侵删)
适用场景:
- 数据修复
- 批量修改栏目、文章、会员等数据
- 批量添加数据
- 执行简单的数据统计查询
操作步骤:
-
登录 DedeCMS 后台。
-
在顶部菜单栏找到 【系统】 -> 【SQL命令运行工具】。
(图片来源网络,侵删) -
在打开的页面中,你会看到一个文本框。
-
输入你的 SQL 语句。
- 重要提示:如果你的 SQL 语句中包含 DedeCMS 的表前缀(通常是
dede_),并且你不确定后台设置的表前缀是什么,最好使用系统提供的变量{dbprefix},系统会自动将其替换为你在后台配置的实际表前缀。 - 示例1(查询):查询文章标题包含“织梦”的所有文章。
SELECT id, title FROM `{dbprefix}archives` WHERE title LIKE '%织梦%'; - 示例2(更新):将所有文章的
flag属性中的 'c' (推荐) 修改为 'h' (头条)。UPDATE `{dbprefix}archives` SET flag = REPLACE(flag, 'c', 'h') WHERE flag LIKE '%c%'; - 示例3(插入):向一个自定义的表(
dede_mydata)中插入一条记录。INSERT INTO `{dbprefix}mydata` (name, value, addtime) VALUES ('test_key', 'test_value', NOW());
- 重要提示:如果你的 SQL 语句中包含 DedeCMS 的表前缀(通常是
-
选择执行方式:
- 查询:SQL 是
SELECT语句,选择此项,执行后会显示查询结果。 - 不采用事务:对于
UPDATE,DELETE,INSERT等修改数据的操作,通常选择此项,它会立即执行并提交更改。 - 采用事务:适合执行一整套相关的 SQL 语句,如果其中任何一句失败,整个操作将回滚,保证数据一致性,对于新手,建议先使用“不采用事务”。
- 查询:SQL 是
-
点击【提交】按钮。
(图片来源网络,侵删)
注意事项:
- 备份数据! 在执行任何
UPDATE或DELETE操作前,务必备份数据库!这是最重要的安全措施。 - 小心
DELETE:DELETE操作一旦执行,数据很难恢复,建议先用SELECT语句确认要删除的数据是否正确。 - 表前缀:强烈推荐使用
{dbprefix}变量,这样即使更换了网站表前缀,你的 SQL 语句依然有效。
在 PHP 文件中直接执行(适用于二次开发)
当你需要在网站的前端页面或某个自定义的功能模块中执行 SQL 时,可以在 PHP 文件中直接调用 DedeCMS 的数据库操作类。
适用场景:
- 开发新的功能模块
- 在前端页面展示动态数据(如统计信息)
- 与外部程序进行数据交互
实现步骤:
-
引入 DedeCMS 的核心文件,在任何需要操作数据库的 PHP 文件开头,引入
include/common.inc.php文件,这个文件会初始化 DedeCMS 的所有核心环境,包括数据库连接。require_once (dirname(__FILE__) . "/include/common.inc.php");
-
使用
$dsql或$db对象执行 SQL,DedeCMS 在初始化时会创建一个全局的数据库对象$dsql(推荐使用)和$db。示例:查询并显示文章数量
<?php // 1. 引入核心文件 require_once (dirname(__FILE__) . "/include/common.inc.php"); // 2. 定义SQL语句 // 同样,推荐使用 {dbprefix} 来处理表前缀 $sql = "SELECT COUNT(*) AS total FROM `{dbprefix}archives` WHERE channel = 1"; // channel=1 表示文章模型 // 3. 执行查询 // $dsql->GetOne() 用于执行只返回一条记录的查询,结果以关联数组形式返回 $result = $dsql->GetOne($sql); // 4. 处理结果 if (is_array($result)) { $article_count = $result['total']; echo "网站文章总数为: " . $article_count; } else { echo "查询失败或没有文章。"; } // 5. 关闭数据库连接(可选,脚本执行结束后会自动关闭) // $dsql->Close(); ?>其他常用的
$dsql方法:-
查询多行数据 (
GetArray):$sql = "SELECT id, title FROM `{dbprefix}archives` ORDER BY id DESC LIMIT 10"; $arts = $dsql->GetArray($sql); // 返回一个二维数组 foreach ($arts as $art) { echo "<a href='/view.php?aid=" . $art['id'] . "'>" . $art['title'] . "</a><br>"; } -
执行更新/插入/删除 (
ExecuteQuery):$sql = "UPDATE `{dbprefix}archives` SET click = click + 1 WHERE id = 100"; $rs = $dsql->ExecuteQuery($sql); // 执行成功返回true,失败返回false if ($rs) { echo "更新成功!"; } else { echo "更新失败!"; }注意:
ExecuteQuery主要用于执行不返回结果集的 SQL。 -
获取自动增长的ID (
GetLastID):$sql = "INSERT INTO `{dbprefix}mydata` (name) VALUES ('new_data')"; $dsql->ExecuteQuery($sql); $new_id = $dsql->GetLastID(); // 获取刚刚插入记录的ID echo "新插入的记录ID是: " . $new_id;
-
使用Dede标签 {dede:sql}(仅适用于查询)
这是 DedeCMS 提供的一个非常特殊的标签,允许在模板文件(.htm)中直接执行 SQL 查询,并将结果显示在页面上。
适用场景:
- 在首页或栏目页展示自定义的统计信息
- 从其他表中读取数据并展示
- 制作特殊的数据列表
语法格式:
{dede:sql sql=''}
[field:字段名/]
{/dede:sql}
示例1:显示网站总的文章数
在首页模板 index.htm 的任意位置添加以下代码:
网站共有文章数:{dede:sql sql='SELECT COUNT(*) AS total FROM `dede_archives`'}
[field:total/]
{/dede:sql}
注意:这里不能使用 {dbprefix},必须写完整的表名,因为模板解析时不会替换这个变量。
示例2:调用自定义表的数据并循环
假设你有一个表 dede_links,想在首页显示友情链接,你可以这样做:
<div class="friend-links">
<h3>友情链接</h3>
<ul>
{dede:sql sql='SELECT id, url, name FROM `dede_links` WHERE typeid=1 ORDER BY id DESC'}
<li><a href="[field:url/]" target="_blank">[field:name/]</a></li>
{/dede:sql}
</ul>
</div>
{dede:sql} 标签的限制:
- 仅用于查询:不能执行
UPDATE,DELETE,INSERT等修改数据的操作。 - 性能考虑:在模板中直接执行复杂的 SQL 会影响页面加载速度,应谨慎使用。
- 安全性:要防止 SQL 注入,不要直接使用外部变量拼接到 SQL 语句中。
总结与对比
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 后台SQL工具 | 简单直观,无需编程,安全 | 需要登录后台,不适合自动化 | 数据维护、批量修改、一次性操作 |
| PHP文件执行 | 灵活强大,适合复杂逻辑和二次开发 | 需要PHP编程知识,修改文件需上传 | 功能开发、数据同步、动态页面 |
Dede标签{dede:sql} |
无需编程,直接在模板中使用 | 功能有限(仅查询),可能影响性能 | 在模板中展示简单的查询结果 |
最终建议:
- 日常管理和少量数据修改:优先使用 方法一(后台SQL工具),并牢记备份数据。
- 开发新功能或集成系统:使用 方法二(PHP文件执行),这是最规范和灵活的方式。
- 仅在前端页面展示数据:可以考虑使用 方法三(Dede标签),但要评估其对性能的影响。
