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'];
}
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主题的目录结构
- 下一篇:Typecho自动更新指定文章内容的尝试

