应优先用 $var === null(变量确定存在时),否则用 is_null($var)(变量可能未定义);禁用 == null 和 empty() 判定数据库 null,因其会误判 0、'' 等合法值。

数据库查询结果为 NULL 时,is_null() 和 === null 怎么选
直接用 $row === null 最常见,但前提是 $row 确实已声明(比如 mysqli_fetch_assoc() 返回了 null 表示无记录)。如果变量本身未定义(如漏写赋值),$undefined === null 会触发 Notice: Undefined variable。
is_null($row) 对未定义变量也安全——它安静返回 false,不报错。这在动态处理 $_GET 参数或对象属性时很实用。
- 确定变量一定存在(如函数明确返回值),优先用
$var === null:快、直观、无函数调用开销 - 不确定变量是否已声明(如
$data['user']可能根本没这个键),用is_null($data['user'])更稳妥 - 别用
== null:它把0、''、false全当true,逻辑错得离谱
empty() 为什么不能代替 is_null() 判断数据库 NULL
empty() 是“假值探测器”,不是 NULL 专用函数。它对 null、0、''、false、[]、'0' 都返回 true。而数据库里 0 和 '' 往往是合法值(比如用户状态码为 0,用户名为空字符串)。
典型翻车场景:if (empty($user_id)) 会把 ID 为 0 的用户当成“不存在”,直接跳过处理。
- 要判断“字段是否缺失/未设置”,用
!isset($var) - 要判断“是否为数据库意义上的 NULL”,必须用
is_null($var)或$var === null - 要同时排除
null和空字符串:is_null($var) || $var === ''
从 MySQL 查询结果中取值,NULL 和 'null' 字符串怎么区分
数据库字段值为 SQL NULL,PHP 中表现为真正的 null 类型;但如果字段类型是 VARCHAR,且存了字符串 'null'(四个字母),PHP 拿到的就是字符串 'null',is_null() 返回 false。
更隐蔽的是 JSON 字段:MySQL 的 col->>'key' 返回字符串,即使原始 JSON 是 {"key": null},它也会变成字符串 'null';要用 col->'key'(不带 >)配合 IS NULL 才能拿到真正的 SQL NULL。
- 查 JSON 字段的 key 是否为 NULL:
WHERE col->'key' IS NULL,不是col->>'key' = 'null' - 读取后判断:
is_null($row['json_col'])→ 错,应先用json_decode($row['json_col'], true)解析再判断 - 数值字段被存成字符串
'0'或' ',is_null()也识别不了,得靠filter_var($val, FILTER_VALIDATE_INT) !== false等校验
INSERT/UPDATE 时 PHP 如何把 null 正确传给数据库
PDO 默认把 PHP null 绑定为 SQL NULL,但必须显式调用 bindValue() 并指定类型,否则可能被转成空字符串或 0。
例如:$stmt->bindValue(':status', $status, PDO::PARAM_NULL) —— 这样才能确保 $status === null 时,SQL 写入的是 NULL,而不是 '' 或 0。
- 不要依赖自动绑定:PDO 默认对
null的处理行为在不同驱动下不一致 - 更新语句中想“只覆盖非 NULL 值”,别写
SET col = COALESCE(?, col),应构造动态 SQL,跳过该字段 - 用
??提供默认值时注意:$data['name'] ?? 'N/A'把null转成了字符串,不再可入库为 NULL
is_null(),而是每次取值前,你得清楚这个值来自哪里:是 mysqli_fetch_row() 的返回?是 $_POST 的原始输入?还是 JSON 解析后的嵌套数组?来源决定它可能是 null、'null'、0、'' 或未定义——漏掉这一层,函数写得再准也没用。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











