代码之家  ›  专栏  ›  技术社区  ›  Joseph

有没有更干净的方法?(Qt C++中的SQL查询)

  •  2
  • Joseph  · 技术社区  · 15 年前

    我正在使用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(这个->用户界面->\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\。这是最好的方法吗?

    另外,前几天晚上我在freenode上的qt中问了一个问题,但没有得到明确的答案;上面的(::prepare with::addBindValue)是否会保护agains SQL注入?参考文献并没有说。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Donal Fellows    15 年前

    关于SQL注入的子问题 ::prepare ::addBindValue 之后 编译(准备步骤)和执行前。

    当然,在从数据库中取出值时也必须小心,但这并不是保护数据库,而是确保这些值不会被用来引起其他危害(例如,注入意外的恶意代码) <script> <blink> <marquee>

        2
  •  4
  •   teukkam    15 年前

    如果您首先创建一个 QMap QStringList 使用绑定,然后遍历该数据结构并调用 addBindValue() 对于列表/地图中的每个项目。