即使条件为假,也会执行 PHP IF 语句中的 SQL 语句

时间:2021-04-12 09:04:45

标签: php sql

有很多非常相似,实际上几乎相同的问题,我在发布之前通读了所有这些问题,以查看其中的解决方案是否适用于我的案例,但遗憾的是到目前为止还没有。

我使用 PHP 5.6 和 MariaDB 作为 SQL DB。

作为电子邮件验证过程的一部分,用户单击包含其电子邮件地址和验证码的链接,如果在数据库中匹配,则会将“已批准”字段设置为“是”。很直接。 URL 的格式为 https://www.myserver.com/verify.php?user=email@address.com&auth=ri5934ij4jjo49

PHP $_GET 的这些字段,查询数据库以查找匹配项,如果找到,则将“已批准”字段设置为“是”,显示一条消息,然后重定向,如果没有,则显示一条消息然后重定向。如果没有数据传入,还有一个重定向,这样就不会有人不小心卡在这个页面上。

问题是,即使条件为假并且 else 被触发,SQL UPDATE 也会执行。正如您将在代码中看到的那样,我在重定向之前保留在错误检查和流程检查中 print_r 和 echo 语句以及 exit() 中,以便我可以读取输出并且它似乎正在正确流动。然而,即使不应该运行该死的 UPDATE 也会运行。

<?php

ini_set('display_errors', '1');
error_reporting(E_ALL);

if(isset($_GET['auth']) && isset($_GET['user'])){
    $auth=$_GET['auth'];
    $user=$_GET['user'];
    echo($auth.'<br />'.$user.'<br />');
    $connect = mysqli_connect("server", "username", "password", "db") or die(mysqli_error($connect));
    $verify = mysqli_query($connect, "SELECT * FROM users WHERE email='$user' AND verification_code='$auth'") or die(mysqli_error($connect));
    $verify2 = mysqli_fetch_array($verify);
    print_r($verify2);echo('<br />');
    if(mysqli_num_rows($verify)==1){
        mysqli_query($connect, "UPDATE users SET approved='Yes', verification_code='' WHERE email='$user' AND verification_code='$auth'") or die(mysqli_error($connect));
        echo('Approved');exit();
        echo('<script type="text/javascript">alert("Your registration has been approved, please log-in");window.location.href = "log-in.php";</script>');
    } else {
        echo('Not approved');exit();
        echo('<script type="text/javascript">alert("There was a problem verifying your email, please try again, re-register or contact us for help");window.location.href = "log-in.php";</script>');
    }
} else {
    header('Location: log-in.php');
}

?>

1 个答案:

答案 0 :(得分:1)

修改 SQL 查询以包含 AND approved='No' 是解决方案。感谢 brombeer 提出这个建议。