## 原生查询 设置好数据库连接信息后,我们就可以直接进行原生的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); ~~~