在做插件和主题的时候,经常会用到数据库,所以就整理了Typecho数据库常用的API,实现基本的CURD操作。创建(Create)、更新(Update)、读取(Retrieve)和删除(Delete)。
表创建和删除
在Typecho插件开发过程中,往往需要创建自己的表。Typecho_Db类中的query函数,可用于执行所有sql语句,因此我们使用query()来进行表的创建、修改或者删除。
$db= Typecho_Db::get();
$prefix = $db->getPrefix();
$db->query('create table '.$prefix.'metas xxxxx');
注意,使用query方式创建表的时候,需要在表明前手动添加$prefix前缀,否则在后面的使用过程中会造成困惑。
还可以使用table.来代替$prefix,typecho会自动识别并替换成指定的前缀。
同理,修改或者删除Typecho数据库中表,按照同样的方式调用query即可。
数据查询
- select,查询表数据
select语句是可以说Typecho插件开发中最常用的sql调用。
$db = Typecho_Db::get();$query= $db->select()->from('table.metas');
$result = $db->fetchAll($query);</code></pre><h6>注:</h6><p>在<code>typecho</code>中,.号具有特定的意义,这里<code>table.metas</code>表示这是一个<code>metas</code>表。实际上,<code>typecho</code>是自动将<code>table.</code>的字符使用<code>str_replace</code>替换成了<code>config.inc.php</code>中设定的前缀。</p><p>举例:</p><blockquote>$db->select()->from('table.metas');将生成SELECT * FROM typecho_metas WHERE (mid= '2' ),其中typecho_是表前缀;而$db->select()->from('metas');将生成SELECT * FROM metas WHERE (mid= '2' ),注意这里没有了表前缀。</blockquote><ol start="2"><li>指定表字段查询</li></ol><p>有时为了提高查询性能,需要指定查询表中特定的几个字段,那么可以使用下面的方式:</p><pre><code>$query= $db->select('mid','name')->from('table.metas');
echo $query; //SELECT mid
, name
FROM typecho_metas</code></pre><p>如果联合查询中,两个表存在相同的字段名,那么可以使用<code>table.</code>来指定表名:</p><pre><code>$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' )</code></pre><p>若需要指定多个查询条件,直接多次调用where即可,将生成and关系的where条件</p><pre><code>$db->select('mid','name')->from('table.metas')->where('mid = ?', 2)->where('name like ? ', $name);</code></pre><ol start="4"><li>使用OR关系的查询条件</li></ol><p>可以使用<code>orWhere()</code>函数来指定<code>SQL</code>查询的或条件。</p><pre><code>$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</code></pre><p><code>Typecho</code>中,还提供了一种简写的方法,见<code>page()</code>函数。</p><pre><code>$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表示降序排序
联合查询
联合查询是SQL
的常用语法,在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' )
- update,更新表数据
Typecho
中,使用update()
函数来进行更新表操作。但注意,update
操作,需要借助于query
执行。
$update = $db->update('table.metas')->rows(array('name'=>'case_in_cn'))->where('mid=?',6);
即可,对于小于5.2版本,则需要显式调用
echo $update;//UPDATE typecho_metas SETname
= 'some_name' WHERE (mid
='6' )
//执行后,返回收影响的行数。
$updateRows= $db->query($update);</code></pre><ol start="2"><li>insert,插入数据</li></ol><p><code>Typecho</code>中,使用<code>insert()</code>函数来进行表插入操作。同样,<code>insert</code>操作需要借助于<code>query</code>函数。</p><pre><code>$insert = $db->insert('table.metas')->rows(array('mid' => '22', 'name' => 'hello world'));
//将构建好的sql执行, 如果你的主键id是自增型的还会返回insert id
$insertId = $db->query($insert);</code></pre><ol start="3"><li>delete,删除数据</li></ol><p><code>Typecho</code>中使用<code>delete()</code>函数来删除数据表中的行。<code>delete</code>操作用于删除数据表中指定的行,同样需要借助<code>query</code>函数执行。</p><pre><code>$delete = $db->delete('table.metas')->where('mid = ?', 2);
//将构建好的sql执行, 会自动返回已经删除的记录数
$deletedRows = $db->query($delete);</code></pre><h3>数据库调试</h3><h5>查看查询语句</h5><p>在<code>Typecho</code>调试过程中,打印<code>sql</code>语句往往是很有帮助的。对于大于5.2版本的<code>php</code>,直接<code>echo $query__toString()
函数$select = $db->select()->from('table.metas');
//如果版本大于php5.2
echo $select;
//如果小于php5.2
echo $select->__toString();注:文中内容来自网络收集。