【问题标题】:Unable to retrieve data from a SQLite database & display on QT GUI无法从 SQLite 数据库中检索数据并在 QT GUI 上显示
【发布时间】:2020-11-08 01:59:50
【问题描述】:

我正在尝试创建一个登录系统,如果有人登录,它应该在登录 GUI 之后的 Qt GUI 上显示他们的姓名。

我尝试使用下面的代码,但是标签只是空白,所以我假设问题来自数据库。我们将不胜感激所有帮助,谢谢。

#include "TaxiCoZa.h"

TaxiCoZa::TaxiCoZa(QWidget *parent):QWidget(parent) {   
    ui.setupUi(this);
    Connection x;
    isConnected(x)
};

void TaxiCoZa::on_loginButton_clicked() {
    emailInput = ui.emailEdit1->text();
    passwordInput = ui.passwordEdit1->text();
    Connection y;
    QSqlQuery query;
    
    query.prepare("SELECT * FROM riders WHERE email='" + emailInput + "' and password='" + passwordInput + "'");
    
    if (query.exec()) {
        int count = 0;
        
        while (query.next()) {
            count++;
        }
        // scenario for the correct password
        if (count == 1) {
            QString name;
            
            QSqlQuery query2;
            
            query2.prepare("SELECT (name) FROM riders WHERE email='" + emailInput + "' and password='" + passwordInput + "'");
            query2.exec();
            
            while (query.next())
            {
                name = query2.value(0).toString();
                break;
            }
            
            y.connClose();
            this->hide();
            Book b;
            b.setGreetingLabel("Hello, " + name);
            b.exec();   
        }
    }
}

【问题讨论】:

  • 以下两个答案都不正确(如果他第一个向您展示了如何避免 sql 注入)。您正在使用 QSqlQuery::next() 检索整个数据并稍后尝试再次读取它,但 next() 无法再返回任何内容,因为您已经阅读了所有数据。

标签: c++ visual-studio qt


【解决方案1】:

您的query.prepare("Select ...") 似乎没有正确写入。 试试这个;

query.prepare("SELECT * FROM riders WHERE email= 'emailInput' and password='passwordInput'");

另外,对第二个查询进行相同的更改。遵循该格式。

【讨论】:

  • 那部分是正确的,那是登录部分,它可以工作。
【解决方案2】:

您不能按照您的方式运行两个查询。在您的第一个查询中,直接SELECT (name),不要运行另一个查询。并确保name 存在于您的 SQLite 数据库中。

如果您必须运行两个查询,请尝试; mysql_query()mysql_real_query() 但是您仍然不能同时运行两个(或更多)语句 联系。不可能。您也许可以发送多个语句 一次,但非常不鼓励。但即使在那种情况下 语句将一个接一个地执行。

您最好的选择,尝试在您的第一个查询中获取name

【讨论】:

  • 这真的是两个不同的答案吗?如果没有,请使用编辑按钮更新您当前的答案。
【解决方案3】:

我设法通过使用 QSqlQuery 类中的 first() 函数解决了这个问题

请参阅下面的代码进行更改

void TaxiCoZa::on_loginButton_clicked() {
QString emailInput = ui.emailEdit1->text();
QString passwordInput = ui.passwordEdit1->text();

QSqlQuery query;

query.prepare("SELECT * FROM riders WHERE email='" + emailInput + "' and password='" + passwordInput + "'");

if (query.exec()) {
    int count = 0;

    while (query.next()) {
        count++;
    }

    if (count == 1) {
        query.first(); // change made here
        QString name = query.value(1).toString();
        y.connClose();
        this->hide();
        
        Book b;
        b.setGreetingLabel("Hello, " + name);
        b.exec();
    }
    else if (count > 1) {
        QMessageBox::critical(this, "Error", "DUPLICATE");
    }
    else{
        QMessageBox::critical(this, "Error", "INCORRECT EMAIL OR PASSWORD ENTERED!!!");
    }
}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    相关资源
    最近更新 更多