请告诉这个MySQL查询中的错误

时间:2019-06-21 16:52:07

标签: php mysql sql database

我写了一个mysql查询,但是没有得到预期的结果。 这是为了检查用户名和电子邮件是否不同于其他人的用户名或电子邮件,而不是他自己的用户和电子邮件。

我尝试了其他许多查询,例如EXCEPT查询

$user_check_query = "SELECT * FROM users WHERE username='$username' 
OR email='$email' AND NOT id='$id'";
        $result = mysqli_query($db, $user_check_query);
        $user = mysqli_fetch_assoc($result);

        if ($user) { // if user exists
            if ($user['username'] === $username) {
            array_push($errors, "Username already exists");
            }

            if ($user['email'] === $email) {
            array_push($errors, "Email already exists");
            }
        }

该查询应该选择其中用户名=用户名或密码=密码但ID不= ID的行 但是,如果用户名或电子邮件没有更改,它将返回错误,表明用户名已经退出并且电子邮件已经存在,但不应该存在。

1 个答案:

答案 0 :(得分:3)

警告::您对SQL Injections持开放态度,应该真正使用参数化的准备好的语句,而不是手动构建查询。它们由PDOMySQLi提供。永远不要相信任何形式的输入,尤其是来自客户端的输入。即使您的查询仅由受信任的用户执行,you are still in risk of corrupting your data

要回答您的问题,请在WHERE子句中混合AND和OR。这与WHERE子句的解析顺序/优先顺序有关。如果没有括号,则WHERE子句在看到OR时将被“重置”。例如,您的查询将被解释为“其中用户名等于用户名,或者,当不再考虑用户名时,电子邮件等于电子邮件且ID也不是ID。”

当放在括号中时,可以通过将username = username或email = email分组在一起来更改其解释,然后还要检查id。

您可能想要:

SELECT * FROM users WHERE (username='$username' 
OR email='$email') AND NOT id='$id'