2014-12-29 3 views
0

Im создание системы входа в qt с использованием базы данных, но когда я запускаю запрос в qt, он всегда возвращает true, даже если этот элемент является ложным.Qt SQL query.exec Always Returning True

SQL-код подключения к базе данных ниже

QSqlDatabase login = QSqlDatabase::addDatabase("QSQLITE"); 
login.setDatabaseName("/Users/Daniel/Dropbox/Stock_Control.sqlite"); 
if(!login.open()) 
    ui->label->setText("Unable To Connect To Database"); 

код SQL запроса ниже

static Home *home = new Home; 
QSqlQuery query; 
QString Username = ui->Username_lineEdit->text(); 
QString Password = ui->Password_lineEdit->text(); 
if(query.exec("SELECT * FROM Program_account WHERE Login = '"+ Username +"' AND Password = '"+ Password +"' ")) 
{ 
    tries = 0; 
    home->show(); 
    close(); 
} 

Спасибо

+0

Не забывайте о SQL Injection .. имя пользователя и пароль тривиальный случай. – UldisK

ответ

1

QSqlQuery::exec() возвращает true, когда запрос успешно выполнен, даже если запрос пуст. Используйте функцию QSqlQuery::size(), чтобы проверить, пустой или нет запрос.

UPDATE

QSqlQuery::size() Поскольку всегда возвращает -1 для SQLite, вы можете использовать вместо QSqlQuery::first().

Вы можете сделать что-то вроде:

if(!query.exec("SELECT Login FROM Program_account WHERE Login = '"+ Username +"' AND Password = '"+ Password +"' ")) 
{ 
    // something is terribly wrong 
} 
else if(!query.first()) 
{ 
    // incorrect username or password 
} 
else 
{ 
    tries = 0; 
    home->show(); 
    close(); 
} 
+2

Это неправильно, потому что size() всегда возвращает -1 для SQLite, потому что SQLite этого не поддерживает. См. Ответы в этом вопросе: http://stackoverflow.com/questions/26495049/qsqlquery-size-always-returns-1 – Chernobyl

+0

@ Чернобыль, спасибо за указание на это, я исправил ответ. Теперь он должен работать и для sqlite –