# 查詢
## 基本查詢
### 常規查詢
要提交一個查詢,使用?**query**?函數:
~~~
$this->db->query('YOUR QUERY HERE');
~~~
當你執行讀類型的查詢(如:SELECT)時,query()?函數將以**對象**形式 返回一個結果集,參考這里來?[顯示你的結果](http://codeigniter.org.cn/user_guide/database/results.html)。 當你執行寫類型的查詢(如:INSERT、DELETE、UPDATE)時,函數將簡單的返回 TRUE 或 FALSE 來表示操作是否成功。 你可以將函數返回的結果賦值給一個變量,這樣你就可以根據這個變量來獲取 數據了,像下面這樣:
~~~
$query = $this->db->query('YOUR QUERY HERE');
~~~
### 簡化查詢
**simple_query**?函數是?$this->db->query()?的簡化版。它不會返回查詢的 結果集,不會去設置查詢計數器,不會去編譯綁定的數據,不會去存儲查詢的調試信息。 它只是用于簡單的提交一個查詢,大多數用戶并不會用到這個函數。
**simple_query**?函數直接返回數據庫驅動器的 "execute" 方法的返回值。對于寫類型的 查詢(如:INSERT、DELETE、UPDATE),返回代表操作是否成功的 TRUE 或 FALSE;而 對于讀類型的成功查詢,則返回代表結果集的對象。
~~~
if ($this->db->simple_query('YOUR QUERY'))
{
echo "Success!";
}
else
{
echo "Query failed!";
}
~~~
注解
對于所有的查詢,如果成功執行的話,PostgreSQL 的?pg_exec()?函數 都會返回一個結果集對象,就算是寫類型的查詢也是這樣。如果你想判斷查詢執行是否 成功或失敗,請記住這一點。
## 指定數據庫前綴
如果你配置了一個數據庫前綴參數,想把它加上你的 SQL 語句里的表名前面, 你可以調用下面的方法:
~~~
$this->db->dbprefix('tablename'); // outputs prefix_tablename
~~~
如果你想動態的修改這個前綴,而又不希望創建一個新的數據庫連接,可以使用這個方法:
~~~
$this->db->set_dbprefix('newprefix');
$this->db->dbprefix('tablename'); // outputs newprefix_tablename
~~~
## 保護標識符
在很多數據庫里,保護表名和字段名是可取的,例如在 MySQL 數據庫里使用反引號。?**使用查詢構造器會自動保護標識符**,盡管如此,你還是可以像下面這樣手工來保護:
~~~
$this->db->protect_identifiers('table_name');
~~~
重要
盡管查詢構造器會盡力保護好你輸入的表名和字段名,但值得注意的是, 它并不是被設計來處理任意用戶輸入的,所以,請不要傳未處理的數據給它。
這個函數也可以為你的表名添加一個前綴,如果你在數據庫配置文件中定義了?dbprefix?參數,通過將這個函數的第二個參數設置為 TRUE 來啟用前綴:
~~~
$this->db->protect_identifiers('table_name', TRUE);
~~~
## 轉義查詢
在提交數據到你的數據庫之前,確保先對其進行轉義是個非常不錯的做法。 CodeIgniter 有三個方法來幫你做到這一點:
1. **$this->db->escape()**?這個函數會檢測數據類型,僅轉義字符串類型的數據。 它會自動用單引號將你的數據括起來,你不用手動添加:
~~~
$sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";
~~~
2. **$this->db->escape_str()**?這個函數忽略數據類型,對傳入的數據進行轉義, 這個方法并不常用,一般情況都是使用上面的那個方法。方法的使用代碼如下:
~~~
$sql = "INSERT INTO table (title) VALUES('".$this->db->escape_str($title)."')";
~~~
3.
**$this->db->escape_like_str()**?這個函數用于處理 LIKE 語句中的字符串,
這樣,LIKE 通配符('%', '_')可以被正確的轉義。
~~~
$search = '20% raise';
$sql = "SELECT id FROM table WHERE column LIKE '%" .
$this->db->escape_like_str($search)."%'";
~~~
## 查詢綁定
查詢綁定可以簡化你的查詢語法,它通過系統自動的為你將各個查詢組裝在一起。 參考下面的例子:
~~~
$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";
$this->db->query($sql, array(3, 'live', 'Rick'));
~~~
查詢語句中的問號將會自動被第二個參數位置的數組的相應的值替代。
也可以使用數組的數組進行綁定,里面的數組會被轉換成 IN 語句的集合:
~~~
$sql = "SELECT * FROM some_table WHERE id IN ? AND status = ? AND author = ?";
$this->db->query($sql, array(array(3, 6), 'live', 'Rick'));
~~~
上面的例子會被轉換為這樣的查詢:
~~~
SELECT * FROM some_table WHERE id IN (3,6) AND status = 'live' AND author = 'Rick'
~~~
使用查詢綁定的第二個好處是:所有的值會被自動轉義,生成安全的查詢語句。 你不再需要手工進行轉義,系統會自動進行。
## 錯誤處理
**$this->db->error();**
要獲取最近一次發生的錯誤,使用?error()?方法可以得到一個包含錯誤代碼和錯誤消息的數組。 這里是一個簡單例子:
~~~
if ( ! $this->db->simple_query('SELECT `example_field` FROM `example_table`'))
{
$error = $this->db->error(); // Has keys 'code' and 'message'
}
~~~
- 歡迎使用 CodeIgniter
- 安裝說明
- 下載 CodeIgniter
- 安裝說明
- 從老版本升級
- 疑難解答
- CodeIgniter 概覽
- CodeIgniter 將從這里開始
- CodeIgniter 是什么?
- 支持特性
- 應用程序流程圖
- 模型-視圖-控制器
- 設計與架構目標
- 教程 - 內容提要
- 加載靜態內容
- 讀取新聞條目
- 創建新聞條目
- 結束語
- 常規主題
- CodeIgniter URL
- 控制器
- 保留名稱
- 視圖
- 模型
- 輔助函數
- 使用 CodeIgniter 類庫
- 創建類庫
- 使用 CodeIgniter 驅動器
- 創建驅動器
- 創建核心系統類
- 創建附屬類
- 鉤子 - 擴展框架核心
- 自動加載資源
- 公共函數
- 兼容性函數
- URI 路由
- 錯誤處理
- 網頁緩存
- 程序分析
- 以 CLI 方式運行
- 管理你的應用程序
- 處理多環境
- 在視圖文件中使用 PHP 替代語法
- 安全
- PHP 開發規范
- 類庫參考
- 基準測試類
- 緩存驅動器
- 日歷類
- 購物車類
- 配置類
- Email 類
- 加密類
- 加密類(新版)
- 文件上傳類
- 表單驗證類
- FTP 類
- 圖像處理類
- 輸入類
- Javascript 類
- 語言類
- 加載器類
- 遷移類
- 輸出類
- 分頁類
- 模板解析類
- 安全類
- Session 類
- HTML 表格類
- 引用通告類
- 排版類
- 單元測試類
- URI 類
- 用戶代理類
- XML-RPC 與 XML-RPC 服務器類
- Zip 編碼類
- 數據庫參考
- 數據庫快速入門: 示例代碼
- 數據庫配置
- 連接你的數據庫
- 查詢
- 生成查詢結果
- 查詢輔助函數
- 查詢構造器類
- 事務
- 數據庫元數據
- 自定義函數調用
- 數據庫緩存類
- 數據庫工廠類
- 數據庫工具類
- 數據庫驅動器參考
- 輔助函數參考
- 數組輔助函數
- 驗證碼輔助函數
- Cookie 輔助函數
- 日期輔助函數
- 目錄輔助函數
- 下載輔助函數
- 郵件輔助函數
- 文件輔助函數
- 表單輔助函數
- HTML 輔助函數
- 語言輔助函數
- Inflector 輔助函數
- 數字輔助函數
- 路徑輔助函數
- 安全輔助函數
- 表情輔助函數
- 字符串輔助函數
- 文本輔助函數
- 排版輔助函數
- URL 輔助函數
- XML 輔助函數
- 向 CodeIgniter 貢獻你的力量