zblog新增自定义数据库表的方法代码

zblog教程 1564

在zblog主题或插件应用开发中,难免会有新增数据库表的需求,直接手动在数据库中新增对于自用应用影响不大,但对于面向众多用户的收费应用就显得很不友好了,因此,通过代码在应用启用的时间自动创建对应的数据库表就很有必要。下面是博客吧转自Z-Blog官方文库Wiki的以收藏文章功能为例演示zblog php关于自定义数据库表的教程,介绍了建表与增删改查,较为详细。

提示:该教程代码只验证了MySQL数据库,其余的需要自行验证。

建表教程

声明定义数据表结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function 插件ID_defineDatabase()
{
    $database = array(
        /**
         * 收藏表
         */
        '插件ID_Collect' => array(
            'table'         => '%pre%插件ID_collect',
            'datainfo'      => array(
                'ID'            => array('cc_ID', 'integer', '', 0),
                'UID'           => array('cc_UID', 'integer', '', 0),
                'LogID'         => array('cc_LogID', 'integer', '', 0),
                'CreateTime'    => array('cc_CreateTime', 'integer', '', 0),
                'Meta'          => array('cc_Meta', 'string', '', ''),
            ),
        ),
    );
 
    foreach ($database as $key => $v) {
        $table = $v['table'];
        $datainfo = $v['datainfo'];
        $GLOBALS['table'][$key] = $table;
        $GLOBALS['datainfo'][$key] = $datainfo;
    }
 
    return $database;
}
插件ID_defineDatabase();

这是一个声明插件数据表结构的函数。为什么要在定义函数以后就执行?因为需要在插件运行前,将结构信息赋值到全局变量中,来自于c_system_base.php同类风格的声明结构,并不表示就是固定格式,其中建议以类的名称为数据库表的声明key,方便后期的可读性。

  • 字段“table”是数据表的名称,用%pre%+插件ID+数据表名称的方式组成。
  • 字段“datainfo”是数据字段的结构,有具体的声明结构,可以在zb_system/function/lib/sql/中查看不同数据库的语句拼接。
  • 关于datainfo的声明结构说明:根据声明的顺序,数组第一条在MySQL中会加上索引(PRIMARY KEY)。

声明的代码结构

1
array('字段名', '类型', '长度参数(根据类型定义)', '默认值');

下面是简单演示常用类型的声明,具体的类型可以自行补充MySQL的基础知识

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// int
array('ID', 'integer', '', 0),
 
// tinyint
array('Type', 'integer', 'tinyint', 0),
 
// bigint
array('EndTime', 'integer', 'bigint', 0),
 
// char
array('Value', 'char', 10, ''),
 
// varchar
array('Title', 'string', 250, ''),
 
// longtext
array('Content', 'string', '', ''),
写一个创建数据库表的方法,在启用主题或插件应用的时候执行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function 插件ID_createTable()
{
    global $zbp;
 
    $database = 插件ID_defineDatabase();
 
    foreach ($database as $k => $v) {
        if (!$zbp->db->ExistTable($v['table'])) {
            $s = $zbp->db->sql->CreateTable($v['table'], $v['datainfo']);
            $zbp->db->QueryMulit($s);
        }
    }
}
 
// 删表的方法 具体什么时候删,自行决定
function 插件ID_delTable()
{
    global $zbp;
 
    $database = 插件ID_defineDatabase();
 
    foreach ($database as $k => $v) {
        if ($zbp->db->ExistTable($v['table'])) {
            $s = $zbp->db->sql->DelTable($v['table']);
            $zbp->db->QueryMulit($s);
        }
    }
}

在插件的启用函数中调用

1
2
3
4
function InstallPlugin_插件ID()
{
    插件ID_createTable();
}

接下来声明一个类继承Base完成基本的增删改查操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class 插件ID_Collect extends Base
{
    /**
     * 在构造函数中
     * 将定义的数据表名称与数据结构交给父类Base去处理
     */
    public function __construct()
    {
        global $zbp;
 
        parent::__construct($zbp->table['插件ID_Collect'], $zbp->datainfo['插件ID_Collect'], __CLASS__);
 
        // 因为数据中有一条创建时间字段,提前在此赋予默认值
        $this->CreateTime = time();
    }
}

