DedeCMS 读取数据库的核心位置主要有两个:
- 全局核心配置文件:
/include/common.inc.php - 数据库操作类文件:
/include/dedesql.class.php
下面我将详细解释这两个文件的作用,以及如何在实际代码中追踪和使用它们。
核心配置文件:/include/common.inc.php
这是整个网站的“总开关”和“连接器”,当网站任何一个页面被加载时,几乎都会首先引入这个文件,它的主要作用是:
- 定义数据库连接信息:在这个文件里,你网站的数据库主机名、用户名、密码和数据库名都是以常量的形式被定义的。
- 建立数据库连接:它会在脚本执行时,自动读取这些常量信息,并使用
mysql_connect()(旧版) 或mysqli_connect()(新版) 函数建立一个到数据库的持久连接。 - 选择数据库:连接成功后,它会使用
mysql_select_db()或mysqli_select_db()函数选择要操作的数据库。 - 设置字符集:它会执行
mysql_query("SET NAMES 'gbk'");或类似的语句,确保网站和数据库之间的数据传输字符集正确(旧版常用GBK,新版常用UTF-8)。
如何找到它?
- 通过 FTP 或文件管理器,登录你的网站根目录。
- 进入
/include/文件夹。 - 找到
common.inc.php文件,用文本编辑器(如 VS Code, Sublime Text, Notepad++)打开它。
你会看到类似这样的代码(以UTF-8版本为例):
//数据库连接信息
$cfg_dbhost = 'localhost'; // 数据库主机
$cfg_dbname = 'dedecmsv57'; // 数据库名
$cfg_dbuser = 'root'; // 数据库用户名
$cfg_dbpwd = 'password'; // 数据库密码
$cfg_dbprefix = 'dede_'; // 数据库表前缀
$cfg_db_language = 'utf8'; // 数据库语言
// ... 其他配置代码 ...
// 连接数据库
if(!$link = @mysqli_connect($cfg_dbhost, $cfg_dbuser, $cfg_dbpwd, $cfg_dbname, $cfg_dbport)){
if(file_exists(dirname(__FILE__).'/../data/admin/errtxt.php')){
header('Location:../data/admin/errtxt.php');
}else{
die("Connect to MySQL server error!<br />Please check your database settings in the file /data/config.cache.inc.php");
}
}
// 设置字符集
mysqli_query($link, "SET NAMES '$cfg_db_language'");
如果你想修改网站的数据库连接信息(比如换了主机或改了密码),主要就是修改这个文件。
数据库操作类:/include/dedesql.class.php
这个文件是 DedeCMS 的“发动机”和“扳手”,它封装了所有与数据库交互的具体操作,SELECT (查询), INSERT (插入), UPDATE (更新), DELETE (删除) 等。
当你需要在某个页面(比如首页、列表页、内容页)读取数据时,并不会直接写 SQL 语句,而是会调用这个类提供的方法。
如何找到它?
- 同样在
/include/文件夹下。 - 找到
dedesql.class.php文件并打开。
这个文件的核心是一个名为 DedeSql (或类似名称) 的类,它提供了以下常用方法:
SetQuery($sql): 设置要执行的SQL语句。Execute(): 执行SQL语句(通常是INSERT,UPDATE,DELETE等写操作)。GetOne(): 执行查询并只返回第一条结果(一个数组)。GetArray(): 执行查询并返回所有结果(一个二维数组)。GetTotalRow(): 获取查询结果的总行数。GetLastID(): 获取最后一次插入操作(INSERT)产生的自增ID。
在实际代码中如何追踪数据读取过程?
以一个常见的场景为例:在首页调用一篇指定的文章。
假设你在首页模板 index.htm 里看到了这样一段代码:
{dede:arclist row='1' titlelen='30'}
<a href='[field:arcurl/]'>[field:title/]</a>
{/dede:arclist}
这段代码由 DedeCMS 的模板引擎解析,当解析 {dede:arclist} 标签时,系统会执行以下步骤:
- 引入核心文件:系统首先会执行
include/common.inc.php,建立数据库连接。 - 调用数据库类:系统会实例化
dedesql.class.php中的DedeSql类。 - 执行查询:系统会根据
arclist标签的参数(row='1'),在DedeSql类中动态生成一条 SQL 查询语句,大概是这个样子:SELECT id, title, arcurl FROM `dede_archives` ORDER BY id DESC LIMIT 1
- 获取数据:系统调用
$dsql->GetArray()方法执行这条 SQL,并将查询到的结果(一个包含id,title,arcurl等字段的数组)返回。 - 填充模板:模板引擎将返回的数据填充到
[field:title/]和[field:arcurl/]的位置,最终生成 HTML 代码输出到浏览器。
如果你想手动修改这个查询逻辑,你需要找到处理 arclist 标签的PHP文件,这个文件通常在 /include/taglib/ 目录下,名为 arclist.lib.php。
打开 arclist.lib.php,你会找到核心的SQL查询和数据库操作代码,
// 在 arclist.lib.php 中
function lib_aritelist(&$ctag, &$refObj){
// ... 一些参数处理 ...
// 拼接SQL语句
$sql = "SELECT * FROM `#@__archives` ORDER BY id DESC LIMIT 0, $row";
// 执行查询
$dsql = new DedeSql(false);
$dsql->SetQuery($sql);
$dsql->Execute('al');
// ... 循环处理结果并返回给模板 ...
}
| 位置 | 文件名 | 作用 | 修改场景 |
|---|---|---|---|
| 全局配置 | /include/common.inc.php |
建立数据库连接,定义连接信息。 | 更换数据库主机、用户名、密码、数据库名。 |
| 数据库操作核心 | /include/dedesql.class.php |
封装所有SQL操作,提供查询、插入等方法。 | 一般不直接修改,除非是深度二次开发。 |
| 标签逻辑处理 | /include/taglib/ 目录下的 .lib.php 文件 |
根据模板标签生成并执行SQL。 | 修改特定标签(如arclist, loop)的查询逻辑和输出。 |
一句话概括:
common.inc.php 负责打开数据库大门,dedesql.class.php 提供了在门内搬运数据的工具箱,而各种 .lib.php 文件则负责根据“订单”(模板标签)来决定具体要搬运哪些数据。
