菜鸟站长
个人博客主题模板、应用插件、功能开发技术资源聚合分享网站

Typecho_Db 类以及各方法基础用例

发布者:菜鸟站长  发布日期:2025-05-22  更新日期:2025-05-22  人气指数:9

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'];
}

if ($obj) {
    echo $obj->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教程 , 主题开发

菜鸟站长推荐教程



添加新评论 »

icon_mrgreen.pngicon_neutral.pngicon_twisted.pngicon_arrow.pngicon_eek.pngicon_smile.pngicon_confused.pngicon_cool.pngicon_evil.pngicon_biggrin.pngicon_idea.pngicon_redface.pngicon_razz.pngicon_rolleyes.pngicon_wink.pngicon_cry.pngicon_surprised.pngicon_lol.pngicon_mad.pngicon_sad.pngicon_exclaim.pngicon_question.png