#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
.