其实数据库类织梦之前就有一个介绍,http://help.dedecms.com/v53/archives/functions/db/,这篇文章讲解了数据库类的一些常见的使用方法,不过没有结合例子去介绍,很多人估计看了还不是很懂,为了让更多人理解织梦的数据库使用类,并能够运用到开发中,这里就来做个教程.

1.创建数据表
    在使用这个类之前,我们需要创建数据表,这里我们推荐几个数据库操作工具:PHPMyadmin,Navicat for MySQL,我这里以后者为例.
当然这里需要注意,在创建表的时候我们已经安装了一个DedeCMS程序,我们今天的操作是以DedeCMS程序扩展来讲解的.当然程序安装后他自己也会创建N多表,这些表以后再来介绍吧,或者也可以看看http://help.dedecms.com/v53/archives/extend/commontable/,这里有一些常用表的说明.

这里我们这个数据库叫dedebbs,表前缀用的默认的"dede_",我们用Navicat for MySQL来创建一个名为"dede_test"的表,里面就2个字段,1个id,作为唯一标识,另一个name作为名称(图1).然后往里面添加测试数据(图2),这个操作类似于Access或者EXCEL,比较简单,这里不做冗述.

 

(图1)

(图2)

这里需要注意的是,我们采用的是gbk版本的程序,所以数据表相关的编码也要采用相应版本的编码,在表的"选项"中设置为gbk相关.下面我将sql列出,如果懒得去创建表,可以在dedecms系统后台的命令运行器中执行下:

 
-- ----------------------------
-- 表 `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; -- ----------------------------
-- 插入到 dede_test中的数据
-- ----------------------------
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', '第四个');

  2.连接数据库,查询数据表
    表"dede_test"我们已经创建完成了,接下来我们要连接数据库了,其实方法非常简单.我们在网站根目录中创建一个test.php的文件,这个文件最好也用gbk的编码,可以用专门的编辑器来创建文件.

连接数据库最简单的方法就是引入include文件夹下面的common.inc.php文件,编辑php代码:
写入以下内容:

test.php

<?php
require_once (dirname(__FILE__) . "/include/common.inc.php");
print_r($dsql);
?>

  

上面代码就是将一个$dsql类输出,我们再执行下这个文件http://www.dedebbs.com/test.php(注dedebbs.com只是在本地做了个解析,其实就是localhost),我们查看源代码,看到下面的内容(图4):

(图4)

DedeSql Object
(
    [linkID] => Resource id #6
    [dbHost] => localhost
    [dbUser] => root
    [dbPwd] => 123456
    [dbName] => dedebbs
    [dbPrefix] => dede_
    [result] => Array
        (
            [me] => 0
        )

[queryString] => 
    [parameters] => Array
        (
        )

[isClose] => 
    [safeCheck] => 1
)

这个就说明我们已经成功连接数据库了,[dbHost],[dbUser]...这些都是数据库的相关信息,也就是我们保存在配置文件中的\data\common.inc.php内容,引入数据库类的时候,默认就被创建了$dsql或者$db,所以直接引入配置文件就可以了.

接下来我们来做一个简单的查询操作,接着上面的代码我们继续写
test.php

<?php
require_once (dirname(__FILE__) . "/include/common.inc.php");
if($dsql->IsTable('dede_test')){
//如果存在dede_test表
//-------------------
//| 查询一条记录 |
//| GetOne() |
//-------------------
// ↓
$row = $dsql->GetOne("SELECT * FROM dede_test WHERE id = 3");
print_r($row);
}
?>

  这里我们用了$dsql类的2个方法,IsTable()以及GetOne(),IsTable先来判断这个表是否存在,如果存在我们就继续执行,他返回的是一个bool值,如果存在为true否则就为false.
接下来判断如果有这个表存在,则我们就执行查询单条记录的这个过程,即GetOne,通过帮助文档可以知道:$arr = $db->GetOne($sql);也就是说查询的sql语句会传送回来一个数组.我们运行test.php看下运行结果:
Array
(
    [id] => 3
    [name] => 第三个喽
)
    这个说明我们查询dede_test这个表id为3的数据成功了,返回了一个$row数组,其中就存放了字段的值.
当然我们可以用echo $row['name'];或者$row['id']来输出我们查询出来的结果

Tip:其实我们可以深入的研究下dedesql.class.php这个类,258行就有这个方法:

    //执行一个SQL语句,返回前一条记录或仅返回一条记录
function GetOne($sql='',$acctype=MYSQL_ASSOC)
{
global $dsql;
if(!$dsql->isInit)
{
$this->Init($this->pconnect);
}
if($dsql->isClose)
{
$this->Open(FALSE);
$dsql->isClose = FALSE;
}
if(!empty($sql))
{
if(!preg_match("/LIMIT/i",$sql)) $this->SetQuery(preg_replace("/[,;]$/i", '', trim($sql))." LIMIT 0,1;");
else $this->SetQuery($sql);
}
$this->Execute("one");
$arr = $this->GetArray("one",$acctype);
if(!is_array($arr))
{
return '';
}
else
{
@mysql_free_result($this->result["one"]); return($arr);
}
}

  .深入查询,继续研究SELECT
    刚才讲了查询一条记录,其实这个查询一条记录可以理解为我们内容页查询一篇文章,只是获取单条记录并将内容显示出来,但往往我们经常遇到的是查询列表,及{dede:arclist/}或者{dede:list/},查询列表的话涉及到查询多条记录.

继续修改代码:
test.php

<?php
require_once (dirname(__FILE__) . "/include/common.inc.php");
if($dsql->IsTable('dede_test')){
//如果存在dede_test表
//-------------------
//| 查询一条记录 |
//| GetOne() |
//-------------------
// ↓
$row = $dsql->GetOne("SELECT * FROM dede_test WHERE id = 3");
echo "查询id=3的记录:<br />显示结果:";
print_r($row);
//-------------------
//| 查询多条记录 |
//| Execute() |
//-------------------
// ↓
echo "<hr />查询dede_test表中的所有记录:<br />显示结果:<br />";
$sql = "SELECT * FROM dede_test";
$dsql->Execute('me',$sql);
while($arr = $dsql->GetArray('me'))
{
echo "id = {$arr['id']} ,name = {$arr['name']}<br />";
}
}
?>

  

--------------------------------

我们运行test.php看到显示以下的内容:
查询dede_test表中的所有记录:
显示结果:
id = 1 ,name = 测试名字1
id = 2 ,name = 这是第二个
id = 3 ,name = 第三个喽
id = 4 ,name = 第四个

这个说明我们已经成功将表dede_test中的数据输出,当然主要是执行了那个"SELECT * FROM dede_test",这是一个最简单的sql查询语句,当然也能够用到order by这些排序或者条件去查询,详细可以参考sql相关内容.

同时这里需要说明的是这里除了用$dsql->GetArray('me')来获取内容到数组,还可以用$dsql->GetObject("me")获取内容到对象,不过调用方法有些不同:
主要这里通过$dbobj->fieldname来调用查询出来的数据
            while($dbobj = $dsql->GetObject('me'))
            {
                echo "id = {$dbobj->id} ,name = {$dbobj->name}<br />";
            }

  tips:这里查询完了其实还可以用$dsql->GetTotalRow("me")来获取下查询出来的总数.

4.插入删除,也要用到SQL
    上面我们介绍了如何用dsql来查询数据,主要有获取单条记录和获取多条记录2种,接下来我们来了解下使用dsql其他特性来为我们的test.php加入添加内容和删除内容的功能.

先来了解下插入数据库的操作,我们先做一个表单,这个表单用于提交数据name的.表单代码如下:
<hr />
用于提交数据的表单:<br />

<form action="test.php" type="post">
<input type="hidden" name="dopost" value="save">
名称:<input type="text" name="name" value="">
<input name="提交" type="submit" value="提交">
</form>

  这里我们用了一个隐藏域dopost来存放操作方法,输入框name用来存放输入数据,然后传递给当前页面,再进行处理,这时候我们需要在test.php中加入部分的表单处理操作:

        //-------------------
//| 表单处理过程 |
//| Save() |
//-------------------
// ↓
empty($dopost)? "" : $dopost;
if($dopost == "save"){
//如果执行插入操作
$sql = "INSERT INTO `dede_test` (`name`) VALUES ('{$name}')";
$dsql->ExecuteNoneQuery($sql); //执行这个插入语句
$lastInsertID = $dsql->GetLastID(); //获取插入后的最后的ID,然后再传给下一个页面
ShowMsg("成功增加一条记录内容!","test.php?id={$lastInsertID}");
exit();
}

  

这里主要是一个INSERT INTO 语句,然后通过$dsql的ExecuteNoneQuery方法来执行这个操作,并且获取插入数据最后一个id再将其传递给下一个页面以便高亮显示.

我们可以在编辑框中插入一条数据来测试下,看看插入数据后的返回结果(图5).

(图5)

其实删除的操作也是如此,我们只需要稍微做个修改就可以了,增加一个dopost操作为del的判断,然后在显示数据后面增加一个超链接,将id以get方式进行传递.并最后进行处理.

下面是我们修改循环查询输出的部分内容,有如下修改:

  while($dbobj = $dsql->GetObject('me'))
{
if($id==$dbobj->id){
//如果传递的id值和查询值相同,则高亮显示最后一条插入记录
echo "<font color='red'>id = {$dbobj->id} ,name = {$dbobj->name}</font> <a href='test.php?dopost=del&id={$dbobj->id}'>[删除]</a> <br />";//这里增加了一个删除的超链接
}else{
echo "id = {$dbobj->id} ,name = {$dbobj->name} <a href='test.php?dopost=del&id={$dbobj->id}'>[删除]</a><br />";
}
}

  下面是del这个post的判断:

empty($dopost)? "" : $dopost;
if($dopost == "save"){
//如果执行插入操作
$sql = "INSERT INTO `dede_test` (`name`) VALUES ('{$name}')";
$dsql->ExecuteNoneQuery($sql);
$lastInsertID = $dsql->GetLastID();
ShowMsg("成功增加一条记录内容!","test.php?id={$lastInsertID}");
exit();
}elseif($dopost == "del"){
//如果dopost为del,则删除数据
$id = isset($id) && is_numeric($id) ? $id : 0;
$sql = "DELETE FROM `dede_test` WHERE (`id`='{$id}')";
$dsql->ExecuteNoneQuery($sql);
ShowMsg("成功删除一条记录内容!","test.php");
exit();
}

  

  tips:这里用到了一个ShowMsg()函数,这个是用来返回一个对话框的,详细可以查看下\include\common.func.php的372行相关函数的代码.

这里我们结合了DedeCMS程序的dedesql类讲解了这个类的常见的用法,我们不难发现用这个类操作数据库是非常方便的,当然这个需要用户对sql比较熟悉.今天我们就讲解到这里了,下次有机会再结合datalist类和模板引擎来介绍织梦二次开发相关的内容.如果大家有什么好的学习织梦的意见或建议还希望给我电邮:tianya#dedecms.com(#<=>@).

来自:织梦官网:http://www.dedecms.com/help/development/2009/1028/1076.html

以上全部代码:

<?php
require_once (dirname(__FILE__) . "/include/common.inc.php"); //-------------------
//| 表单处理过程 |
//| Save() |
//-------------------
// ↓
empty($dopost)? "" : $dopost;
if($dopost == "save"){
//如果执行插入操作
$sql = "INSERT INTO `#@__test` (`name`) VALUES ('{$name}')";
$dsql->ExecuteNoneQuery($sql);
$lastInsertID = $dsql->GetLastID();
ShowMsg("成功增加一条记录内容!","test.php?id={$lastInsertID}");
exit();
}elseif($dopost == "del"){
//如果dopost为del,则删除数据
$id = isset($id) && is_numeric($id) ? $id : 0;
$sql = "DELETE FROM `#@__test` WHERE (`id`='{$id}')";
$dsql->ExecuteNoneQuery($sql);
ShowMsg("成功删除一条记录内容!","test.php");
exit();
} if($dsql->IsTable('dede_test')){
//如果存在dede_test表
//-------------------
//| 查询一条记录 |
//| GetOne() |
//-------------------
// ↓
$row = $dsql->GetOne("SELECT * FROM #@__test WHERE id = 3");
echo "查询id=3的记录:<br />显示结果:";
print_r($row);
//-------------------
//| 查询多条记录 |
//| Execute() |
//-------------------
// ↓
echo "<hr />查询dede_test表中的所有记录:<br />显示结果:<br />";
$sql = "SELECT * FROM #@__test order by id desc";
$dsql->Execute('me',$sql);
/*
while($arr = $dsql->GetArray('me'))
{
echo "id = {$arr['id']} ,name = {$arr['name']}<br />";
}
*/
//Or $dsql->GetObject("me")
while($dbobj = $dsql->GetObject('me'))
{
if($id==$dbobj->id){
//如果传递的id值和查询值相同,则高亮显示最后一条插入记录
echo "<font color='red'>id = {$dbobj->id} ,name = {$dbobj->name}</font> <a href='test.php?dopost=del&id={$dbobj->id}'>[删除]</a> <br />";
}else{
echo "id = {$dbobj->id} ,name = {$dbobj->name} <a href='test.php?dopost=del&id={$dbobj->id}'>[删除]</a><br />";
}
}
echo "总共查询".$dsql->GetTotalRow("me")."条记录";
}
?> <hr />
用于提交数据的表单:<br />
<form action="test.php" type="post">
<input type="hidden" name="dopost" value="save">
名称:<input type="text" name="name" value="">
<input name="提交" type="submit" value="提交">
</form>

  

