Typecho开发数据库常用API操作

表创建和删除

Typecho 插件开发过程中,往往需要创建表。
可以使用query()来进行表的创建、修改或者删除。

$db= Typecho_Db::get();
$prefix = $db->getPrefix();
$db->query('create table '.$prefix.'metas xxxxx');

使用 query 方式创建表的时候,需要在表明前手动添加 $prefix 前缀,否则在后面的使用过程中会造成困惑。 还可以使用 table. 来代替 $prefix ,typecho 会自动识别并替换成指定的前缀。 同理,修改或者删除 Typecho 数据库中表,按照同样的方式调用 query 即可。

数据查询

1. select,查询表数据

select 语句是 Typecho 插件开发中最常用的 sql 调用。

$db = Typecho_Db::get();
$query= $db->select()->from('table.metas');
$result = $db->fetchAll($query);

typecho 中. 号具有特定的意义。
这里 table.metas 表示这是一个 metas 表。
实际上,typecho 是自动将 table. 的字符使用 str_replace 替换成了 config.inc.php 中设定的前缀。

举例:

$db->select()->from('table.metas')->where('mid = ?',2);
# 将生成 SELECT * FROM typecho_metas WHERE (mid= '2'),其中 typecho_ 是表前缀;
$db->select()->from('metas')->where('mid = ?',2);
# 将生成 SELECT * FROM metas WHERE (mid= '2'),注意这里没有了表前缀(错误)。

指定表字段查询

有时为了提高查询性能,需要指定查询表中特定的几个字段,那么可以使用下面的方式:

$query= $db->select('mid','name')->from('table.metas');
echo $query; //SELECT `mid` , `name` FROM typecho_metas

如果联合查询中,两个表存在相同的字段名,那么可以使用 table. 来指定表名:

$query = $db->select('table.contents.cid')->from('table.contents')->join....

指定查询条件

指定 SQL 查询的 where 语句,是最常用的 api 调用。

$query= $db->select('mid','name')->from('table.metas')->where('mid = ?', 2);
echo $query; //SELECT * FROM typecho_metas WHERE (`mid` = '2' )

如需要指定多个查询条件,直接多次调用 where 即可,将生成 and 关系的 where 条件。

$db->select('mid','name')->from('table.metas')->where('mid = ?', 2)->where('name like ? ', $name);)

使用 OR 关系的查询条件

可以使用 orWhere() 函数来指定 SQL 查询的或条件。

$db->select('mid','name')->from('table.metas')->where('mid = ?', 2)->orWhere('mid = ? ', 3);
//SELECT `mid` , `name` FROM typecho_metas WHERE (`mid` = '2' ) OR (`mid` = '3' )

指定查询范围

在需要分页的场景下,分页是必需的操作。
offset() 和 limit() 分别用于指定起始位置和结束位置,即指定查询范围。

$query = $db->select('mid','name')->from('table.metas')->offset(2)->limit(3);
echo $query;//SELECT `mid` , `name` FROM typecho_metas LIMIT 3 OFFSET 2

Typecho 中,还提供了一种简写的方法,page() 函数。

$query = $db->select('mid','name')->from('table.metas')->page(3,10);
echo $query;//SELECT `mid` , `name` FROM typecho_metas LIMIT 10 OFFSET 20

//表示取第三页,并取10条记录。

对查询结果进行排序

在 Typecho 中,使用 order() 函数和 Typecho_Db::SORT_DESC 指定查询结果的排序方式。

$query = $db->select('mid','name')->from('table.metas')->order('mid',Typecho_Db::SORT_DESC);
echo $query;//SELECT `mid` , `name` FROM typecho_metas ORDER BY `mid` DESC

Tips: Typecho_Db::SORT_ASC 表示升序排序,Typecho_Db::SORT_DESC 表示降序排序。

联合查询

在 Typecho 中,同样使用内置函数 join() 方便地进行联合查询。

