我有一個QTableView,我正在使用一個派生類從 MySQL 資料庫SqlTableModel中QSqlTableModel獲取資料。我想防止注射。我進行了聯合注射,這比從嬰兒身上拿糖果要容易。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);
uj5u.com熱心網友回復:
看起來您以錯誤的方式使用 QSqlTableModel。根據檔案,常見用法是setTable隨后呼叫select
model->setTable("table");
model->select()
可以使用setFilter設定過濾器
model->setFilter(QString("col like '%%1%'").arg(edit->text()));
同時,您使用 QSqlTableModel 就像它是帶有setQuery呼叫的 QSqlQueryModel 一樣。即使它應該作業,那么根據檔案查詢應該是活動的,即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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/494474.html
標籤:C mysql qt qt5 qsqltablemodel
