## 原生查询
设置好数据库连接信息后,我们就可以直接进行原生的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你必须努力避免的一些问题