基于这个类,就可以进行基本的curd了

操作类进行增删改

1、新增一条数据

1
2
3
4
5
6
7
8
9
function 插件ID_addCollect($userId, $logId)
{
    $collect = new 插件ID_Collect();
    $collect->UID = $userId;
    $collect->LogID = $logId;
    $collect->Save();
    // 保存后,$collect->ID就能输出这条记录的ID了
    echo '添加成功';
}

如果不操作类进行增加,也可以使用sql插入数据,参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function 插件ID_addCollect($userId, $logId){
	$dataArr = array(
		'UID' = $userId,
		'LogID' = $logId
	);
	$sql= $zbp->db->sql->insert($GLOBALS['table']['插件ID_addCollect'],$dataArr);
	$insert = $zbp->db->insert($sql);	
	if($insert){
		echo '添加成功';
		die();
	}else{
		echo '添加失败';
		die();
	}
}

2、更新一条数据

1
2
3
4
5
6
7
8
9
10
function 插件ID_updateCollect($collectId)
{
    $collect = new 插件ID_Collect();
    $status = $collect->LoadInfoByID($collectId);
    if ($status) {
        $collect->CreateTime = time();
        $collect->Save();
    }
    // 这样收藏的时间就变成了最新的
}

3、删除一条数据

1
2
3
4
5
6
7
8
function 插件ID_delCollect($collectId)
{
    $collect = new 插件ID_Collect();
    $status = $collect->LoadInfoByID($collectId);
    if ($status) {
        $collect->Del();
    }
}

4、查询数据,单独阐述:已知ID的情况,通过上面演示的LoadInfoByID($ID) 就能通过父类Base的方法读取一条数据,在只知道UID和LogID,就需要组装where语句。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function 插件ID_getUserCollect($userId, $logId)
{
    global $zbp;
 
    $w = array();
    $w[] = array('=', 'cc_UID', $userId);
    $w[] = array('=', 'cc_LogID', $logId);
    $sql = $zbp->db->sql->Select($zbp->table['插件ID_Collect'], array('*'), $w);
    $list = $zbp->GetListType('插件ID_Collect', $sql);
    if (count($list) > 0) {
        return $list[0];
    }
    return false;
}

其它的查询,比如查询某用户的指定数量收藏记录

1
2
3
4
5
6
7
8
9
10
11
12
function 插件ID_getUserCollectList($userId, $num = 10)
{
    global $zbp;
 
    $w = array();
    $w[] = array('=', 'cc_UID', $userId);
    $num = (int) $num > 0 ? (int) $num : 10;
    $sql = $zbp->db->sql->Select($zbp->table['插件ID_Collect'], array('*'), $w, null, $num);
    $list = $zbp->GetListType('插件ID_Collect', $sql);
 
    return $list;
}

扩展:多说插件参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#表名
$table['plugin_duoshuo_comment'] = '%pre%plugin_duoshuo_comment';
###注意表名要加上%pre%可以区分同一数据库中的不同的程序所生成的表
 
#表结构
$datainfo['plugin_duoshuo_comment'] = array(
	'ID' => array('ds_ID','integer','',0),
	'key' => array('ds_key','string',128,''),
	'cmtid' => array('ds_cmtid','integer','',0)
);
 
#全局声明
global $zbp;
#判断是否已创建,否则新建数据表
if(!$zbp->db->ExistTable($GLOBALS['table']['plugin_duoshuo_comment']))
{
	$s = $zbp->db->sql->CreateTable($GLOBALS['table']['plugin_duoshuo_comment'],$GLOBALS['datainfo']['plugin_duoshuo_comment']);
	$zbp->db->QueryMulit($s);
}

有区别,但可参考。

教程原地址:https://wiki.zblogcn.com/doku.php?id=zblogphp:development:plugin:自定义数据库表

精品推荐: