Select Exists всегда возвращает true в mysql - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь создать форму входа в систему, где я должен зарегистрировать пользователя до этого. Но этот код всегда говорит, что пользователь уже существует, даже если это не так. Что я делаю не так?

connection.query("select exists (select * from demoApp where username = '" + username + " ')", function (error, result) {
    if (error) {
        LOG.error(error);
        return;
    }
    else {
        LOG.info(result);
        if (result) {
            LOG.info("Username already exists!");
        }

        else {

            connection.query("INSERT INTO demoApp (username, password) VALUES( '" + username + "', '" + password + "')", function (error, result) {
                if (error) {
                    LOG.error(error);

                    return;
                }
                else {
                    LOG.info("Username added.");

                }
            });
        }
    }
});

};

Ответы [ 3 ]

1 голос
/ 15 октября 2019

То, что вы говорите в заголовке вопроса "MySQL всегда возвращает true ...", неверно;Вы позже скажете в комментариях, что MySQL возвращает 0 или 1

Ваш JavaScript имеет недостаток в логике. Вы говорите if(result), но результат - это гораздо больше, чем просто целое число 0 или 1, поэтому вы говорите, будет ли (результат) эффективно проверять, является ли он нулевым или нет, что никогда не бывает, следовательно, "всегда верно"

Ваш код должен выглядеть примерно так (я также исправил проблему, заключающуюся в том, что ваш старый код открыт для хакерских атак:

//alias the result column using AS xxx to make it easier to refer to in js
//ALWAYS use parameters (WHERE username = ?) to pass values from the user into the db
let sql = "select exists (select * from demoApp where username = ?) as userExists";
connection.query(sql, [username],
function (error, result) {
    if (error) {
        LOG.error(error);
        return;
    }
    else {
        LOG.info(result);
        if (result[0].userExists == 1) { //no harm in being explicit. Result is a collection of rows with names of columns, index it to get the first and specify the column (which is really hard to do with name of you don't alias your query result
            LOG.info("Username already exists!");
        }
...
0 голосов
/ 15 октября 2019

Попробуйте это> ВЫБРАТЬ * из demoApp, ГДЕ ЕСТЬ

0 голосов
/ 15 октября 2019

, кажется, ваш exists оператор возвращает результаты 0 and 1. проверьте, как использовать этот оператор

connection.query("select exists (select * from demoApp where username = '" + username + " ')", function (error, result) {

этого должно быть достаточно

connection.query("select 1 from demoApp where username = '" + username + " '", function (error, result) {

, затем проверьте соответствующие строки.

if (result.affectedRows > 0) {
    LOG.info("Username already exists!");
}
...