Код входа в Qt работает некорректно

#database #qt #sqlite #login

#База данных #qt #sqlite #аутентификация

Вопрос:

 void admin::on_login_a_clicked()
{
    QString usr,pass;
    usr = ui->Au->text();
    pass = ui->Ap->text();
   // usr.toStdString() ;
   // pass.toStdString() ;
    qDebug() << usr;
    QSqlQuery sq;
    if(sq.exec("select username,password from admin as a where a.username  ='"  usr  "'"))
    {

        ui->con->setText("Logged in successfully");
    }
    else
    {
        ui->con->setText("Login Failure");
    }
}
  

Я подключил data sq lite db и написал этот запрос из Интернета, я понятия не имею о какой-либо функции Qt, поэтому, если есть синтаксическая ошибка или какой-либо другой вид, пожалуйста, сообщите. Проблема с этим кодом заключается в том, что он продолжает входить в систему, даже если ‘usr’ отсутствует в базе данных.

Комментарии:

1. Не могли бы вы уточнить.

2. да, я это делал, но это не проблема, потому что имя пользователя уникально

3. Вы также не должны использовать конкатенацию строк для формирования SQL-запроса, особенно если часть этой строки вводится пользователем. Вместо этого используйте QSqlQuery::prepare() привязку и значение.

Ответ №1:

sq.exec() не указывает, есть ли возвращаемая запись или нет, скорее она возвращает true / false, чтобы указать, успешно ли выполнен запрос или нет (это всегда верно в вашем случае, поскольку выполнение всегда проходит успешно).

для навигации по результатам запроса вам необходимо использовать sq.next() . В вашем случае sq.next() вернет false, если имя пользователя не существует. В противном случае он вернет true .

изменить

 if(sq.exec("select username,password from admin as a where a.username  ='"  usr  "'")){ //user exists }
  

Для

 sq.exec("select username,password from admin as a where a.username  ='"  usr  "'"));
if (sq.next()) { //user exists }
  

Комментарии:

1. не могли бы вы объяснить это?

2. Пожалуйста, не объединяйте параметры SQL-запроса в инструкции самостоятельно. Вот для чего предназначены подготовленные инструкции, используйте QSqlQuery::prepare и QSqlQuery::bindValue .