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();

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

    总结了这么多,是不是感觉有些用法自己也用过呢?感觉写的还可以,点个赞

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

  1. ThinkPHP的field方法的用法总结

    ThinkPHP的连贯操作方法中field方法有很多的使用技巧,field方法主要目的是标识要返回或者操作的字段,下面详细道来. .用于查询 在查询操作中field方法是使用最频繁的. $Model- ...

  2. thinkphp的field方法的用法

    ThinkPHP的连贯操作方法中field方法有很多的使用技巧,field方法主要目的是标识要返回或者操作的字段. 1.用于查询 在查询操作中field方法是使用最频繁的. $Model->fi ...

  3. ThinkPHP + Discuz 整合方法

    ThinkPHP + Discuz 整合方法以下是Discuz6的整合方法,discuz5请按照里面的说明进行相应的修改,也可以使用了. 1.在项目的action目录下信件PublicAction.c ...

  4. thinkphp中field方法

    hinkPHP的CURD操作中有很多非常实用的方法,从这篇开始,我们会为大家一一介绍. 首先为大家介绍下field方法的用法.field属于模型的连贯操作方法之一,主要目的是标识要返回或者操作的字段, ...

  5. thinkphp中limit方法

    limit方法也是模型类的连贯操作方法之一,主要用于指定查询和操作的数量,特别在分页查询的时候使用较多.ThinkPHP的limit方法可以兼容所有的数据库驱动类的. 用法 限制结果数量 例如获取满足 ...

  6. ThinkPHP中U方法与url的四种访问模式

     ThinkPHP中U方法的用处主要是完成对url地址的组装,在模板中使用U方法而不是固定写死URL地址的好处在于,一旦你的环境变化或者参数设置改变,你不需要更改模板中的任何代码.在模板中的调用格式需 ...

  7. 仿写thinkphp的I方法

    自己定义一个方法仿写thinkphp的I 方法 <?php function I($key="",$default='',$function="") { ...

  8. ThinkPHP项目 公共方法存放位置

    ThinkPHP项目公共方法写在   根目录-> app-> common 里面 ThinkPHP模板公共方法卸载   根目录->app->模块名称->common  里 ...

  9. thinkPHP中session()方法用法详解

    本文实例讲述了thinkPHP中session()方法用法.分享给大家供大家参考,具体如下: 系统提供了Session管理和操作的完善支持,全部操作可以通过一个内置的session函数完成. 用法 ? ...

  10. thinkphp中I方法

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

随机推荐

  1. [C#] 类型学习笔记一:CLR中的类型,装箱和拆箱

    在学习.NET的时候,因为一些疑问,让我打算把.NET的类型篇做一个总结.总结以三篇博文的形式呈现. 这篇博文,作为三篇博文的第一篇,主要探讨了.NET Framework中的基本类型,以及这些类型一 ...

  2. CF911E Stack Sorting

    洛谷题目链接:CF911E Stack Sorting Codeforces题目链接:Stack Sorting 题意翻译 给你一排列的一部分,让你补全整个排列使其字典序最大并且经过一个栈调整顺序之后 ...

  3. HihoCoder 重复旋律

    あの旋律を何度も繰り返しでも.あの日見た光景を再現できない 无论将那段旋律重复多少次,也无法重现那一日我们看到的景象 もし切ないならば.時をまきもどしてみるかい? 若是感到惆怅的话,要试着让时光倒流吗 ...

  4. Spring理论基础-面向切面编程

    AOP是Aspect-Oriented Programming的缩写,中文翻译是面向切面编程.作为Spring的特征之一,是要好好学习的. 首先面向切面编程这个名称很容易让人想起面向对象编程(OOP) ...

  5. 【Zigbee技术入门教程-02】一图读懂ZStack协议栈的核心思想与工作机理

    [Zigbee技术入门教程-02]一图读懂ZStack协议栈的核心思想与工作机理 广东职业技术学院  欧浩源   Z-Stack协议栈是一个基于任务轮询方式的操作系统,其任务调度和资源分配由操作系统抽 ...

  6. css优先级机制

    所谓CSS优先级,即是指CSS样式在浏览器中被解析的先后顺序.   1.important >(内联样式)Inline style  >(内部样式)Internal style sheet ...

  7. js中的true和false

    1.false undefined.NaN.0.null和空字符串''均被视为false 2.true 除上述以外的其它情况一律被视作true

  8. python之提速千倍爆破一句话

    看了一下冰河大佬写的文章特别有感:https://bbs.ichunqiu.com/thread-16952-1-1.html 简单描述一下: 利用传统的单数据提交模式. 比如下面这个一句话木马: & ...

  9. ShellCode的几种调用方法

    ShellCode是一种漏洞代码,中文名也叫填充数据,一般是用C语言或者汇编编写.在研究的过程中,自己也学到了一些东西,发现其中也有许多坑,所以贴出来,如果大家有碰到的,可以参考一下. 以启动电脑上的 ...

  10. Python学习笔记 - day10 - 正则表达式

    正则表达式 字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在.比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和域名,但这样 ...