thinkphp框架,如何查询出NULL的mysql数据?
发布于 作者:苏南大叔 来源:程序如此灵动~大家已经知道了如何在mysql
中查询NULL
的数据,那么在国内最流行的thinkphp
中,又是如何写对应语句的呢?毕竟从thinkphp
到mysql
,中间还有一层转化。本文主要从代码层面进行刨析。
本文测试环境:php72
/thinkphp@5.0.24
。
数据表及结构
本文中的数据表及数据,和上一篇文章保持一致:
DROP TABLE IF EXISTS `test_table`;
CREATE TABLE `test_table` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`comment` varchar(255) DEFAULT NULL,
PRIMARY KEY (`Id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;
INSERT INTO `test_table` VALUES (1,'NULL','NULL string'),(2,NULL,'real NULL'),(3,'','just blank');
thinkphp
准备工作
下载好最新版的thinkphp
,然后配置好数据库链接,同时开启调试开关。
thinkphp@5.0.24完整版
下载地址:
application/database.php
,配置数据库信息,一般来说,就是修改database
和password
信息:
application/database.php
,开启app_debug
和app_trace
:
return [
// 应用调试模式
'app_debug' => true,
// 应用Trace
'app_trace' => true,
//...
}
相关文章:
开启app_trace
的作用是非常明显的,可以在页面下方的thinkphp
调试工具中,查看最终执行的sql
语句,这对于本文的目的来说,非常重要。
基础类引用
因为要使用Db
类操作数据库,所以这里要提前use
一下。
application/index/controller/Index.php
:
use think\Db;
正确答案
正确答案的sql
,执行的都是下面这条sql
。这是判断答案的标准:
SELECT * FROM `test_table` WHERE `name` IS NULL
本文可能的解决方案很多,首先提出几个正确答案:
Db::table('test_table')->where('name','null')->select();
Db::table('test_table')->where('name',null)->select();
Db::table('test_table')->where('name is null')->select();
Db::table('test_table')->where('name','exp','is null')->select();
Db::table('test_table')->where(["name"=>null])->select();
Db::table('test_table')->where(["name"=>`null`])->select();
Db::table('test_table')->where(["name"=>`is null`])->select();
以及这个:
$p["name"]=['exp',new DB\Expression('IS NULL')];
Db::table('test_table')->where($p)->select();
关于not null
的情况,苏南大叔也写出来一个。其他的方案,大家自己推算验证吧~ 这个实践出真知。
Db::table('test_table')->where('name','not null')->select();
错误答案
错误答案也很多,有些错误答案历史上曾经是正确答案,但是随着thinkphp
的发展,变成了错误的。
错误答案一
$params = [];
$params["name"] = "is null";
$row = Db::table('test_table')->where($params)->select();
这个执行的SQL
是:
SELECT * FROM `test_table` WHERE `name` = 'is null'
错误答案二
$params=[];
$params["name"]=[`eq`,`null`];
$row2=Db::table('test_table')->where($params)->select();
这个直接报错查询表达式错误
...
值得说明的是,把上面的小写null
改成大写的NULL
,居然被识别成了NULL
字符串...
$params = [];
$params["name"] = ['eq', 'NULL'];
$row3 = Db::table('test_table')->where($params)->select();
执行的sql
是:
SELECT * FROM `test_table` WHERE `name` = 'NULL'
错误答案三
$params = [];
$params["name"]=["EXP","IS NULL"];
//$params["name"]=["EXP","NULL"];
$row3 = Db::table('test_table')->where($params)->select();
exp
这种方式,是thinkphp
官方社区特别推荐的。但是,所列出的方式,在最新版的thinkphp@5.0.24
中,却直接报错:
查询表达式错误:EXP
目前,官方并没有给出相关解释。讲过阅读代码和尝试:苏南大叔给出的exp
,解决方案如下:
$p=[];
$p["name"]=['exp',new DB\Expression('IS NULL')];
$row9 = Db::table('test_table')->where($p)->select();
从结果上看,这个exp
版本的正确答案,确实蛮out
的,不用也罢。
相关链接
thinkphp5
官方文档里面的相关描述文字,如下:
总结
本文中,苏南大叔给出了thinkphp
下,查找出NULL
数据的N
种方案。当然,随着thinkphp
的不断发展,文章中的一些写法可能会失效,一些错误的写法也可能会变成正确的,也可能会出现新的thinkphp
写法,这些都是不断发展的事情。
更多thinkphp
的经验文章,请点击苏南大叔的博客资源:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。