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

原生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语句生成三步曲来写

  1. 先生成连接器,获取到数据库连接的实例(Connector.php);
  2. 连贯方法生成查询条件,调用builder.php对应方法生成SQL语句(Builder.php);
  3. 最后由Query.php中对应方法执行SQL语句,完成CURD操作(Query.php);

类:: 连接器->SQL解析与生成->执行SQL语句

实例:查询tp5_staff表中男员工中工资大于3000的员工信息

  • 目前表中数据如下:

  • 本例没有用到连贯方法,直接用query()方法生成SQL
  • 我们修改一下Index.php控制器中的index()方法
<?php
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类文件:
<?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 中的条件值,用 “ ?” 来代替

     

 

<?php
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 中的条件值用:“ :字符串” 来表示,推荐用字段名或有意义的标识符。
<?php
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);   
    }
}
  • 运行结果

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值