1

我有这个用于管理登录的代码,这里是其中的一小部分:

void Login::on_pushButton_clicked(){
    QString user, password;
    user = ui->username->text();
    password = ui->pass->text();

    QSqlQuery qry;
    qry.prepare("SELECT id, name from users WHERE username = :username AND password = :password");
    qry.bindValue(":username", user);
    qry.bindValue(":password", password);{
    int counter = 0;
    while (qry.next()){
        counter++;
    }
    if(counter==1)
        ui -> statuslabel -> setText("Sign in successful");
    if(counter<1)
        ui -> statuslabel -> setText("Sign in unsuccessful");
    }
}

在给它正确的输入(即正确的密码和用户名)时,它不起作用并继续第二个如果条件说登录不成功。我有一个计数器 int 类型,它计算有多少用户输入实例与数据库表匹配。它被初始化为零,这意味着这不是问题。关于这里可能出现的情况有什么想法吗?

4

1 回答 1

2

您忘记qry.exec()在使用 访问第一个元素之前调用qry.next()。它应该在 last 之后调用qry.bindValue()

以下是如何在您的代码中完成的示例:

QSqlQuery qry;
qry.prepare("SELECT id, name from users WHERE username = :username AND password = :password");
qry.bindValue(":username", user);
qry.bindValue(":password", password);
qry.exec()
if(!qry.isActive())
{
    ui -> statuslabel -> setText("SQL Statement execution failed");
    return;
}
if(qry.size() > 0)
    ui -> statuslabel -> setText("Sign in successful");
else
    ui -> statuslabel -> setText("Sign in unsuccessful");

注意:您不必使用QSqlQuery::next来检查您的SELECT语句是否返回任何结果。QSqlQuery::size方法将返回所选行数。

于 2018-11-06T13:15:25.447 回答