我有一个QTableView
,我使用QSqlTableModel
的衍生类SqlTableModel
从MySQL数据库获取数据。我想防止打针。我做了联合注射,这比从婴儿手里抢糖果容易多了。SQL查询使用LIKE关键字。
尝试1(可注射):
QString query = QString("select * from table where col like '%%1%'").arg(edit->text());
QSqlQuery q(query);
SqlTableModel *model = new SqlTableModel();
model->setQuery(q);
model->select();
tableView->setModel(model);
尝试2(无数据返回,无错误):
QString query = "select * from table";
QSqlQuery q(query);
SqlTableModel *model = new SqlTableModel();
model->setQuery(q);
model->setFilter(QString("col like '%%1%'").arg(edit->text()));
model->select();
tableView->setModel(model);
尝试3(无数据返回,无错误):
QString query = "select * from table where col like :param";
QSqlQuery q(query);
q.prepare(query);
q.bindValue(":param", QString("%%1%").arg(edit->text()));
SqlTableModel *model = new SqlTableModel();
model->setQuery(q);
model->select();
tableView->setModel(model);
看起来您正在以错误的方式使用QSqlTableModel。根据docs
,常见的用法是调用setTable
,然后调用select
。model->setTable("table");
model->select()
过滤器可以使用setFilter
设置model->setFilter(QString("col like '%%1%'").arg(edit->text()));
同时,你使用一个QSqlTableModel,就像它是一个QSqlQueryModel与setQuery
调用。即使它应该工作,那么根据文档查询应该是活跃的,即QSqlQuery::exec
应该在setQuery
调用之前被调用。
最后,QSqlTableModel的使用方式应该像
SqlTableModel *model = new SqlTableModel();
model->setTable("table");
model->setFilter(QString("col like '%%1%'").arg(edit->text()));
model->select();
tableView->setModel(model);
如果您想自己构建查询,那么您应该使用基于QSqlQueryModel的类,如
QString query = "select * from table where col like '%%1%'";
QSqlQuery q(query);
q.prepare();
q.addBindValue(edit->text());
q.exec();
QSqlQueryModel *model = new QSqlQueryModel();
model->setQuery(std::move(q));
tableView->setModel(model)