PHP 中一个 False 引发的问题,差点让公司损失一百万
PHP 中一个 False 引发的问题,差点让公司损失一百万
一、场景描述
上周我一个在金融公司的同学,他在线上写一个 Bug
,差点造成公司损失百万。幸好他及时发现了这个问题并修复了。这是一个由 PHP 中的 empty 引发的问题。他使用 empty
函数判断值为 False
的参数。按照他的正常逻辑理解,下面这段代码会输出 Yes
。但是,结果却是相反的。
$arr['is_default'] = false;
if (!empty($arr['is_default'])) {
echo "Yes";
}
虽然,这个 Bug
引发的问题,得到了及时解决。但是,如果发布到生产环境了,可能会造成比较大的损失。因此,这也体现了我们在编程当中,要注意很多的细节,以免发布到生产环境之后造成不可挽回的损失。
二、列举 PHP 中 empty 函数会返回 False 的情况
1、' '
空字符串
$arr['is_default'] = "";
if (empty($arr['is_default'])) {
echo "Yes";
} else {
echo "No";
}
2、0
整数零
$arr['is_default'] = 0;
if (empty($arr['is_default'])) {
echo "Yes";
} else {
echo "No";
}
// 输出
Yes
3、0.0
浮点数零
$arr['is_default'] = 0.0;
if (empty($arr['is_default'])) {
echo "Yes";
} else {
echo "No";
}
// 输出
Yes
4、"0"
字符串零
arr['is_default'] = "0";
if (empty($arr['is_default'])) {
echo "Yes";
} else {
echo "No";
}
// 输出
Yes
5、null
$arr['is_default'] = null;
if (empty($arr['is_default'])) {
echo "Yes";
} else {
echo "No";
}
// 输出
Yes
6、false
$arr['is_default'] = false;
if (empty($arr['is_default'])) {
echo "Yes";
} else {
echo "No";
}
// 输出
Yes
7、array()
空数组
$arr['is_default'] = [];
if (empty($arr['is_default'])) {
echo "Yes";
} else {
echo "No";
}
// 输出
Yes
8、$var
一个声明并未赋值的变量
$var;
$arr['is_default'] = $var;
if (empty($arr['is_default'])) {
echo "Yes";
} else {
echo "No";
}
// 输出
Yes
三、思考
PHP 作为一门弱类型语言,可能我们在编写代码时,会比较随性。但是随性带来的风险可能会很高,所以我们在编程的时候,还是应该要注意到很多语言的细节。
PHP 中一个 False 引发的问题,差点让公司损失一百万的更多相关文章
- 一个致命的 Redis 命令,导致公司损失 400 万!!
最近安全事故濒发啊,前几天发生了<顺丰高级运维工程师的删库事件>,今天又看到了 PHP 工程师在线执行了 Redis 危险命令导致某公司损失 400 万.. 什么样的 Redis 命令会有 ...
- linux 内核中一个全局变量引发的性能问题
为了调试一个功能,在一个内核模块中,增加了一个全局变量,用来统计自有skb池的申请情况. 因为是临时增加,所以没有考虑性能,一开始只是一个fail的统计,数量不多,也不太考虑是否有计数丢失的情况,毕竟 ...
- Python 中一个逗号引发的悲剧
遇到一个 Python 字符串的坑,记录一下.看看下面这些代码 >>> a = [ ... 'foo' ... 'bar', ... 'tree' ... ] >>> ...
- 一个致命的 Redis 命令,导致公司损失 400 万
什么样的 Redis 命令会有如此威力,造成如此大的损失? 具体消息如下: 看完这个消息后,我心又一惊,为什么这么低级的问题还在犯?为什么线上的危险命令没有被禁用?这事件报道出来真是觉得很低级... ...
- 一个字母引发的血案 java.io.File中mkdir()和mkdirs()
一个字母引发的血案 明天开始放年假了,临放假前有个爬虫的任务,其中需要把网络图片保存到本地,很简单,马上写完了代码: //省略部分代码... Long fileId= (Long) data.get( ...
- Spring之LoadTimeWeaver——一个需求引发的思考---转
原文地址:http://www.myexception.cn/software-architecture-design/602651.html Spring之LoadTimeWeaver——一个需求引 ...
- 在项目中随手把haseMap改成了currenHaseMap差点被公司给开除了。
前言 在项目中随手把haseMap改成了currenHaseMap差点被公司给开除了. 判断相等 字符串判断相等 String str1 = null; String str2 = "jav ...
- Replication的犄角旮旯(六)-- 一个DDL引发的血案(上)(如何近似估算DDL操作进度)
<Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...
- Replication的犄角旮旯(七)-- 一个DDL引发的血案(下)(聊聊logreader的延迟)
<Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...
随机推荐
- C# for循环测试
- JavaScript的几种循环使用方式及性能解析
循环的类型 一:for var arr = [1, 2, 3, 4, 5, 6]; for (var i = 0, len = arr.length; i < len; i++) { conso ...
- java中的浅拷贝和深拷贝
复制 将一个对象的引用复制给另一个对象,一共有三种方式.第一种方式是直接赋值,第二种方式是浅复制,第三种方式是深复制. 1.直接赋值 在Java中,A a1 = a2,这实际上复制的是引用,也就是说 ...
- 【canvas学习笔记七】混合和裁剪
globalCompositeOperation 如果我们先画了一个图形,然后要在这个图形上面再画一个图形,那么这个图形会怎么样呢?是覆盖在原来的图形上面吗?这时候,就要用到globalComposi ...
- Overview over available Turtle and Screen methods
24.5.2.1. Turtle methods Turtle motion Move and draw forward() | fd() backward() | bk() | back() rig ...
- Java连接Oracle数据库常用方法
JDBC的六大步骤: 注册驱动 获取连接 获取执行sql语句对象 执行sql语句 处理结果集 关闭资源 oracle URL: jdbc:oracle:thin:@localhost:1521:SID ...
- sqli-labs(22)
接下里我们进入第二二关 好像和第21关一样 cookie的base64加密注入 闭合变成了双引号而已 0X01 构造语句进行尝试 " union select 1,2,3# IiB1bmlv ...
- Mybatis 中在xxx.mapper书写模糊查询
1.在mybatis中,书写sql,有时候会有一些不细心,如: <!-- 首页商品 关键字搜索--> <select id="getGoodsByLikeTitle&quo ...
- [LeetCode]-DataBase-Rising Temperature
Given a Weather table, write a SQL query to find all dates' Ids with higher temperature compared to ...
- fedora从22开始就用dnf代替yum了
yum有一些不好的缺点, 从fc22开始, 就用 dnf代替yum了 dnf: "毒奶粉" yum: "黄狗" dnf的用法根yum的用法完全一样, 只是用dn ...