1.Thinkphp中where()条件的使用

  总是有人觉得,thinkphp的where()就是写我要进行增加、查询、修改、删除数据的条件,很简单的,其实我想告诉你,where()是写条件语句的,但是他很不简单,严密的条件语句,可以有效的防止sql注入,也可以加强sql语句的严密性,也有利于进行搜索查询

  1.1查询方法分类

  where方法的用法是ThinkPHP查询语言的精髓,可以完成包括普通查询、表达式查询、快捷查询、区间查询、组合查询在内的查询操作。where方法的参数支持字符串和数组,虽然也可以使用对象但并不建议。

  1.1.1字符串条件

  使用字符串条件直接查询和操作(TP框架控制器中的条件语句可以在/Runtime/Logs/.. 里面找到,可以对比)例:

       $User = M("User"); // 实例化User对象
       $User->where('type=1 AND status=1')->select();

  生成sql语句:SELECT * FROM user WHERE type=1 AND status=1;

  在TP版本3.1以上时,建议配合预处理机制,确保更加安全,可以有效的防sql注入

    $Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();

或者: $Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();

  1.1.2数组条件

  最简单的数组条件查询:

  $User = M("User"); // 实例化User对象
      $map['name'] = 'thinkphp';
      $map['status'] = 1;
      // 把查询条件传入查询方法
      $User->where($map)->select();

  生成的SQL语句:SELECT * FROM user WHERE `name`='thinkphp' AND status=1

  1.1.3表达式查询

  $map['字段1']  = array('表达式','查询条件1');
      $map['字段2']  = array('表达式','查询条件2');
      $Model->where($map)->select();   

  1.1.4表达式中运算符条件的查询

  TP运算符

  SQL运算符 例子 实际查询条件
eq = $map['id'] = array('eq',100); 等效于:$map['id'] = 100;
neq != $map['id'] = array('neq',100); id != 100
gt > $map['id'] = array('gt',100); id > 100
egt >= $map['id'] = array('egt',100); id >= 100
lt < $map['id'] = array('lt',100); id < 100
elt <= $map['id'] = array('elt',100); id <= 100
like like $map<'username'> = array('like','Admin%'); username like 'Admin%'
between between and $map['id'] = array('between','1,8'); id BETWEEN 1 AND 8
not between not between and $map['id'] = array('not between','1,8'); id NOT BETWEEN 1 AND 8
in in $map['id'] = array('in','1,5,8'); id in(1,5,8)
not in not in $map['id'] = array('not in','1,5,8'); id not in(1,5,8)
and(默认) and $map['id'] = array(array('gt',1),array('lt',10)); (id > 1) AND (id < 10)
or or $map['id'] = array(array('gt',3),array('lt',10), 'or'); (id > 3) OR (id < 10)
xor(异或) xor 两个输入中只有一个是true时,结果为true,否则为false,例子略。 1 xor 1 = 0
exp 综合表达式 $map['id'] = array('exp','in(1,3,8)'); $map['id'] = array('in','1,3,8');

    exp 不是一个运算符,而是一个综合表达式以支持更复杂的条件设置。exp 的操作条件不会被当成字符串,可以使用任何 SQL 支持的语法,包括使用函数和字段名称。

  1.1.5快捷查询

   一、实现不同字段相同的查询条件

  $User = M("User"); // 实例化User对象
      $map['name|title'] = 'thinkphp';
      // 把查询条件传入查询方法
      $User->where($map)->select();

  查询条件就变成 name= 'thinkphp' OR title = 'thinkphp',是不是很强大

  二、实现不同字段不同的查询条件

  $User = M("User"); // 实例化User对象
      $map['status&title'] =array('1','thinkphp','_multi'=>true);
      // 把查询条件传入查询方法
      $User->where($map)->select();

  '_multi'=>true必须加在数组的最后,表示当前是多条件匹配,这样查询条件就变成 status= 1 AND title = 'thinkphp' ,查询字段还能支持更多。

  例:$map['status&score&title'] =array('1',array('gt','0'),'thinkphp','_multi'=>true);
    查询条件就变成 status= 1 AND score >0 AND title = 'thinkphp'

    注意:快捷查询方式中“|”和“&”不能同时使用。

  三、区间查询

    where方法支持对某个字段的区间查询,例如:
       $map['id'] = array(array('gt',1),array('lt',10)) ;

     得到的查询条件是: (`id` > 1) AND (`id` < 10)

    $map['id'] = array(array('gt',3),array('lt',10), 'or') ;
    得到的查询条件是: (`id` > 3) OR (`id` < 10)

    区间查询的条件可以支持普通查询的所有表达式,也就是说类似LIKE、GT和EXP这样的表达式都可以支持。另外区间查询还可以支持更多的条件,只要是针对一个字段的条件都可以写到一起。

    例:$map['name']  = array(array('like','%a%'), array('like','%b%'), array('like','%c%'), 'ThinkPHP','or'); 
    最后的查询条件是:(`name` LIKE '%a%') OR (`name` LIKE '%b%') OR (`name` LIKE '%c%') OR (`name` = 'ThinkPHP')

  1.1.6组合查询(这是项目中最常用到,并且很重要的一个查询方式)

