首页 理论教育PHPMVC开发实战:使用查询语言进行统计查询

PHPMVC开发实战:使用查询语言进行统计查询

【摘要】:5.统计查询如果严格来区分,统计查询并不算查询语言的讲述范畴,因为在ThinkPHP中要进行字段数值统计并不需要额外定义数组元素,只需要更改显示方式即可。

前面已经介绍过在连贯操作中的whrere方法,该方法为查询限制条件,接受的参数为SQL查询条件部分(即where部分语句),在赋参时一般使用字符串作为查询条件,如where(“add_user=’ceiba’”)。事实上这种方式是不建议使用的,因为这会导致查询溢出(SQL注入、查询边界超出等)造成安全隐患。所以系统提供了多套查询方式,其中最常用的为数组查询方式,使用数组代替字符串,系统会对所有数据进行过滤,确保数据最终的安全。数组查询方式能够实现大部分字符串所能够实现的查询类型,包括常见的普通查询、区间查询、组合查询、统计查询等。使用数组进行查询操作,就需要使用查询表达式,否则传统的字符串表达式将不能正确解释,下面首先理解查询表达式。

1.查询表达式

SQL语言是一种比较类似人类自然用语的结构化查询语言,它使用的表达式与传统的数学表达式非常类似。常见的等号(=)、不等号(<>)、大于(>)、小于(<)等表达式都通俗易懂,一般的开发人员几乎不必牢记,也能运用娴熟。这是SQL语言的一大特性,但是这些表达式的赋值是有讲究的,如果处理不当就会造成严重的安全隐患,早些年非常普遍的SQL注入百分之九十都出于这些表达式的运用不当。面对这些问题,在C#、Java等主流语言中使用预处理机制能够帮助提高查询的安全性,但PHP是一种脚本语言,必须依靠开发人员使用过滤函数进行处理,如果每个赋值都手动过滤,这无疑是效率低下的。

在MVC开发的年代,这一切早已发生了改变,无论是Zend Framework的PDO方式、还是Symfony的Yml表达式都能够很好地解决直接使用字符串带来的安全问题,并能有效提高开发效率。ThinkPHP作为一款流行的MVC框架,同样也提供了多种方式,常用的有数组表达式如表7-2所示。

表7-2 数组查询支持的表达式

978-7-111-42852-7-Part02-217.jpg

定义好表达式后,就可以直接作为参数传递给where连贯操作了,如以下代码所示。

978-7-111-42852-7-Part02-218.jpg

如上述代码所示,where传入的参数不再是前面的字符串,而是一个多维数组,这些数组元素最后被转换成标准的SQL语句,如以下代码所示。

978-7-111-42852-7-Part02-219.jpg

读者可以使用echo$articleObj->getLastSql();得到转换后的SQL语句。上述代码中共有两个查询条件:add_user和content。它们之间的关系为AND(默认情况),即两个条件都必须成立。如果需要更改查询关系为OR,可以使用$data['_logic']='OR'数组元素值进行更改。

从上述代码中可以看出,查询表达式可以完美地代替传统的字符串查询表达式,并带来了非常好的效果,不会降低开发效率,建议读者采用这种方式。另外查询表达式是不区分大小写的。

2.普通查询

所谓的普通查询是相对功能而言的,事实上所有查询语言都是以普通查询为基础的,在实际应用开发中读者没必要区分查询分类,因为无论哪种查询都是连贯操作的结果,不同的只是where方法中的参数。前面所介绍过的查询语句都可归为普通查询。通常情况下,普通查询都会返回数据集,例如使用select或find等方法。由于普通查询在前面的内容中已经多次出现,这里就不再重述。

3.区间查询

区间查询就是需要查询的结果限制于两个或两个以上的查询条件。例如需要查询id>10并且id<30之间的数据,这就限制了结果为id字段11~29之间的数据,如果使用传统的SQL语句编写,代码如下所示。

978-7-111-42852-7-Part02-220.jpg(www.chuimin.cn)

如果使用查询表达式,那么可以使用多个数组进行表达。此时的id数组元素值就会变为一个多维数组,如以下代码所示。

978-7-111-42852-7-Part02-221.jpg

978-7-111-42852-7-Part02-222.jpg

如上述代码所示,数组id元素的值使用了一个多维数组,多维数组中每个数组元素代表一个查询条件,最后一个数组元素为查询关系,可选的值有and或者or,如果为空则使用and默认值。

4.组合查询

组合查询可以对复杂的多个查询条件进行封装,并且能够在数组元素中直接使用字符串,最终的结果由所有元素值决定。比如需要查询id>5或者title包含有“苹果”词汇的数据,最后还限制新闻来源地区为“guangdong”,那么使用组合查询代码就变得简洁,如以下代码所示。

978-7-111-42852-7-Part02-223.jpg

如上述代码所示,使用_complex数组元素对2个查询条件进行拼接,如果有更多的条件需要拼接,依此类推即可。最终的SQL代码如下所示。

978-7-111-42852-7-Part02-224.jpg

5.统计查询

如果严格来区分,统计查询并不算查询语言的讲述范畴,因为在ThinkPHP中要进行字段数值统计并不需要额外定义数组元素,只需要更改显示方式即可。例如普通查询使用select进行数据显示,而统计查询根据统计需求有各自的显示方法。当然统计查询是可以结合前面的各种查询方式进行使用的,系统支持的统计查询如表7-3所示。

表7-3统计查询显示方法

978-7-111-42852-7-Part02-225.jpg

统计查询的使用和前面介绍的连贯操作类似,只需要更改最后一个显示方法即可,如以下代码所示。

978-7-111-42852-7-Part02-226.jpg