有很多非常相似,实际上几乎相同的问题,我在发布之前通读了所有这些问题,以查看其中的解决方案是否适用于我的案例,但遗憾的是到目前为止还没有。
我使用 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');
}
?>
答案 0 :(得分:1)
修改 SQL 查询以包含 AND approved='No'
是解决方案。感谢 brombeer 提出这个建议。