一、字符串模式查询(采用_string 作为查询条件)
 数组条件还可以和字符串条件混合使用,例如:

 $User = M("User"); // 实例化User对象
 $map['id'] = array('neq',1);
 $map['name'] = 'ok';
 $map['_string'] = 'status=1 AND score>10';
 $User->where($map)->select();

 最后得到的查询条件就成了:( `id` != 1 ) AND ( `name` = 'ok' ) AND ( status=1 AND score>10 )

二、请求字符串查询方式
       请求字符串查询是一种类似于URL传参的方式,可以支持简单的条件相等判断。
   $map['id'] = array('gt','100');
   $map['_query'] = 'status=1&score=100&_logic=or';

   得到的查询条件是:`id`>100 AND (`status` = '1' OR `score` = '100')

三、复合查询
复合查询相当于封装了一个新的查询条件,然后并入原来的查询条件之中,所以可以完成比较复杂的查询条件组装。
例如:
    $where['name'] = array('like', '%thinkphp%');
    $where['title'] = array('like','%thinkphp%');
    $where['_logic'] = 'or';
    $map['_complex'] = $where;
    $map['id'] = array('gt',1);

查询条件是:( id > 1) AND ( ( name like '%thinkphp%') OR ( title like '%thinkphp%') )
复合查询使用了_complex作为子查询条件来定义,配合之前的查询方式,可以非常灵活的制定更加复杂的查询条件。(当你掌握到这种程度,说明你的where()条件的使用快没有问题了)

1.1.7多次调用
  where方法支持多次调用,但字符串条件只能出现一次。
  $map['a'] = array('gt',1);
   $where['b'] = 1;
   $Model->where($map)->where($where)->where('status=1')->select();

  多次的数组条件表达式会最终合并,但字符串条件则只支持一次。

