php怎么使用query显示单笔数据,读操作query

本文详细介绍了ThinkPHP5中使用原生SQL进行读操作的方法,包括通过Db::query()执行查询,参数绑定以防止SQL注入,以及如何使用命名占位符。示例代码展示了如何查询tp5_staff表中男员工且工资大于3000的员工信息,解释了Db类的静态调用机制和__callStatic()方法的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原生SQL:读操作(query方法)

一、TP5原生读操作是通过Query类的query()方法来实现

该方法定义在:db/Query.php 类文件中

342b5c2e11be72c90c32975e8690ad18.png

从源码说明可知,该方法功能是:执行查询,返回数据集,其参数主要有二个:

执行查询的SQL语句字符串:$sql;

用数组方式绑定的查询参数:$bind。

2、Db类直接静态调用方法

静态调用方式(最直接、速度也最快)

我们看源码发现,query()并不是一个静态方法,为什么静态调用呢?

如果要搞清这个问题,必须要看一下Db类的源码

Think\Db.php

ffbfcfda11b8806f649225dbe9a71191.png

__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的员工信息

目前表中数据如下:

aa02a17d08a8933c314e7f8d4e6b9ad8.png

本例没有用到连贯方法,直接用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);

}

}

运行结果如下:

9372f3684920cac9b61c33bc96e9a55f.png

我们的项目绝大多数都采用一个数据库,因此数据库的连接信息一旦配置好,就可以随处调用。对于默认数据库连接,我们可以省去创建数据库实例的步骤。

因此上面代码中的数据库连接部分可以省略,重写后的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);

}

}

运行结果

9b762a9d48fae17d4f550999f86fe3e2.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值