问题
我正在对数据库进行一个查表,但是对查询结果循环输出时,却出现了两个表里的内容,并且我认为查表的代码没问题,它的确只查一个表,这就非常离谱。
思考原因
- 查表命令写错了(MySql可视化管理工具执行命令后发现是正常的)
- 有其他代码混入,导致中间出了问题。(仔细阅读后并没有)
- 表里存在2个数据(查表后只有一个,并且问题是来自两个表)
- 变量名冲突,导致查表异常(找了很久才发现问题)
问题原因
在我仔细查看变量后我发现了下面的奇葩问题。
<?php
$sql = "SELECT * FROM `xxxx`.`xxxxx` WHERE `Email` LIKE '$Email'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
if ($row['Verification'] == $_POST['verification']) {
$sql = "SELECT * FROM `misaka_api`.`app_bilibilias_user` WHERE `Email` LIKE '$Email'";
$result = $conn->query($sql);
if ($resul->num_rows > 0) {
//邮箱重复
//改变用户的密码
$sql = "update `xxxx`.`xxxx` set `PassWord`='$PassWord' where `Email` LIKE '$Email'";
if ($conn->query($sql) === TRUE) {
$array = [
'code' => 0,
'msg' => "更改成功,快去登录吧"
];
echo json_encode($array, JSON_UNESCAPED_UNICODE);
} else {
echo Url500();
}
} else {
echo Url403("该邮箱未被注册");
}
} else {
echo Url403("邮箱验证码错误啦");
}
}
} else {
echo Url403("请先完成邮箱验证");
}
首先在第一个判断后就是 while 循环,循环里判断了 Verification ,一个来自用户,另一个来自数据库
一样的时候则向下进行,也就是输出 更改成功,快去登录吧 ,反之则 该邮箱未被注册
从这里看出,的确是更改成功了,但是下面它又执行了一次代码,这次则没有修改密码,而是因为压根没有 Verification ,导致输出了这个查询结果。
很离谱,即使是他们来自同一个语句,也不可能分开输出结果,第一个结果是来自判断正确,而第二次则是来自判断错误,我表里只有一个数据,不可能会这样。
后来我发现 while ($row = $result->fetch_assoc()) 里面有 $result 我仔细一看代码,我 while 循环下面也有数据库执行的代码,并且,正好是第二次错误输出的结果的表,那么我认为可能是下面的代码有问题。
仔细查看,发现里面也有用 $sql 和 $result 这导致覆盖了 while 循环前的查询命令
解决
当我尝试改变 while 循环里的变量名称,果不其然,这个问题被解决了
图片来源
最后送大家几个好看的图片,来自loibus的森萝财团,我之前爬虫爬的,可以在GitHub看到项目
发表回复