CodeIgniter 查詢

2018-07-21 15:41 更新

查詢

基本查詢

常規(guī)查詢

要提交一個(gè)查詢,使用 query 函數(shù):

$this->db->query('YOUR QUERY HERE');

當(dāng)你執(zhí)行讀類型的查詢(如:SELECT)時(shí),query() 函數(shù)將以對(duì)象形式 返回一個(gè)結(jié)果集,參考這里來(lái) 顯示你的結(jié)果。 當(dāng)你執(zhí)行寫(xiě)類型的查詢(如:INSERT、DELETE、UPDATE)時(shí),函數(shù)將簡(jiǎn)單的返回 TRUE 或 FALSE 來(lái)表示操作是否成功。 你可以將函數(shù)返回的結(jié)果賦值給一個(gè)變量,這樣你就可以根據(jù)這個(gè)變量來(lái)獲取 數(shù)據(jù)了,像下面這樣:

$query = $this->db->query('YOUR QUERY HERE');

簡(jiǎn)化查詢

simple_query 函數(shù)是 $this->db->query() 的簡(jiǎn)化版。它不會(huì)返回查詢的 結(jié)果集,不會(huì)去設(shè)置查詢計(jì)數(shù)器,不會(huì)去編譯綁定的數(shù)據(jù),不會(huì)去存儲(chǔ)查詢的調(diào)試信息。 它只是用于簡(jiǎn)單的提交一個(gè)查詢,大多數(shù)用戶并不會(huì)用到這個(gè)函數(shù)。

simple_query 函數(shù)直接返回?cái)?shù)據(jù)庫(kù)驅(qū)動(dòng)器的 "execute" 方法的返回值。對(duì)于寫(xiě)類型的 查詢(如:INSERT、DELETE、UPDATE),返回代表操作是否成功的 TRUE 或 FALSE;而 對(duì)于讀類型的成功查詢,則返回代表結(jié)果集的對(duì)象。

if ($this->db->simple_query('YOUR QUERY'))
{
    echo "Success!";
}
else
{
    echo "Query failed!";
}

注解

對(duì)于所有的查詢,如果成功執(zhí)行的話,PostgreSQL 的 pg_exec() 函數(shù) 都會(huì)返回一個(gè)結(jié)果集對(duì)象,就算是寫(xiě)類型的查詢也是這樣。如果你想判斷查詢執(zhí)行是否 成功或失敗,請(qǐng)記住這一點(diǎn)。

指定數(shù)據(jù)庫(kù)前綴

如果你配置了一個(gè)數(shù)據(jù)庫(kù)前綴參數(shù),想把它加上你的 SQL 語(yǔ)句里的表名前面, 你可以調(diào)用下面的方法:

$this->db->dbprefix('tablename'); // outputs prefix_tablename

如果你想動(dòng)態(tài)的修改這個(gè)前綴,而又不希望創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)連接,可以使用這個(gè)方法:

$this->db->set_dbprefix('newprefix');
$this->db->dbprefix('tablename'); // outputs newprefix_tablename

保護(hù)標(biāo)識(shí)符

在很多數(shù)據(jù)庫(kù)里,保護(hù)表名和字段名是可取的,例如在 MySQL 數(shù)據(jù)庫(kù)里使用反引號(hào)。 使用查詢構(gòu)造器會(huì)自動(dòng)保護(hù)標(biāo)識(shí)符,盡管如此,你還是可以像下面這樣手工來(lái)保護(hù):

$this->db->protect_identifiers('table_name');

重要

盡管查詢構(gòu)造器會(huì)盡力保護(hù)好你輸入的表名和字段名,但值得注意的是, 它并不是被設(shè)計(jì)來(lái)處理任意用戶輸入的,所以,請(qǐng)不要傳未處理的數(shù)據(jù)給它。

這個(gè)函數(shù)也可以為你的表名添加一個(gè)前綴,如果你在數(shù)據(jù)庫(kù)配置文件中定義了 dbprefix 參數(shù),通過(guò)將這個(gè)函數(shù)的第二個(gè)參數(shù)設(shè)置為 TRUE 來(lái)啟用前綴:

$this->db->protect_identifiers('table_name', TRUE);

轉(zhuǎn)義查詢

在提交數(shù)據(jù)到你的數(shù)據(jù)庫(kù)之前,確保先對(duì)其進(jìn)行轉(zhuǎn)義是個(gè)非常不錯(cuò)的做法。 CodeIgniter 有三個(gè)方法來(lái)幫你做到這一點(diǎn):

  1. $this->db->escape() 這個(gè)函數(shù)會(huì)檢測(cè)數(shù)據(jù)類型,僅轉(zhuǎn)義字符串類型的數(shù)據(jù)。 它會(huì)自動(dòng)用單引號(hào)將你的數(shù)據(jù)括起來(lái),你不用手動(dòng)添加:

    $sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";
  2. $this->db->escape_str() 這個(gè)函數(shù)忽略數(shù)據(jù)類型,對(duì)傳入的數(shù)據(jù)進(jìn)行轉(zhuǎn)義, 這個(gè)方法并不常用,一般情況都是使用上面的那個(gè)方法。方法的使用代碼如下:

    $sql = "INSERT INTO table (title) VALUES('".$this->db->escape_str($title)."')";
  3. $this->db->escape_like_str() 這個(gè)函數(shù)用于處理 LIKE 語(yǔ)句中的字符串,

    這樣,LIKE 通配符('%', '_')可以被正確的轉(zhuǎn)義。

$search = '20% raise';
$sql = "SELECT id FROM table WHERE column LIKE '%" .
    $this->db->escape_like_str($search)."%'";

查詢綁定

查詢綁定可以簡(jiǎn)化你的查詢語(yǔ)法,它通過(guò)系統(tǒng)自動(dòng)的為你將各個(gè)查詢組裝在一起。 參考下面的例子:

$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";
$this->db->query($sql, array(3, 'live', 'Rick'));

查詢語(yǔ)句中的問(wèn)號(hào)將會(huì)自動(dòng)被第二個(gè)參數(shù)位置的數(shù)組的相應(yīng)的值替代。

也可以使用數(shù)組的數(shù)組進(jìn)行綁定,里面的數(shù)組會(huì)被轉(zhuǎn)換成 IN 語(yǔ)句的集合:

$sql = "SELECT * FROM some_table WHERE id IN ? AND status = ? AND author = ?";
$this->db->query($sql, array(array(3, 6), 'live', 'Rick'));

上面的例子會(huì)被轉(zhuǎn)換為這樣的查詢:

SELECT * FROM some_table WHERE id IN (3,6) AND status = 'live' AND author = 'Rick'

使用查詢綁定的第二個(gè)好處是:所有的值會(huì)被自動(dòng)轉(zhuǎn)義,生成安全的查詢語(yǔ)句。 你不再需要手工進(jìn)行轉(zhuǎn)義,系統(tǒng)會(huì)自動(dòng)進(jìn)行。

錯(cuò)誤處理

$this->db->error();

要獲取最近一次發(fā)生的錯(cuò)誤,使用 error() 方法可以得到一個(gè)包含錯(cuò)誤代碼和錯(cuò)誤消息的數(shù)組。 這里是一個(gè)簡(jiǎn)單例子:

if ( ! $this->db->simple_query('SELECT `example_field` FROM `example_table`'))
{
    $error = $this->db->error(); // Has keys 'code' and 'message'
}
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)