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

    • 一、TP5原生读操作是通过Query类的query()方法来实现
    • 2、Db类直接静态调用方法
    • 我们知道,TP5把数据类拆分为Connection(连接器)/Builder(SQL生成器)/Query(查询执行器)
    • 类:: 连接器->SQL解析与生成->执行SQL语句
    • 实例:查询tp5_staff表中男员工中工资大于3000的员工信息

原生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);   }
}
  • 运行结果

tp5原生SQL:读操作(query方法)相关推荐

  1. django使用mysql原始语句,Django中使用mysql数据库并使用原生sql语句操作

    Django自身默认使用sqlite3这个轻量级的数据库,但是当我们开发网站时,sqlite3就没有mysql好,sqlite3适合一些手机上开发使用的数据库. 准备的软件 mysql数据库,版本5. ...

  2. django mysql sql语句_Django中使用mysql数据库并使用原生sql语句操作

    Django自身默认使用sqlite3这个轻量级的数据库,但是当我们开发网站时,sqlite3就没有mysql好,sqlite3适合一些手机上开发使用的数据库. 准备的软件 mysql数据库,版本5. ...

  3. php原生sql语法,thinkphp执行原生SQL语句的实现方法

    怎样在thinkphp里面执行原生的sql语句? $Model = new Model();//或者 $Model = D(); 或者 $Model = M(); $sql = "selec ...

  4. 分页offset格式_Thinkphp5 原生sql分页操作

    一.问题描述:我们用Thinkphp5开发功能的时候框架自带的查询方法不太好使用类似于连接查询和复制的sql语句,这是我们就需要用到原生sql语句查询数据.但是使用原生sql语句查询的方式就无法使用框 ...

  5. django执行原生SQL语句

    1.原生SQL用法概述 django可以执行原生SQL语句,主要分读和写两类,用法如下: 读(查):xxxModel.object.raw() 写(增删改):connection.cursor() 2 ...

  6. jpa原生query_Spring Data Jpa @Query原生SQL

    使用Spring Data JPA时,可以使用@Query注解解决表关联查询问题.使用@Query注解可以使用原生SQL.此时,会遇到如何分页,如何动态拼装SQL等问题. 原生SQL 在@Query注 ...

  7. 左外连接的sql语句_Django数据库连接和使用原生sql语句

    在操作数据库之前,首先先要连接数据库.这里我们以配置 MySQL 为例来讲解. Django连接数据库,不需要单独的创建一个连接对象.只需要在 settings.py 文件中做好数据库相关的配置就可以 ...

  8. php中query()作用,query()方法

    query()方法 履行SQL命令,不管如何通过PHP脚本与Mysql数据库交互,进程都是1样的,创建1个SQL语句,再传递给履行查询的函数. 在mysqli类中提供了几种履行SQL命令的方法,其中最 ...

  9. thinkphp mysql 预处理_thinkPHP框架中执行原生SQL语句的方法

    本文实例讲述了thinkPHP框架中执行原生SQL语句的方法.分享给大家供大家参考,具体如下: 怎样在thinkphp里面执行原生的sql语句? $Model = new Model();//或者 $ ...

最新文章

  1. MySQL留言板怎么创建_如何使用JSP+MySQL创建留言本(三)
  2. 10.Stream流
  3. Vsftpd 服务的部署及优化
  4. Unity3D中如何计算场景中的三角面和顶点数
  5. ServletConfig 对象
  6. java实现js取反_特定位取反(js实现)
  7. 性能优化:如何更快地接收数据
  8. 调取百度地图接口,实现取自己的实时位置,然后可以在百度地图上添加信息标注...
  9. oracle12C 创建用户学习
  10. 【肌电信号】肌电信号处理系统含Matlab源码
  11. 时域分析特征参数的计算代码(Matlab和Qt两种)
  12. 肥姐沈殿霞离世追悼会时间待定 为女儿留下上亿遗产
  13. 【微电网优化】基于粒子群算法求解热电联供型微电网经济运行优化问题含Matlab源码
  14. 启动openoffice命令
  15. 曝光补偿,白增黑减理论
  16. Makefile文件是什么
  17. Live800:企业如何选择在线客服系统解决方案?
  18. Sublime Text 2以及Zen Coding
  19. 公司设备换新,哪家智能会议平板好?
  20. 基于51单片机的智能鞋柜衣柜消毒柜

热门文章

  1. 计算机网络实验-->> IP 协议分析
  2. ML_12 Sum-Produkt Networks 和积网络
  3. 25 网站应用攻击与防御
  4. docker查看mysql镜像版本_Docker 查看镜像信息
  5. 3288 android5.1 编译,【DLT-RK3288试用】8. RK3288 编译 Android 5.1 源码
  6. python logging动态变更输出日志文件名
  7. UE4 UE4使用小技巧——使用上帝视角运行游戏
  8. android 计步器 开发,Android计步器开发
  9. 【ZYNQ】 cache解决问题
  10. 获取设备的型号信息,比如iPhone5s,iPhone5等等