有没有更清洁的方法来做到这一点? (在 Qt C++ 中准备好的 SQL 查询)

Posted

技术标签:

【中文标题】有没有更清洁的方法来做到这一点? (在 Qt C++ 中准备好的 SQL 查询)【英文标题】:Is there any cleaner way to do this? (Prepared SQL queries in Qt C++) 【发布时间】:2010-09-04 06:27:34 【问题描述】:

我正在使用 QSqlQuery::prepare() 和 ::addBindValue() 在我正在处理的 Qt 项目中进行查询。有很多重复的代码,虽然我认为这是“正确”的方式,但我想确定一下。也许有人有其他想法?示例:

QSqlQuery newQuery;
newQuery.prepare("INSERT INTO table "
                 "(foo,bar,baz,"
                 "herp,derp,biggerp,"
                 "alpha,beta,gamma,"
                 "etc) VALUES "
                 "(?,?,?,"
                 "?,?,?,"
                 "?,?,?,"
                 "?)");
newQuery.addBindValue(this->ui->txtFoo->text());
newQuery.addBindValue(this->ui->txtBar->text());
newQuery.addBindValue(this->ui->txtBaz->text());
newQuery.addBindValue(this->ui->txtHerp->text());
newQuery.addBindValue(this->ui->txtDerp->text());
newQuery.addBindValue(this->ui->txtBiggerp->text());
newQuery.addBindValue(this->ui->txtAlpha->text());
newQuery.addBindValue(this->ui->txtBeta->text());
newQuery.addBindValue(this->ui->txtGamma->itemText(0));
newQuery.addBindValue(this->ui->txtEtc->text());
newQuery.exec();

您会一遍又一遍地看到一堆相同的“newQuery.addBindValue(this->ui->______”。这是“最好”的解决方法吗?

另外,前几天晚上我在 freenode 上的#qt 中问过,但没有得到明确的答案;以上(::prepare with ::addBindValue)会防止 SQL 注入吗?参考并没有真正说。

【问题讨论】:

首先,您不需要this->。事实上,这可能是一种不好的做法,因为它只会让一切变得混乱。 【参考方案1】:

如果您首先使用绑定创建QMapQStringList,然后遍历该数据结构并为列表/映射中的每个项目调用addBindValue(),它可能看起来更整洁。

【讨论】:

【参考方案2】:

关于您关于 SQL 注入的子问题,::prepare::addBindValue 的组合确实可以完全防止它。这是因为 SQL 引擎从不解析绑定值;它们只是在之后编译(准备步骤)和执行之前插入的值。

当然,从数据库中取出值时也必须小心,但这并不能保护数据库,而是确保这些值不会被用于造成其他恶作剧(例如,注入意外的恶意 <script> 标签进入 html,或者更糟糕的是,<blink><marquee> 怪物)。但这是另一个问题,无论如何都不适用于所有用途。将值放在严格的纯文本 GUI 字段中通常没有问题。

【讨论】:

顺便说一句,我根本不了解Qt——我注意到sqlite标签——所以我不能说是否有更简洁的方法来进行实际绑定。 C 程序员可能会为此使用本地定义的宏,但许多 C++ 程序员不喜欢这种用法,所以我真的不知道。

以上是关于有没有更清洁的方法来做到这一点? (在 Qt C++ 中准备好的 SQL 查询)的主要内容,如果未能解决你的问题,请参考以下文章

SQL 更新 - 有没有更优雅、更有效的方法来做到这一点?

我目前正在检查 UIAlertController 是不是存在以确定正在使用的操作系统版本。有没有更有效的方法来做到这一点?

重写逻辑,有没有更好的方法来做到这一点?

使用太多内存来减少图像尺寸......有没有办法使用更少的内存来做到这一点?

将Qt的QML代码转换为C ++

如何跳过没有内容的值?