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

PHP IF语句中的SQL语句即使条件为false也会执行,php,sql,Php,Sql,这篇文章有很多非常相似、几乎相同的问题,我在发布之前已经通读了所有这些问题,看看其中的解决方案是否适用于我的案例,但遗憾的是,到目前为止还没有 我使用PHP5.6和MariaDB作为SQL数据库 作为电子邮件验证过程的一部分,用户单击包含其电子邮件地址和验证代码的链接,如果在DB中匹配,则将“批准”字段设置为“是”。非常简单。URL已格式化 PHP$_GET的这些字段查询DB是否匹配,如果找到,将“approved”字段设置为“Yes”,显示一条消息,然后重定向,如果没有,则显示一条消息,然后重

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

我使用PHP5.6和MariaDB作为SQL数据库

作为电子邮件验证过程的一部分,用户单击包含其电子邮件地址和验证代码的链接,如果在DB中匹配,则将“批准”字段设置为“是”。非常简单。URL已格式化

PHP$_GET的这些字段查询DB是否匹配,如果找到,将“approved”字段设置为“Yes”,显示一条消息,然后重定向,如果没有,则显示一条消息,然后重定向。如果没有数据传入,也会有一个重定向,这样就不会有人意外地卡在这个页面上

问题是,即使条件为false并且触发了else,也会执行SQL更新。正如您将在我在错误检查和流检查中留下的代码中看到的,在重定向之前,print\r和echo语句以及exit(),这样我就可以读取输出,并且它看起来是正确的。然而,即使不应该运行,该死的更新也会运行

<?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');
}

?>

修改SQL查询以包含
和approved='No'
就是解决方案。感谢您的建议。

您所说的没有意义-PHP不能同时执行相同条件的
if
else
分支。您是否确定您正在测试数据库中approved设置为
No
的值?
Not approved'被回送,但DB仍然显示approved=Yes
…然后在运行代码之前它已经有了该值(可能是以前测试的遗留值),或者其他东西正在修改它。代码不能同时运行if和else块。你错过了什么。仔细检查你所有的假设。重置所有数据。将代码剥离到最低限度,然后重新构建,直到出现问题。这极易受到SQL注入攻击。请了解参数化查询。有关使用phpy安全编写查询的说明和一些示例,请参阅。您可能希望将
和approved='No'
添加到
$verify
查询中。为什么首先使用两个单独的查询?使用适当的WHERE子句进行一次更新查询,然后根据该更新是否影响零个或多个记录得出适当的结论。