$query = $db->select()
    ->from('table.contents')
    ->join('table.comments', 'table.contents.cid = table.comments.cid',Typecho_Db::LEFT_JOIN)
    ->where('table.contents.type = ?', 'post');
echo $query;
//SELECT * FROM typechocontents LEFT JOIN typecho_comments ON typecho_contents.`cid` = typecho_comments.`cid` WHERE (typecho_contents.`type` = 'post' )

2. update,更新表数据

Typecho 中,使用 update() 函数来进行更新表操作。
但注意,update 操作,需要借助于 query 执行。

$update = $db->update('table.metas')->rows(array('name'=>'case_in_cn'))->where('mid=?',6);
echo $update;//UPDATE typecho_metas SET `name` = 'some_name' WHERE (`mid`='6' )
//执行后,返回收影响的行数。
$updateRows = $db->query($update);

3. insert,插入数据

Typecho 中,使用 insert() 函数来进行表插入操作。
同样,insert 操作需要借助于 query 函数。

$insert = $db->insert('table.metas')
    ->rows(array('mid' => '22', 'name' => 'hello world'));
//将构建好的sql执行, 如果你的主键id是自增型的还会返回insert id
$insertId = $db->query($insert);

4. delete,删除数据

Typecho 中使用 delete() 函数来删除数据表中的行。
delete 操作用于删除数据表中指定的行,同样需要借助 query 函数执行。

$delete = $db->delete('table.metas')
    ->where('mid = ?', 2);
//将构建好的sql执行, 会自动返回已经删除的记录数
$deletedRows = $db->query($delete);

数据库调试

查看查询语句
在 Typecho 调试过程中,打印 sql 语句往往是很有帮助的。
对于大于 5.2 版本的 php,直接 echo $query 即可。
对于小于 5.2 版本,则需要显式调用 __toString() 函数。

$select = $db->select()->from('table.metas');
//如果版本大于php5.2
echo $select;
//如果小于php5.2
echo $select->__toString();

标签: PHP, MySQL, Typecho

相关文章

Typecho插件开发手册

插件的基本结构在 Typecho 中,插件通常是一个独立的 PHP 文件,默认放置在usr/plugins/目录下。插件文件名即为插件名,插件类名也应与文件名相同。插件必须实现 Typecho_...

Typecho博客系统的xmlrpc的使用附PHP示例代码

XML-RPC 是一种远程过程调用(RPC)协议,它使用 XML 编码请求和响应,并通过 HTTP 进行传输。XML-RPC 允许客户端调用远程服务器上的方法,并获取返回结果。这种协议简单、轻量...

php+mysql中如何处理嵌套(子)事务并保持原子性一致

在PHP和MySQL中处理子事务并保持原子性一致性是一个复杂但非常重要的问题,尤其是在处理涉及多个数据库操作的业务逻辑时。以下是一些关键的解决方案、思路、技术要点和涉及的难点讲解。解决方案与思路...

如何使用Go编写跨平台组件并让Java或PHP调用

在现代软件开发中,跨语言调用是一个常见的需求。假设我们有一个用Go语言编写的组件,我们希望Java或PHP能够直接调用这个组件中对外提供的方法。为了实现这一目标,我们可以使用以下几种方法:1. ...

MySQL 触发器详解:创建、查看、示例及性能优化

我平时开发的时候,基本上不会用到这个触发器,主要是碰不到必须用它的场景理由,不过最近的项目中,已经上线了的一套系统中,客户突然要修改一个功能,大致意思就是,就是列表的一个状态,在处理流程的时候,...

深入解析PHP的filter_var函数及其应用场景

在PHP开发中,数据的过滤与验证是至关重要的环节。PHP的 filter_var 函数提供了一种简洁而强大的方式来对输入数据进行验证和过滤。本篇文章将从专业的角度详细介绍 filter_var ...

图片Base64编码

CSR生成

图片无损放大

图片占位符

Excel拆分文件