Dedesql数据库类详解(二次开发必备教程)的更多相关文章

  1. Dedesql数据库类详解(二次开发必备教程)(转)

    http://www.dedecms.com/help/development/2009/1028/1076.html 织梦DedeCMS的二次开发不仅仅是会写写织梦的标签,会制作织梦的模板.很多时候 ...

  2. ecmall数据库表详解 二次开发必备

    文章分类表ecm_acategory 字段 类型 Null 默认 注释 cate_id int(10) 否   自增ID号,分类ID号 cate_name varchar(100) 否   分类的名称 ...

  3. Dedesql数据库类详解

    今天花点时间讲解下织梦的sql数据库类,近期本来是准备录制一套视频教程的,但由于视频压缩的问题迟迟没有开展工作,如果大家有什么好的视频压缩方式可以通过邮件的方式告诉我:tianya#dedecms.c ...

  4. (转载)实例详解Android快速开发工具类总结

    实例详解Android快速开发工具类总结 作者:LiJinlun 字体:[增加 减小] 类型:转载 时间:2016-01-24我要评论 这篇文章主要介绍了实例详解Android快速开发工具类总结的相关 ...

  5. windows phone 8.1开发SQlite数据库操作详解

    原文出自:http://www.bcmeng.com/windows-phone-sqlite1/ 本文小梦将和大家分享WP8.1中SQlite数据库的基本操作:(最后有整个示例的源码)(希望能通过本 ...

  6. Struts2-整理笔记(二)常量配置、动态方法调用、Action类详解

    1.修改struts2常量配置(3种) 第一种 在str/struts.xml中添加constant标签 <struts> <!-- 如果使用使用动态方法调用和include冲突 - ...

  7. Android游戏开发之旅 View类详解

    Android游戏开发之旅 View类详解 自定义 View的常用方法: onFinishInflate() 当View中所有的子控件 均被映射成xml后触发 onMeasure(int, int) ...

  8. Java基础-DBCP连接池(BasicDataSource类)详解

    Java基础-DBCP连接池(BasicDataSource类)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程 ...

  9. Shiro 安全框架详解二(概念+权限案例实现)

    Shiro 安全框架详解二 总结内容 一.登录认证 二.Shiro 授权 1. 概念 2. 授权流程图 三.基于 ini 的授权认证案例实现 1. 实现原理图 2. 实现代码 2.1 添加 maven ...

