imcys.com
遵从中二的召唤,来吧少年!

PHP在MySql查表踩坑记录

问题

我正在对数据库进行一个查表,但是对查询结果循环输出时,却出现了两个表里的内容,并且我认为查表的代码没问题,它的确只查一个表,这就非常离谱。

查询代码
输出结果

思考原因

  1. 查表命令写错了(MySql可视化管理工具执行命令后发现是正常的)
  2. 有其他代码混入,导致中间出了问题。(仔细阅读后并没有)
  3. 表里存在2个数据(查表后只有一个,并且问题是来自两个表)
  4. 变量名冲突,导致查表异常(找了很久才发现问题)

问题原因

在我仔细查看变量后我发现了下面的奇葩问题。

<?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看到项目

萌新杰少

文章作者

I im CYS,一个热爱二次元的高中生开发者

发表评论

textsms
account_circle
email

萌新杰少の秘密基地

PHP在MySql查表踩坑记录
问题 我正在对数据库进行一个查表,但是对查询结果循环输出时,却出现了两个表里的内容,并且我认为查表的代码没问题,它的确只查一个表,这就非常离谱。 查询代码 输出结果 …
扫描二维码继续阅读
2021-09-20