## 原生查詢
設置好數據庫連接信息后,我們就可以直接進行原生的SQL查詢操作了,包括`query`和`execute`兩個方法,分別用于查詢操作和寫操作,下面我們來實現數據表`think_data`的CURD操作。
### 創建(create)
~~~
// 插入記錄
$result = Db::execute('insert into think_data (id, name ,status) values (5, "thinkphp",1)');
dump($result);
~~~
### 更新(update)
~~~
// 更新記錄
$result = Db::execute('update think_data set name = "framework" where id = 5 ');
dump($result);
~~~
### 讀取(read)
~~~
// 查詢數據
$result = Db::query('select * from think_data where id = 5');
dump($result);
~~~
> query方法返回的結果是一個數據集(數組),如果沒有查詢到數據則返回空數組。
### 刪除(delete)
~~~
// 刪除數據
$result = Db::execute('delete from think_data where id = 5 ');
dump($result);
~~~
### 其它操作
可以執行一些其他的數據庫操作,原則上,讀操作都使用`query`方法,寫操作使用`execute`方法即可,例如:
~~~
// 顯示數據庫列表
$result = Db::query('show tables from demo');
dump($result);
// 清空數據表
$result = Db::execute('TRUNCATE table think_data');
dump($result);
~~~
> `query`方法用于查詢,默認情況下返回的是數據集(二維數組),`execute`方法的返回值是影響的記錄數。
### 切換數據庫
在進行數據庫查詢的時候,支持切換數據庫進行查詢,例如:
~~~
$result = Db::connect([
// 數據庫類型
'type' => 'mysql',
// 服務器地址
'hostname' => '127.0.0.1',
// 數據庫名
'database' => 'thinkphp',
// 數據庫用戶名
'username' => 'root',
// 數據庫密碼
'password' => '123456',
// 數據庫連接端口
'hostport' => '',
// 數據庫連接參數
'params' => [],
// 數據庫編碼默認采用utf8
'charset' => 'utf8',
// 數據庫表前綴
'prefix' => 'think_',
])->query('select * from think_data');
dump($result);
~~~
或者采用字符串方式定義(字符串方式無法定義數據表前綴和連接參數),如下:
~~~
$result = Db::connect('mysql://root:123456@127.0.0.1:3306/thinkphp#utf8')->query('select * from think_data where id = 1');
dump($result);
~~~
為了簡化代碼,通常的做法是事先在配置文件中定義好多個數據庫的連接配置,例如,我們在應用配置文件(`application/config.php`)中添加配置如下:
~~~
// 數據庫配置1
'db1' => [
// 數據庫類型
'type' => 'mysql',
// 服務器地址
'hostname' => '127.0.0.1',
// 數據庫名
'database' => 'thinkphp',
// 數據庫用戶名
'username' => 'root',
// 數據庫密碼
'password' => '123456',
// 數據庫連接端口
'hostport' => '',
// 數據庫連接參數
'params' => [],
// 數據庫編碼默認采用utf8
'charset' => 'utf8',
// 數據庫表前綴
'prefix' => 'think_',
],
// 數據庫配置2
'db2' => [
// 數據庫類型
'type' => 'mysql',
// 服務器地址
'hostname' => '127.0.0.1',
// 數據庫名
'database' => 'test',
// 數據庫用戶名
'username' => 'root',
// 數據庫密碼
'password' => '',
// 數據庫連接端口
'hostport' => '',
// 數據庫連接參數
'params' => [],
// 數據庫編碼默認采用utf8
'charset' => 'utf8',
// 數據庫表前綴
'prefix' => 'test_',
],
~~~
然后就可以直接在`connect`方法中傳入配置參數進行切換數據庫連接,例如:
~~~
$result = Db::connect('db1')->query('select * from think_data where id = 1');
$result = Db::connect('db2')->query('select * from think_data where id = 1');
~~~
`connect`方法中的配置參數需要完整定義,并且僅僅對當此查詢有效,下次調用`Db`類的時候還是使用默認的數據庫連接。如果需要多次切換數據庫查詢,可以使用:
~~~
$db1 = Db::connect('db1');
$db2 = Db::connect('db2');
$db1->query('select * from think_data where id = 1');
$db2->query('select * from think_data where id = 1');
~~~
>[danger] connect方法必須直接進行查詢,下面的寫法是無效的
> ~~~
> Db::connect('db1');
> Db::query('select * from think_data where id = 1');
> ~~~
### 參數綁定
實際開發中,可能某些數據使用的是外部傳入的變量,為了讓查詢操作更加安全,我們建議使用參數綁定機制,例如上面的操作可以改為:
~~~
Db::execute('insert into think_data (id, name ,status) values (?, ?, ?)', [8, 'thinkphp', 1]);
$result = Db::query('select * from think_data where id = ?', [8]);
dump($result);
~~~
也支持命名占位符綁定,例如:
~~~
Db::execute('insert into think_data (id, name , status) values (:id, :name, :status)', ['id' => 10, 'name' => 'thinkphp', 'status' => 1]);
$result = Db::query('select * from think_data where id=:id', ['id' => 10]);
dump($result);
~~~
- 零、序言
- 一、基礎
- (1)簡介
- (2)安裝
- (3)目錄結構
- (4)運行環境
- (5)入口文件
- (6)資源訪問
- (7)調試模式
- (8)控制器
- (9)視圖
- (10)讀取數據
- (11)總結
- 二、URL和路由
- (1)URL訪問
- (2)參數傳入
- (3)隱藏入口
- (4)定義路由
- (5)URL生成
- (6)總結
- 三、請求和響應
- (1)請求對象
- (2)請求信息
- (3)響應對象
- (4)總結
- 四、數據庫
- (1)準備
- (2)數據庫配置
- (3)原生查詢
- (4)查詢構造器
- (5)鏈式操作
- (6)事務支持
- 五、查詢語言
- (1)查詢表達式
- (2)批量查詢
- (3)快捷查詢
- (4)視圖查詢
- (5)閉包查詢
- (6)獲取值和列
- (7)聚合查詢
- (8)時間查詢
- (9)字符串查詢
- (10)分塊查詢
- 六、模型和關聯
- (1)模型定義
- (2)基礎操作
- (3)讀取器和修改器
- (4)類型轉換和自動完成
- (5)查詢范圍
- (6)輸入和驗證
- (7)關聯
- (8)模型輸出
- 七、視圖和模板
- (1)模板輸出
- (2)分頁輸出
- (3)公共模板
- (4)模板定位
- (5)布局模板
- (6)標簽定制
- (7)輸出替換
- (8)渲染內容
- (9)助手函數
- 八、調試和日志
- (1)第一式:未雨綢繆——頁面Trace
- (2)第二式:初見端倪——異常頁面
- (3)第三式:撥云見日——斷點調試
- (4)第四式:欲窮千里——日志分析
- (5)第五式:運籌帷幄——遠程調試
- 九、API開發
- (1)API版本
- (2)異常處理
- (3)RESTFul
- (4)REST調試
- (5)API調試
- (6)安全建議
- 十、命令行工具
- (1)查看指令
- (2)模塊生成
- (3)控制器生成
- (4)生成類庫映射文件
- (5)生成路由緩存
- (6)生成字段緩存
- (7)指令擴展
- (8)命令行調試
- (9)命令行顏色支持
- (10)命令調用
- 十一、擴展
- (1)函數擴展
- (2)類庫擴展
- (3)驅動擴展
- (4)Composer擴展
- 十二、雜項
- Session
- Cookie
- 驗證碼
- 文件上傳
- 圖像處理
- 單元測試
- 番外篇:學習ThinkPHP5的正確姿勢
- 概念篇:ThinkPHP5名詞解釋
- 附錄A、常見問題集
- 附錄B、3.2和5.0區別
- 附錄C、助手函數
- 附錄D、5.1你必須努力避免的一些問題