随机推荐

  1. CPU上下文切换分析

    一.CPU上下文切换 1.上下文切换,有时也称做进程切换或任务切换,是指CPU从一个进程或线程切换到另一个进程或线程. 2.vmstat是一个常用的系统性能分析工具,主要用来分析系统内存使用情况,也常 ...

  2. thinkphp is NULL表达式写法

    thinkphp  中如果这样写 $where['status']=array('EQ','NULL'),打印出来sql是WHERE ( `status` = 'NULL' ):而我想要的是 `sta ...

  3. IDEA项目里Maven 的Plugins出现红线的解决方法

    1.删除项目里的libraries(快捷键ctrl+shift+alt+s):Project Settings->Libraries,全选删除 2.删除之前项目产生的target 3.然后再in ...

  4. 苹果用户转入mate30,被恶心到了

    几年没更新博客了,今天入了新坑,一堆东西想吐槽,发一篇喷一波. 几千块的机器,牛皮癣广告居然这么鬼多,预装一打,推荐一打,不比千元机少,这TM是旗舰机啊.华为官方产的 app打着服务旗号,不给权限强退 ...

  5. oracle性能诊断sql

    --1.阻塞及等待事件信息查询-- 查询所有会话的状态.等待类型及当前正在执行的SQL脚本select t.SID, t.SERIAL#, t.Status, t.Action, t.Event, t ...

  6. JspFragment.invoke方法

    JspFragment.invoke方法可以说是JspFragment最重要的方法,利用这个方法可以控制是否执行和输出标签体的内容.是否迭代执行标签体的内容或对标签体的执行结果进行修改后再输出. 例如 ...

  7. Linux基础(二)之命令

    01-基础命令 1. 创建一个目录 mkdir /data 创建多级目录 mkdir -p /oldboy/data 2. 查看目录里面的内容 ls /data 3. 查看目录里面的详细信息 ls - ...

  8. 【例3】设有关系模式R(A, B, C, D, E)与它的函数依赖集F={A→BC, CD→E, B→D, E→A},求R的所有候选键。 解题思路:

    通过分析F发现,其所有的属性A.B.C.D.E都是LR类属性,没有L类.R类.N类属性. 因此,先从这些属性中依次取出一个属性,分别求它们的闭包:=ABCDE,=BD,=C,=D, =ABCDE.由于 ...

  9. oracle 导出关键字说明

    关键字       说明(默认) ----------------------------------------- UserId    用户名/口令 Full      导出整个文件(N) Buff ...

  10. SQLSERVER大批量数据快速导入Redis

    目的 把单表近5千万的某单个字段导入到Redis,作为一个list存储. 方案一: 使用sqlcmd工具(sqlserver自带),直接生成命令在Redis-cli中执行. 方案一. 使用sqlcmd ...