#include "database.h" #include <QSqlQuery> #include <QVariant> Database::Database(QObject *parent):QObject(parent) { db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("./database/user.db"); db.open(); db.exec("create table if not exists Person (id int primary key autoincrement, name varchar(30), pwd varchar(30))"); } Database::~Database() { db.close(); } bool Database::open() { int ret = db.open(); if(ret) return true; else return false; } void Database::close() { db.close(); } int Database::no_res(char* sql) { QSqlQuery query; int ret = query.exec(sql); return ret; } int Database::getres(char* sql) { QSqlQuery query; query.exec(sql); int ret = query.value(0).toInt(); return ret; }问题
时间: 2024-01-17 14:03:55 浏览: 103
这段代码是一个简单的 Qt 数据库操作的示例。其中,Database 类是一个封装了 QSqlDatabase 和 QSqlQuery 的类,提供了打开、关闭数据库、执行 SQL 语句等基本操作。这里提出两个问题:
1. 在 open() 函数中,如果 db.open() 返回 false,应该返回 false,而不是返回 true。因为 db.open() 返回 false 表示数据库未能成功打开,返回 true 表示数据库已经成功打开。
2. 在 no_res() 和 getres() 函数中,使用 char* 类型的参数作为 SQL 语句传入 QSqlQuery::exec() 函数。这样的写法存在 SQL 注入攻击的风险。应该使用 QSqlQuery::prepare() 函数将 SQL 语句和参数分离,以避免 SQL 注入攻击。例如:
```
int Database::no_res(const QString& sql, const QVariantList& params)
{
QSqlQuery query;
query.prepare(sql);
for (int i = 0; i < params.size(); ++i) {
query.addBindValue(params.at(i));
}
return query.exec();
}
int Database::getres(const QString& sql, const QVariantList& params)
{
QSqlQuery query;
query.prepare(sql);
for (int i = 0; i < params.size(); ++i) {
query.addBindValue(params.at(i));
}
query.exec();
int ret = query.value(0).toInt();
return ret;
}
```
在这种写法中,SQL 语句和参数被分离开来,参数通过 QVariantList 传递,而且使用了 QSqlQuery::prepare() 和 QSqlQuery::addBindValue() 函数,可以避免 SQL 注入攻击的风险。
阅读全文