Qt工作笔记-QString中arg的使用(可用于SQL语句拼接)

583 篇文章 127 订阅

文档内的例子如下:



下面用一个小demo演示下:



代码如下:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

public slots:
    void pressBtn();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(ui->pushButton,SIGNAL(clicked(bool)),SLOT(pressBtn()));
}

void Widget::pressBtn(){
    QString name="u_name";
    QString age="u_age";
    QString sex="man";
    QString db="webdb";
    QString sqlQStr=QString("select %1,%2,%3 from %4").arg(name).arg(age).arg(sex).arg(db);

    ui->lineEdit->setText(sqlQStr);
}

Widget::~Widget()
{
    delete ui;
}

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

这段代码没有明显的语法错误,但是需要注意一些潜在的问题: 1. 在 SQL 语句,应该使用单引号(')将字符串值括起来,例如: ```sql INSERT INTO student VALUES (NULL, 'name', 'phone', 'carnumber', 'intrytime', 'outtime', intrynumber); ``` 2. 如果 `info.name`、`info.phone`、`info.carnumber`、`info.intrytime`、`info.outtime`、`info.intrynumber` 包含单引号,可能会导致 SQL 解析错误或者 SQL 注入攻击。为了避免这个问题,您需要对这些字符串进行适当的转义或者使用参数化查询。 3. 如果 `info.intrynumber` 是一个字符串类型,需要将其用单引号括起来,例如: ```sql INSERT INTO student VALUES (NULL, 'name', 'phone', 'carnumber', 'intrytime', 'outtime', 'intrynumber'); ``` 4. 如果 `info.intrynumber` 是一个数值类型,不应该用单引号括起来,例如: ```sql INSERT INTO student VALUES (NULL, 'name', 'phone', 'carnumber', 'intrytime', 'outtime', 123); ``` 综上所述,您可以将代码修改为以下形式: ```cpp QString strSql = QString("INSERT INTO student VALUES (" "NULL, " "'%1', " // name "'%2', " // phone "'%3', " // carnumber "'%4', " // intrytime "'%5', " // outtime "%6" // intrynumber ")") .arg(info.name) .arg(info.phone) .arg(info.carnumber) .arg(info.intrytime) .arg(info.outtime) .arg(info.intrynumber); ``` 但是,为了避免 SQL 注入攻击等安全问题,建议使用参数化查询来代替字符串拼接的方式。例如: ```cpp QSqlQuery query; query.prepare("INSERT INTO student VALUES (" "NULL, " ":name, " ":phone, " ":carnumber, " ":intrytime, " ":outtime, " ":intrynumber" ")"); query.bindValue(":name", info.name); query.bindValue(":phone", info.phone); query.bindValue(":carnumber", info.carnumber); query.bindValue(":intrytime", info.intrytime); query.bindValue(":outtime", info.outtime); query.bindValue(":intrynumber", info.intrynumber); if (!query.exec()) { // 处理执行查询失败的情况 } ``` 在这个例子,我们使用 `prepare()` 函数创建了一个参数化的 SQL 查询,然后使用 `bindValue()` 函数绑定了每个参数的值。这种方法可以避免 SQL 注入攻击,并且可以更好地处理各种数据类型。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值