Пожалуйста, сообщите об ошибке в этом запросе MySQL - PullRequest
0 голосов
/ 21 июня 2019

Я написал запрос MySQL, но я не получаю ожидаемый результат.Это делается для проверки того, что если имя пользователя и адрес электронной почты не совпадают с именем пользователя или адресом электронной почты другого лица, но не его собственным пользователем и адресом электронной почты.

Я пробовал многие другие запросы, например, EXCEPT query

$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. Но если имя пользователя или адрес электронной почты не изменились, возвращается ошибка, что имя пользователя уже существует, а адрес электронной почты уже существует, но не должен.

1 Ответ

3 голосов
/ 21 июня 2019

Предупреждение: Вы широко открыты для SQL-инъекций и должны действительно использовать параметризованные подготовленные операторы вместо того, чтобы строить запросы вручную. Они предоставляются PDO или MySQLi . Никогда не доверяйте никаким данным, особенно тем, которые поступают со стороны клиента. Даже если ваши запросы выполняются только доверенными пользователями, вы все равно рискуете испортить ваши данные .

Чтобы ответить на ваш вопрос, вы смешиваете И и ИЛИ в своем предложении WHERE. Это соответствует порядку / приоритету того, как будет проанализировано предложение WHERE. Без скобок предложение WHERE будет «сброшено», когда оно увидит ИЛИ. Например, ваш запрос будет интерпретироваться как «где имя пользователя равно имени пользователя, или, если имя пользователя больше не учитывается, электронная почта равна электронной почте, а также идентификатор не является идентификатором».

Когда вы ставите круглые скобки, вы меняете способ их интерпретации, группируя имя пользователя = имя пользователя ИЛИ адрес электронной почты = адрес электронной почты вместе, а после этого также проверяйте идентификатор.

Вы, вероятно, хотите:

SELECT * FROM users WHERE (username='$username' 
OR email='$email') AND NOT id='$id'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...