原生SQL:读操作(query方法)
一、TP5原生读操作是通过Query类的query()方法来实现
该方法定义在:db/Query.php 类文件中
从源码说明可知,该方法功能是:执行查询,返回数据集,其参数主要有二个:
执行查询的SQL语句字符串:$sql;
用数组方式绑定的查询参数:$bind。
2、Db类直接静态调用方法
静态调用方式(最直接、速度也最快)
我们看源码发现,query()并不是一个静态方法,为什么静态调用呢?
如果要搞清这个问题,必须要看一下Db类的源码
Think\Db.php
__callStatic(方法名,参数数组):这是一个静态魔术方法,当类调用一个不存在的静态方法时,自动调用。
call_user_func_array([对象,方法名],[参数数组]):根据传入的方法,动态执行对象或类的方法。
以上知识是PHP面对象的内容,不熟悉的同学,可以复习下,如果暂时不理解,也不影响继续学下去!
有了以上知识,我们就可以写查询语句了~~
我们知道,TP5把数据类拆分为Connection(连接器)/Builder(SQL生成器)/Query(查询执行器)
我们先严格按照SQL语句生成三步曲来写
先生成连接器,获取到数据库连接的实例(Connector.php);
连贯方法生成查询条件,调用builder.php对应方法生成SQL语句(Builder.php);
最后由Query.php中对应方法执行SQL语句,完成CURD操作(Query.php);
类:: 连接器->SQL解析与生成->执行SQL语句
实例:查询tp5_staff表中男员工中工资大于3000的员工信息
目前表中数据如下:
本例没有用到连贯方法,直接用query()方法生成SQL
我们修改一下Index.php控制器中的index()方法
namespace app\index\controller;
use think\Db;
class Index{
public function index(){
//数据库连接配置字符串
$dbConfig = 'mysql://root:root@localhost:3306/tp5#utf8';
$sql = 'SELECT id,name,salary FROM tp5_staff WHERE sex = 1 AND salary > 3000';
//将配置字符串做为connect()的参数传入
$result=Db::connect($dbConfig) //创建数据库连接
->query($sql); //获取结果集
//以二维数据方式返回结果集
dump($result);
}
}
运行结果如下:
我们的项目绝大多数都采用一个数据库,因此数据库的连接信息一旦配置好,就可以随处调用。对于默认数据库连接,我们可以省去创建数据库实例的步骤。
因此上面代码中的数据库连接部分可以省略,重写后的Index.php类文件:
namespace app\index\controller;
use think\Db;
class Index{
public function index(){
//创建SQL语句字符串
$sql = 'SELECT id,name,salary FROM tp5_staff WHERE sex = 1 AND salary > 3000';
//获取结果集
$result=Db::query($sql);
//以二维数据方式返回结果集
dump($result);
}
}
运行结果与上面的完全相同。
我们看query()方法源码时,发现可以绑定参数,这样可防止SQL注入
什么是防止SQL注入,感兴趣的同学,可以了解一下~~
参数绑定,我们是通过数组方式来实现的。
例如:上面的SQL语句中的条件部分,用到了二个待定参数,我们就可以用参数绑定的方式来实现动态设置。
例:query(‘SELECT * FROM tp_staff WHERE id = ?’,['1005']);
如SQL语句使用命名占位符,而不是通用的 ?,我们还可以用关联数组来实现
如:query(‘SELECT * FROM tp_staff WHERE id = :id’,['id'=>1005]);
下面我们继续改写控制器Index.php
使用通用占位符?
WHERE 中的条件值,用 “ ?” 来代替
namespace app\index\controller;
use think\Db;
class Index{
public function index(){
//创建SQL语句字符串
$sql = 'SELECT id,name,salary FROM tp5_staff WHERE sex = ? AND salary > ?';
//获取结果集
$result=Db::query($sql,[1,3000]);
//以二维数据方式返回结果集
dump($result);
}
}
使用命名点位符
WHERE 中的条件值用:“ :字符串” 来表示,推荐用字段名或有意义的标识符。
namespace app\index\controller;
use think\Db;
class Index{
public function index(){
//创建SQL语句字符串
$sql = 'SELECT id,name,salary FROM tp5_staff WHERE sex = :sex AND salary > :salary';
//获取结果集
$result=Db::query($sql,['sex'=>1,'salary'=>3000]);
//以二维数据方式返回结果集
dump($result);
}
}
运行结果