Dedecms二次开发sql数据库类详解
我的站长站
2019-08-29
共人阅读
本文基于织梦CMS自带的DedeSql数据库操作类,从建表、连接库、单条/多条查询、数据增删等实操场景讲解用法,适合织梦二次开发、自定义功能开发学习,全程附带可直接运行代码示例。
一、前期准备:创建测试数据表
本次基于已安装完成的织梦CMS(GBK编码)演示,数据表前缀沿用系统默认 dede_。可使用 Navicat、phpmyadmin 工具建表,也可直接在织梦后台「命令行运行器」执行以下sql语句。
-- 创建测试表 dede_test
DROP TABLE IF EXISTS `dede_test`;
CREATE TABLE `dede_test` (
`id` mediumint(8) NOT NULL AUTO_INCREMENT,
`name` char(60) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=gbk;
-- 插入测试数据
INSERT INTO `dede_test` VALUES ('1', '测试名字1');
INSERT INTO `dede_test` VALUES ('2', '这是第二个');
INSERT INTO `dede_test` VALUES ('3', '第三个喽');
INSERT INTO `dede_test` VALUES ('4', '第四个');注意:数据表编码必须和织梦程序编码保持一致(示例为GBK),避免乱码。
二、初始化数据库连接
织梦全局文件 include/common.inc.php 已内置数据库连接逻辑,引入该文件后,系统自动实例化数据库操作对象 $dsql,无需手动配置账号密码。
在网站根目录新建 test.php,写入基础连接代码:
<?php // 引入织梦全局配置,自动初始化 $dsql 数据库对象 require_once (dirname(__FILE__) . "/include/common.inc.php"); // 打印数据库对象,验证连接状态 print_r($dsql); ?>
访问 域名/test.php,页面输出 DedeSql Object 及数据库地址、账号、表前缀等信息,代表数据库连接成功。
三、常用查询操作
1. 判断数据表是否存在 IsTable()
语法:$dsql->IsTable('表名'),返回布尔值,true=表存在,false=表不存在。
2. 查询单条数据 GetOne()
适用于内容详情、单条数据读取,自动在SQL后追加 LIMIT 0,1,返回关联数组。
<?php
require_once (dirname(__FILE__) . "/include/common.inc.php");
// 判断表是否存在
if($dsql->IsTable('dede_test')){
// 查询 id=3 的单条数据
$row = $dsql->GetOne("SELECT * FROM dede_test WHERE id = 3");
print_r($row);
// 单独输出字段值
echo '<br>名称:'.$row['name'];
}
?>3. 查询多条数据 Execute() + 循环读取
用于列表类数据调用,分两种取值方式:GetArray()(数组)、GetObject()(对象);第一个参数为查询标识(自定义字符串,示例统一用 me)。
<?php
require_once (dirname(__FILE__) . "/include/common.inc.php");
if($dsql->IsTable('dede_test')){
$sql = "SELECT * FROM dede_test ORDER BY id ASC";
// 执行查询,绑定标识 me
$dsql->Execute('me',$sql);
// 方式1:GetArray 以数组形式读取
echo "数组方式遍历:<br>";
while($arr = $dsql->GetArray('me')){
echo "ID:{$arr['id']},名称:{$arr['name']}<br>";
}
// 方式2:GetObject 以对象形式读取(重新执行查询)
$dsql->Execute('me',$sql);
echo "<hr>对象方式遍历:<br>";
while($obj = $dsql->GetObject('me')){
echo "ID:{$obj->id},名称:{$obj->name}<br>";
}
// 获取查询结果总条数
echo "<hr>数据总条数:".$dsql->GetTotalRow('me');
}
?>四、数据新增与删除操作
增、删、改统一使用 ExecuteNoneQuery() 方法执行SQL,搭配表单实现前端交互;GetLastID() 可获取最新插入数据的自增ID,ShowMsg() 为织梦全局弹窗跳转函数。
完整示例(查询+表单新增+删除)
<?php
require_once (dirname(__FILE__) . "/include/common.inc.php");
// 接收操作参数
$dopost = empty($dopost) ? '' : $dopost;
$id = empty($id) ? 0 : intval($id);
$name = empty($name) ? '' : trim($name);
// 1、新增数据
if($dopost == "save"){
if(!empty($name)){
$sql = "INSERT INTO `dede_test` (`name`) VALUES ('{$name}')";
$dsql->ExecuteNoneQuery($sql);
// 获取最新插入ID
$lastid = $dsql->GetLastID();
// 弹窗提示并跳转
ShowMsg("新增数据成功!","test.php?id={$lastid}");
exit();
}
}
// 2、删除数据
if($dopost == "del" && $id > 0){
$sql = "DELETE FROM `dede_test` WHERE id = {$id}";
$dsql->ExecuteNoneQuery($sql);
ShowMsg("删除数据成功!","test.php");
exit();
}
?>
<!-- 数据提交表单 -->
<form action="test.php" method="post">
输入名称:<input type="text" name="name">
<input type="hidden" name="dopost" value="save">
<input type="submit" value="提交新增">
</form>
<hr>
<!-- 数据列表+删除链接 -->
<?php
if($dsql->IsTable('dede_test')){
$sql = "SELECT * FROM dede_test ORDER BY id DESC";
$dsql->Execute('me',$sql);
while($obj = $dsql->GetObject('me')){
// 高亮刚新增的记录
if($id == $obj->id){
echo "<font color='red'>ID:{$obj->id},名称:{$obj->name}</font>";
}else{
echo "ID:{$obj->id},名称:{$obj->name}";
}
// 删除链接
echo " <a href='test.php?dopost=del&id={$obj->id}'>【删除】</a><br>";
}
}
?>五、核心方法总结
| 方法名 | 作用 | 适用场景 |
| IsTable() | 检测数据表是否存在 | 前置判断,避免表不存在报错 |
| GetOne() | 查询单条数据,返回数组 | 内容详情、单条配置读取 |
| Execute() | 执行查询SQL,绑定查询标识 | 列表查询前置调用 |
| GetArray() | 以数组形式逐条读取结果 | 习惯数组取值的开发场景 |
| GetObject() | 以对象形式逐条读取结果 | 习惯对象取值的开发场景 |
| GetTotalRow() | 获取查询结果总条数 | 分页、统计数据总量 |
| ExecuteNoneQuery() | 执行增/删/改SQL | 数据写入、更新、删除 |
| GetLastID() | 获取最后一条自增ID | 新增数据后关联跳转、高亮 |
