Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有更干净的方法?(在Qt C+;+;中准备好的SQL查询)_C++_Qt_Sqlite_Prepared Statement - Fatal编程技术网

C++ 有没有更干净的方法?(在Qt C+;+;中准备好的SQL查询)

C++ 有没有更干净的方法?(在Qt C+;+;中准备好的SQL查询),c++,qt,sqlite,prepared-statement,C++,Qt,Sqlite,Prepared Statement,我正在使用QSqlQuery::prepare()和::addBindValue()进行我正在处理的Qt项目中的查询。有很多重复的代码,虽然我认为这是“正确”的方式,但我想确保。也许有人有别的想法?例如: QSqlQuery newQuery; newQuery.prepare("INSERT INTO table " "(foo,bar,baz," "herp,derp,biggerp," "

我正在使用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”(这个->用户界面->\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu


另外,前几天晚上我在freenode上的#qt中问过,但没有得到明确的答案;上面的(::准备::addBindValue)保护SQL注入吗?参考文献并没有真正提到。

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


当然,从数据库中取出值时也必须小心,但这并不是在保护数据库,而是要确保这些值不会被用于造成其他危害(例如,将意外的恶意
标记注入HTML,或者更糟糕的是,注入
怪物)但是,这是另一个问题,而且并不适用于所有用途;将值放在纯文本GUI字段中通常没有问题。

如果首先使用绑定创建
QMap
QStringList
,然后迭代该数据结构并调用
addBindValue(),则看起来可能会更整洁一些
对于列表/映射中的每一项。

对于初学者来说,您不需要
这个->
。事实上,这可能是一种不好的做法,因为它会把所有内容都弄乱。顺便说一句,我根本不知道Qt–我之所以注意到它是因为
sqlite
标记–所以我不能说是否有更简洁的方法来进行实际绑定。C程序员migHT使用本地定义宏,但是许多C++程序员不喜欢这种用法,所以我不知道。