大家已经知道了如何在mysql中查询NULL的数据,那么在国内最流行的thinkphp中,又是如何写对应语句的呢?毕竟从thinkphpmysql,中间还有一层转化。本文主要从代码层面进行刨析。

苏南大叔:thinkphp框架,如何查询出NULL的mysql数据? - thinkphp-null
thinkphp框架,如何查询出NULL的mysql数据?(图7-1)

本文测试环境: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框架,如何查询出NULL的mysql数据? - thinkphp-null-mysql
thinkphp框架,如何查询出NULL的mysql数据?(图7-2)

thinkphp准备工作

下载好最新版的thinkphp,然后配置好数据库链接,同时开启调试开关。

thinkphp@5.0.24完整版下载地址:

application/database.php,配置数据库信息,一般来说,就是修改databasepassword信息:

苏南大叔:thinkphp框架,如何查询出NULL的mysql数据? - thinkphp-null-database
thinkphp框架,如何查询出NULL的mysql数据?(图7-3)

application/database.php,开启app_debugapp_trace

苏南大叔:thinkphp框架,如何查询出NULL的mysql数据? - thinkphp-null-debug
thinkphp框架,如何查询出NULL的mysql数据?(图7-4)

return [
    // 应用调试模式
    'app_debug'              => true,
    // 应用Trace
    'app_trace'              => true,
    //...
}

相关文章:

开启app_trace的作用是非常明显的,可以在页面下方的thinkphp调试工具中,查看最终执行的sql语句,这对于本文的目的来说,非常重要。

苏南大叔:thinkphp框架,如何查询出NULL的mysql数据? - thinkphp-tracebar
thinkphp框架,如何查询出NULL的mysql数据?(图7-5)

基础类引用

因为要使用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();

这个直接报错查询表达式错误...

苏南大叔:thinkphp框架,如何查询出NULL的mysql数据? - error_find_null
thinkphp框架,如何查询出NULL的mysql数据?(图7-6)

值得说明的是,把上面的小写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

苏南大叔:thinkphp框架,如何查询出NULL的mysql数据? - error_find_null2
thinkphp框架,如何查询出NULL的mysql数据?(图7-7)

目前,官方并没有给出相关解释。讲过阅读代码和尝试:苏南大叔给出的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的经验文章,请点击苏南大叔的博客资源:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留链接作者。
本站采用创作共用版权协议, 要求署名、非商业用途和相同方式共享。
转载本站内容必须也遵循“署名-非商业用途-相同方式共享”的创作共用协议。
未经许可,规模化镜像抄袭本站内容的行为,将会根据有关法律法规进行维权。
程序如此灵动~》下所有原创文章,如被用于商业用途,请您按规定支付稿费。

 【加群】加入QQ群【175454274】和大家一起讨论这个问题

 【源码】本文代码片段及相关软件,请点此获取

 【绝密】秘籍文章入口,仅传授于有缘之人   php    mysql

本站的忠实读者小伙伴,正在阅读下面这些文章: