有没有更清洁的方法来做到这一点? (在 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】:
如果您首先使用绑定创建QMap
或QStringList
,然后遍历该数据结构并为列表/映射中的每个项目调用addBindValue()
,它可能看起来更整洁。
【讨论】:
【参考方案2】:关于您关于 SQL 注入的子问题,::prepare
和 ::addBindValue
的组合确实可以完全防止它。这是因为 SQL 引擎从不解析绑定值;它们只是在之后编译(准备步骤)和执行之前插入的值。
当然,从数据库中取出值时也必须小心,但这并不能保护数据库,而是确保这些值不会被用于造成其他恶作剧(例如,注入意外的恶意 <script>
标签进入 html,或者更糟糕的是,<blink>
或 <marquee>
怪物)。但这是另一个问题,无论如何都不适用于所有用途。将值放在严格的纯文本 GUI 字段中通常没有问题。
【讨论】:
顺便说一句,我根本不了解Qt——我注意到sqlite
标签——所以我不能说是否有更简洁的方法来进行实际绑定。 C 程序员可能会为此使用本地定义的宏,但许多 C++ 程序员不喜欢这种用法,所以我真的不知道。以上是关于有没有更清洁的方法来做到这一点? (在 Qt C++ 中准备好的 SQL 查询)的主要内容,如果未能解决你的问题,请参考以下文章
我目前正在检查 UIAlertController 是不是存在以确定正在使用的操作系统版本。有没有更有效的方法来做到这一点?