TP的where方法的使用的更多相关文章

  1. TP框架M方法 create方法丢失字段问题

    TP框架M方法 create方法丢失字段问题! thinkphp框架M方法 create方法丢失字段问题! thinkphp框架M方法 add方法字段丢失问题! 数据库 表新增了字段,用create方 ...

  2. TP框架I方法详解

    TP框架I方法详解   I方法是ThinkPHP众多单字母函数中的新成员,其命名来自于英文Input(输入),主要用于更加方便和安全的获取系统输入变量,可以用于任何地方,用法格式如下:I('变量类型. ...

  3. 关于TP中U方法,在wamp中是绝对路径,在nginx中是相对路径?(坑)

    这个问题已多次遇到,关于tp 框架 使用U 方法跳转, 在Nginx 服务器上可能会遇到路由跳转不过去前面带点(如:./xx) 解决这个问题,可以在tp的入口文件 index.php 里定义个常量 d ...

  4. TP中U方法详解

    U方法常用于ThinkPHP里的页面跳转 官方称为url组装, 就是根据某种规则组成一个url地址,这个功能就叫组装. 在ThinkPHP里,系统提供了一个封装的函数来处理url的组装,俗称U方法. ...

  5. tp中u方法的使用

    自学的时候都没怎么使用过该方法,现在刚进入一个新公司参加项目.发现这个方法用的很多,所以记录下来防止以后忘了. U方法用于完成对URL地址的组装,特点在于可以自动根据当前的URL模式和设置生成对应的U ...

  6. 基于TP框架的ThinkCMF,控制器display方法源码分析

    昨天在写代码的时候,看见写了无数次的模版渲染方法:$this->display(),突然很想弄清楚它是如何实现的. 今天不忙,就分析了一下. class TestController exten ...

  7. TP框架实现分页

    TP框架自带分页的实现方法,所以使用这个分页方案,不用再重新造轮子 1,先看效果图 2,源码 /** * TODO 基础分页的相同代码封装,使前台的代码更少 * @param $m 模型,引用传递 * ...

  8. tp未验证内容-9

    在tp的数据库配置中, convention.php中所有的选项都没有设置,要自己在Home/conf/config.php中自己设置, 注意几个地方,一是数据库的名字是: db_name,不是db_ ...

  9. 5种必会的Java异步调用转同步的方法你会几种

    转载请注明本文地址:https://www.jianshu.com/p/f00aa6f66281 源码地址:https://gitee.com/sunnymore/asyncToSync Sunny先 ...

随机推荐

  1. Python基础篇(三)_函数及代码复用

    Python基础篇_函数及代码复用 函数的定义.使用: 函数的定义:通过保留字def实现. 定义形式:def <函数名>(<参数列表>): <函数体> return ...

  2. Mysql 查询天、周,月,季度、年的数据

    Mysql 查询天.周,月,季度.年的数据 今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 ...

  3. Cisco 综合配置(一)

    要求: 1.内网所有PC及服务器都能访问外网 2.外网通过公网地址 202.101.100.3 访问内网服务器的Telnet服务 配置: PC.服务器都配置好自己的IP和默认网关:192.168.1. ...

  4. dijkstra模板题 洛谷1339 邻接图建边

    题目链接:https://www.luogu.com.cn/problem/P1339 朴素dijkstra算法的复杂度是O(n^2),用堆优化的dijkstra复杂度是O(nlogn)的.在本题中前 ...

  5. Hive内外表的区分方法及内外部差异

    Hive内外部区分方法 查看hive元数据:进入mysql中hive元数据库,查看TBLS表,查看对应的表名和表类型: 在hive-cli界面:desc extended tablename,查看Ta ...

  6. 数据源管理 | 主从库动态路由,AOP模式读写分离

    本文源码:GitHub·点这里 || GitEE·点这里 一.多数据源应用 1.基础描述 在相对复杂的应用服务中,配置多个数据源是常见现象,例如常见的:配置主从数据库用来写数据,再配置一个从库读数据, ...

  7. 使用室内三维地图引擎ESMap来管理摄像头设备、消防设备和人员轨迹展示

    目前室内三维地图如何轻量化,能够在手机微信.电脑浏览器等平台快速显示地图,显示的地图性能好,转动地图不卡是大家都要面对的问题, 使用室内三维地图引擎ESMap后目前可以不用操心这方面的问题,开发只需要 ...

  8. Typora+markdown 最常用语法教程

    Typora+markdown 最常用语法教程(by 程序员宝藏) Typora+markdown 最常用语法教程(by 程序员宝藏) 请先配置推荐配置(文件->偏好设置): 文章目录 Typo ...

  9. 【NLP面试QA】基本策略

    目录 防止过拟合的方法 什么是梯度消失和梯度爆炸?如何解决? 在深度学习中,网络层数增多会伴随哪些问题,怎么解决? 关于模型参数 模型参数初始化的方法 模型参数初始化为 0.过大.过小会怎样? 为什么 ...

  10. Spring中应用的那些设计模式

    设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆. 今天,我们就设计模式的内在价值做一番探讨,并以spring为例进行讲解,只有领略了其设计的思想理念 ...