Typecho數據庫提供了非常易用的api,和原生SQL寫法沒有太大的差別,同時也很好地處理了SQL常見的安全問題,如sql注入。
本文從實用角度出發,介紹了typecho操作數據庫的常用場景以及相關api用法。
表創建和刪除
在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即可。
數據查詢
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');
將生成SELECT * FROM typecho_metas WHERE (mid = '2' ),其中typecho_是表前綴;
而$db->select()->from('metas');將生成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 2Typecho中,還提供了一種簡寫的方法,見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` DESCTips: 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);
echo $update;//UPDATE typecho_metas SET `name` = 'some_name' WHERE (`mid`='6' )
//執行後,返回收影響的行數。
$updateRows= $db->query($update);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);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();