今天在正常工作中发现这样一个bug,登录的时候输入账号和密码,如果先输入账号,后输入密码,就能登录成功,先输入密码,后输入账号,就不能成功。所以作者想究其因,查查究竟为什么。
首先我们锁定到查询数据库的时候,打印一下
此时,如果先输入账号就能查出数据,先输入密码则不能,这个问题就神奇了。
所以我们打印一下查询条件,发现
$email是一个数组
打印发现,数组除了key的顺序不同外,数据都是一样的(仔细比对后发现)
然而此时作者突然灵光一现,发现查询语句有问题,因为模型查询语言where
可以是where("id",1) 或者 where(Array),却从没见过where("email",Array)的写法
所以我们锁定问题可能就在此处,到了这个时候,解决问题已经是很容易的事情了,
但是作者是一个不太安于解决问题的人,所以我们现在要查一下为什么这种where写法
仍然可以查出数据,但是换个顺序却不能查出来。
接下来我们把目光投向了模型文件
从模型文件能看出,email在password前面,所以在此作者提出了一个推论
是不是存在这种可能:
1.在查询的时候模型文件自动检索数组数据,把第一个值当成了where(“email”,Array)
中email的值,而把第二个参数按照key=>value去查询
2.想起我们产生bug的原因,不正是先输入email,再输入密码就可登陆成功
希望hyperf大佬们给解释下底层怎么实现的这个功能!