前言
小Q又带着问题来了,今天的问题估计是大多数同志都会犯的问题。
问题是在使用ThinkPHP时查询返回的结果判断是否为空。
是不是很自信,这有什么不知道的,不就是empty嘛!如果你是这样认为的,那还是把文章简单的看完哈!
这个问题的缘由就是对框架查询数据库返回的结果是什么类型不明确,知道了类型就是一个非常简单的问题。
一、问题重现
数据库很简单就一张表user,这个表中没有任何数据,就是一个空表。
然后使用ThinkPHP框架进行查询这个表的数据
小Q给你三秒钟思考,这里会返回什么值。要么返回暂无数据,要么返回用户表的数据。
小Q毫不思索的说肯定会返回暂无数据,因为user表根本就没有数据。
那么来看一下打印的结果是什么。
小Q睁大了眼睛看也没有看到暂无数据四个字,而是返回了一空数组(暂且这么认为)。
这里是暂时认为这就是一个空数组,其实只是长得像数组罢了,真的数据结构是结果集。至于什么是结果集,就自行百度哈!
这个时候小Q懵了啊!怎么会这样呢!在小Q强烈的要求下打印了date的数据
返回结果仍然还是一个空数组(暂且这样认为)
那么判断一个数组是否为空肯定得是empty()来进行判断的,对吧!
小Q自信十足的点了点头,这次肯定没有问题,这种写法我都写了好几年了,就是用empty来进行判断的。
为了让小Q看见骨灰盒在落泪,咔咔只能在对这个值进行一次是否为空的判断。
代码如下
小Q脸上洋溢着无比灿烂的笑容,我都不忍心去点击请求按钮。
无奈与小Q的期望,残忍的按下了请求按钮。
看到了上边的返回结果,小Q脸上的笑容顿时戛然而止,随之迎来的就是满脸质疑的大脸盘子。
再一次的检查了写的判断代码是否有问题。
老夫纵横沙场几十年,复制粘贴,拿起键盘就是干的实力怎么可能会把这个代码写错。
小Q终于坐不住了,笑嘻嘻的问,这是怎么回事啊!
终于要来到重点了,请继续看怎么让小Q明白这其中的道理的。
二、解决问题
此刻急需来检测一下返回的这data到底是不是我们坚持认为的数组,接下来检测一下。
于是拿起键盘敲了八下,那就是is_array这个函数。
再一次的发起请求
此时小Q的表情就是这样的,这下是真的凌乱了
于是我不慌不忙的打开官网的文档,给小Q看了一眼
官网明确的说明数据返回的结果就是数据集,而且在5.1的版本是直接默认的。
再继续往下看,你会看到额外的方法都有什么,第一个认识不,是否为空。
小Q惊呆的说了一句,卧槽,不会是用这种方式进行判断的吧!
是不是检测一下就可以了。
小Q终于一把鼻涕一把泪的说,我以为我眼睛出问题了呢!
明明是空数据怎么就判断不出来呢!长长的出了一口气。
小Q一脸迷茫的看了我一眼,说了一句,自从使用了5.1框架后,所有的判断都是这样写的。
小Q紧忙的着小跑了出去,只说了一句话,赶紧在线上没有出现问题前把代码修复好,要不我就下岗了。
解决了小Q 的问题, 接下来聊点其它的。
三、扩展
解决了小Q的问题就来聊点正经话题。
在上文中存在一个遗漏问题,那就是empty,在PHP中判断数组是否为空就是使用的empty。
这一点小Q是坚定不移的认为是这个样子的,那么这种用法在框架中还能用吗?
那肯定是没有问题的啊!看下图
返回结果肯定跟预想的是一样的,真理永远都是真理。
四、总结
送给小Q的总结,精华总是那么的简单。
虽然返回结果可以在数据库的配置文件进行修改,但是咔咔是不建议修改的。
既然框架已经默认为结果集,那就使用结果结果集,如果非要使用数组那也是可以的。
经过小Q的这个问题,需要注意以下几点问题。
使用find查询时,如果结果为空返回结果是null,那么判断可以使用!来进行判断
使用select查询时,如果结果为空,返回结果是一个空的结果集,可以使用结果集额外的函数toArray()进行转换为数组,然后使用empty进行判断。然而如果就使用结果集进行判断的话就是$data->isEmpty()提供的函数进行判断即可。