Вставка значений в базу данных mysql с помощью qt creator - PullRequest
0 голосов
/ 29 апреля 2020

Мне нужно вставить значения имени пользователя и пароля в базу данных с помощью qt creator, и никакие два имени пользователя не должны совпадать. После этой проверки я должен приступить к вставке. Когда я запускаю свой код ниже, я не получаю никаких изменений в моей базе данных. Кажется, я не могу найти проблему и не знаю, что делать дальше. Можно ли как-нибудь улучшить свой код?

void LoginScreen::createClicked()
{
    QString username{ui -> newUsernameInput -> text()};
    QString password{ui -> newPasswordInput -> text()};

    QString command{"SELECT username FROM users WHERE username = '" + username + '\''};
    QSqlQuery query(db);

    bool ok{query.exec(command)};

    if(ok)
    {
        while(query.next())
        {
            QString newUsername{query.value("username").toString()};

            if(username == newUsername)
            {
                QMessageBox::information(this, "Error", "Username already exists!");
                ui -> newUsernameInput -> clear();
                ui -> newPasswordInput -> clear();
            }
            else
            {
                QString insertCommand{"INSERT INTO users (username, password) VALUES ('"
                           + username + "', '" + password + "');"};
                QSqlQuery quer(db);
                query.exec(insertCommand);
            }
    }
}

1 Ответ

0 голосов
/ 29 апреля 2020

Если имя пользователя не существует в базе данных, это утверждение будет ложным:

while(query.next())

т.е. никакие записи не возвращаются.

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

void LoginScreen::createClicked()
{
    QString username{ui -> newUsernameInput -> text()};
    QString password{ui -> newPasswordInput -> text()};

    QSqlQuery query(db);
    query.prepare("SELECT username FROM users WHERE username = :username");
    query.bindValue(":username", username);
    bool ok{query.exec()};

    if(ok)
    {
        if (query.next())
        {
            QString newUsername{query.value("username").toString()};

            if(username == newUsername)
            {
                QMessageBox::information(this, "Error", "Username already exists!");
                ui -> newUsernameInput -> clear();
                ui -> newPasswordInput -> clear();
            }
        }
        else
        {
            QSqlQuery query(db);
            query.prepare("INSERT INTO users (username, password) VALUES(:username,:password)");
            query.bindValue(":username", username);
            query.bindValue(":password", password);
            query.exec();
        }
    }
}

Редактировать:

Нет необходимости для этой проверки:

if(username == newUsername)

, потому что вы знать, что к этому моменту имя пользователя уже существует в базе данных.

...