织梦cms教程

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新增数据后关联跳转、高亮

六、补充注意事项

  1. 文件编码:自定义PHP文件编码需和织梦程序一致(GBK/UTF-8),防止数据乱码;

  2. SQL安全:正式开发建议对 $_post、$_GET 参数做过滤转义,防止SQL注入;

  3. 函数说明:ShowMsg() 是织梦全局跳转提示函数,定义在 include/common.func.php

  4. 类文件:数据库核心逻辑位于 include/dedesql.class.php,可自行阅读源码深入学习。

织梦CMS教程标签