首页>建站相关>Typecho_Db 类以及各方法基础用例

Typecho_Db 类以及各方法基础用例

Typecho_Db 是 Typecho 博客系统的数据库操作核心类,提供了数据库连接、查询构建和执行等功能。Typecho_Db 提供了简洁高效的数据库操作接口,是Typecho插件和主题开发中最常用的类之一。

主要功能

数据库连接管理:

支持多种数据库类型(MySQL, SQLite, PostgreSQL等)
单例模式确保全局只有一个数据库连接实例

查询构建:

提供链式方法构建SQL查询
支持SELECT, INSERT, UPDATE, DELETE等操作

数据操作:

执行SQL语句
获取查询结果
事务支持

基础用法

// 获取数据库实例
$db = Typecho_Db::get();

// 查询示例
$query = $db->select('*')->from('table')->where('id = ?', 1);
$result = $db->fetchAll($query);

// 插入示例
$insert = $db->insert('table')->rows(array(
    'title' => '标题',
    'content' => '内容'
));
$insertId = $db->query($insert);

常用方法

select() - 开始SELECT查询

insert() - 开始INSERT查询

update() - 开始UPDATE查询

delete() - 开始DELETE查询

query() - 执行SQL查询

fetchAll() - 获取所有结果

fetchRow() - 获取单行结果

fetchObject() - 获取结果作为对象

常用方法示例

select 创建查询

$db = Typecho_Db::get();
// 查询所有字段
$query = $db->select()->from('table');

// 查询特定字段
$query = $db->select('id', 'title', 'created')->from('table');

where 添加条件

// 简单条件
$query = $db->select()->from('table')->where('id = ?', 1);

// 多个条件
$query = $db->select()->from('table')
    ->where('id = ?', 1)
    ->where('status = ?', 'publish');

limit 限制结果数量

$query = $db->select()->from('table')->limit(10); // 前10条
$query = $db->select()->from('table')->limit(5, 10); // 从第5条开始的10条

fetchAll 获取所有结果

$query = $db->select()->from('table')->where('status = ?', 'publish');
$results = $db->fetchAll($query);

foreach ($results as $row) {
    echo $row['title'];
}

fetchRow 获取单行结果

$query = $db->select()->from('table')->where('id = ?', 1)->limit(1);
$row = $db->fetchRow($query);

if ($row) {
    echo $row['title'];
}

fetchObject 获取对象形式结果

$query = $db->select()->from('table')->where('id = ?', 1)->limit(1);
$obj = $db->fetchObject($query);

if ($obj) {
    echo $obj->title;
}

insert 插入数据

$insert = $db->insert('table')
    ->rows(array(
        'title' => '新文章',
        'content' => '这是内容',
        'created' => time()
    ));
$insertId = $db->query($insert); // 返回插入的ID

update 更新数据

$update = $db->update('table')
    ->rows(array(
        'title' => '更新后的标题',
        'modified' => time()
    ))
    ->where('id = ?', 1);
$affectedRows = $db->query($update); // 返回受影响的行数

delete 删除数据

$delete = $db->delete('table')
    ->where('id = ?', 1);
$affectedRows = $db->query($delete); // 返回受影响的行数

高级查询

join 表连接

$query = $db->select('t1.*', 't2.name')
    ->from('table1 AS t1')
    ->join('table2 AS t2', 't1.id = t2.table1_id')
    ->where('t1.status = ?', 'publish');

order 排序

$query = $db->select()->from('table')
    ->order('created', Typecho_Db::SORT_DESC); // 降序

事务处理

在如下场景中,可能还需要用到事物处理:
转账操作(从一个账户扣款,向另一个账户加款)
订单创建(创建订单记录同时减少库存)
需要保证多个表数据一致性的任何操作

$db->beginTransaction();  // 1. 开始事务

try {
    // 2. 执行数据库操作
    $db->query($db->insert('table1')->rows($data1));      // 2.1 插入操作
    $db->query($db->update('table2')->rows($data2)->where('id = ?', 1)); // 2.2 更新操作
    
    $db->commit();  // 3. 提交事务
} catch (Exception $e) {
    $db->rollBack();  // 4. 回滚事务
    throw $e;         // 5. 重新抛出异常
}

如果不用事务,当第一个操作成功而第二个操作失败时,数据库可能会处于不一致的状态,使用事务处理则可以避免这种问题。

常见添加项

        public function add_db_keys() {
            $_db = Typecho_Db::get();
            $_prefix = $_db->getPrefix();
            try {
                if (!array_key_exists('keywords', $_db->fetchRow($_db->select()->from('table.metas')->page(1, 1)))) {
                    $_db->query('ALTER TABLE `' . $_prefix . 'metas` ADD `keywords` VARCHAR(255) DEFAULT NULL;');
                }
                if (!array_key_exists('views', $_db->fetchRow($_db->select()->from('table.contents')->page(1, 1)))) {
                    $_db->query('ALTER TABLE `' . $_prefix . 'contents` ADD `views` INT DEFAULT 0;');
                }
                if (!array_key_exists('agree', $_db->fetchRow($_db->select()->from('table.contents')->page(1, 1)))) {
                    $_db->query('ALTER TABLE `' . $_prefix . 'contents` ADD `agree` INT DEFAULT 0;');
                }
            } catch (Exception $e) {}
        }

