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

移动端可扫我直达哦~

推荐阅读

thumbnail 2025-06-08

typecho前台ajax登录与错误处理

尝试了在主题前台做一个登录框,登陆的功能是实现了,有一个小小的不便,就是如果输错了密码,因为页面又跳回了首页,所以弹出式登录框又被隐藏了,登录成功与否不够明显,二次登录的场合操作也较繁琐,所以想实现前台以ajax的方式登录。实现aja...

建站相关 typecho

thumbnail 2025-06-08

聊聊html里的head部分

HTML文档的<head>部分是一个容器,用于包含文档的元数据(metadata)和链接到外部资源的信息,这些内容不会直接显示在网页上,但对网页的功能和表现至关重要。主要元素和功能1. 基础元素<title>:...

建站相关 typecho

thumbnail 2025-06-04

typecho前端实现站点语言的切换

前端修改的数据能及时反馈到后端,那当然需要一个前后端都可以无障碍读取的东西,所以最初是想要用localstorage,但发现php无法直接读取其值,所以就换成了cookie。前端通过js来设置参数值:document.cookie='...

建站相关 typecho

thumbnail 2025-06-02

typecho 主题中的模板与模块的概念

模板是 typecho 主题中一个重要的概念,我们说过typecho的极简主题可以只存在 index.php 这一个文件,但需要展现分类页的时候,typecho事实上会先去寻找名为 category.php 的分类页模板,文章页当然也...

建站相关 typecho

thumbnail 2025-06-02

typecho的几种常见的文章列表调用

处理好了header与面包屑,接下来就按照自己的需求自由发挥了,先放一个分类列表,再挑出一个喜欢的标签,自定义一个该标签下内容展示模块。Typecho 提供了多种文章循环方式,以下是常用的几种方法:标准文章循环<?php whi...

建站相关 typecho

thumbnail 2025-06-02

在typecho里实现面包屑导航

什么是面包屑导航面包屑导航是一种网站导航方式,通常在网站顶部显示,大多会放在站点header的下方,用于显示用户当前位置。 面包屑导航由导航元素构成,每个元素代表一个网站导航项,各个元素通常包含对应链接,供用户跳转。面包屑导航示例首页...

建站相关 typecho

thumbnail 2025-05-29

关于typecho中的路由知识

路由(Routing)是博客系统中将URL地址映射到具体处理逻辑的机制,它决定了当用户访问某个网址时,系统应该执行什么操作、显示什么内容。typecho站点一般都会开启伪静态,伪静态通过URL重写将"漂亮"的URL映射到实际的文件路径...

建站相关 typecho

thumbnail 2025-05-29

Typecho 模板中的翻译函数 _t 与 _e

在 Typecho 模板开发中,_t 和 _e 是用于国际化处理的函数,核心区别在于输出方式:"_t" 函数‌‌功能‌:获取翻译后的字符串但不直接输出,需结合 echo 使用。‌示例‌:<?php echo _t('欢迎语');...

建站相关 typecho

thumbnail 2025-05-26

typecho文章自定义字段的删除与修改

涉及数据库的操作,务必请提前做好备份!提前做好备份!!做好备份!!!小鸟数据的当前主题的缩略图字段命名为augPostThumb,这几天在尝试完善一下原有主题,下载了原站的数据库导入了测试站用于测试页面效果,测试主题的缩略图相关字段拟...

建站相关 typecho

thumbnail 2025-05-26

typecho的文章自定义字段的知识笔记

在typecho中,除了可以自定义设置项之外,我们也可以给文章自定义一些额外的字段,比如给文章编辑界面添加一个缩略图选项,或者增加一个keywords输入框,用来修改编辑当前内容页的关键词信息。// 主题设置 function th...

建站相关 typecho