反向删除上述添加项的代码:

public function remove_db_keys() {
    $_db = Typecho_Db::get();
    $_prefix = $_db->getPrefix();
    
    try {
        // 检查并删除 metas 表的 keywords 字段
        if (array_key_exists('keywords', $_db->fetchRow($_db->select()->from('table.metas')->page(1, 1)))) {
            $_db->query('ALTER TABLE `' . $_prefix . 'metas` DROP COLUMN `keywords`;');
        }
        
        // 检查并删除 contents 表的 views 字段
        if (array_key_exists('views', $_db->fetchRow($_db->select()->from('table.contents')->page(1, 1)))) {
            $_db->query('ALTER TABLE `' . $_prefix . 'contents` DROP COLUMN `views`;');
        }
        
        // 检查并删除 contents 表的 agree 字段
        if (array_key_exists('agree', $_db->fetchRow($_db->select()->from('table.contents')->page(1, 1)))) {
            $_db->query('ALTER TABLE `' . $_prefix . 'contents` DROP COLUMN `agree`;');
        }
    } catch (Exception $e) {
        // 可以记录错误日志或抛出异常
        error_log('删除字段时出错: ' . $e->getMessage());
    }
}

标签: typecho

移动端可扫我直达哦~

推荐阅读

typecho 2025-04-29

typecho让后台设置的代码更为易读

利用deepseek写一个简单的后台控件类,来简化一下后台的书写,利用这个类,我们可以把参数以数组的形式组装在一起,由类来轮询读取并生成控件。虽然这个对于站点的运行速度不会有什么正向的收益,但因为后台设置我们可以仅在管理员登陆的情况下...

建站相关 typecho

typecho 2025-04-20

关于typecho主题的目录结构

wordpress的极简主题需要有两个文件,分别是index.php以及style.css,而在typecho中,因为主题的一些配置信息默认被放在了index.php而不是style.css文件中,所以直接往主题包里仍一个index....

建站相关 typecho

typecho 2025-04-20

从零开始做一个 Typecho 主题系列

Typecho是一款轻量级、高效的开源博客程序,由国内开发者团队开发维护。它采用PHP语言编写,支持MySQL、SQLite等多种数据库,安装包体积仅有500KB左右,运行时内存占用极低,却能提供出色的性能表现。这款博客程序最大的特点...

建站相关 typecho

typecho 2025-04-16

typecho 1.2.1 给标签添加description说明文字

之前写过一篇为typecho标签添加说明字段的方法,对应的是typecho1.1版本,目前typecho的稳定版本是1.2.1, 因为服务器php版本较低,一直没有去尝试新版。这几天用小皮面板搭建了一个本地的php环境,终于是正经尝试...

建站相关 typecho

typecho 2025-04-11

Typecho博客系统中的config.inc.php文件

在 Typecho 博客系统中,config.inc.php 是一个核心配置文件,用于存储数据库连接信息和系统关键设置。它通常位于 Typecho 的安装根目录下,在安装过程中自动生成。Typecho 的安装包解压后并不包含这个文件,...

建站相关 typecho

typecho 2025-04-09

Typecho尝试获取主题的一些基础信息

在Typecho的主题一览里是利用了一个循环来遍历主题,遍历主题的时候可以通过activated参数来确定是否是当前主题,这样就可以利用官方提供的函数来获取主题信息了,缺点很明显,需要多使用一个循环,浪费资源。<?php \Wi...

建站相关 typecho

typecho 2025-04-02

typecho模板解析优先级

类似于wordpress ,Typecho的模板系统也遵循特定的优先级规则,当系统寻找模板文件时会按照以下顺序进行查找:模板文件查找优先级主题自定义模板 (最高优先级)usr/themes/[主题名]/[模板文件]例如:usr/the...

建站相关 typecho

typecho 2025-03-27

typecho如何实时更新被修改后的style.css文件

给新的站点“biib.top”加了个友情链接,顺便修改了一下主题的footer背景。但浏览器缓存了站点的css文件,修改后的效果并不实时生效。直接清除浏览器缓存是个简单粗暴的办法,问题在于这个效果也只是针对博主个人,用户可不会没事瞎清...

建站相关 typecho

typecho 2024-04-20

typecho根据标签的slug name信息判断是否输出免责声明

博主是从事机械行业的,工作过程中接触了很多二手老旧的设备,因为是二手设备,不缺胳膊少腿能正常运行已是难得,完善的说明书与售后服务想都不要想了。所以找设备的说明书成了一项附加的工作,总得让设备正常运行起来,偶尔设备有个小病小痛的,也不能...

建站相关 typecho

typecho 2023-11-02

Typecho开发文档-Widget设计文档

什么是WidgetWidget是组成Typecho的最基本元素,除了已经抽象出来的类库外,其它几乎所有的功能都会通过Widget来完成.在实践中我们发现,在博客这种小型但很灵活的系统中实施一些大型框架的思想是不合适的,它会使系统灵活性...

建站相关 typecho