gpt4 book ai didi

c++ - 带反斜杠的 QSqlQuery

转载 作者:行者123 更新时间:2023-12-02 10:34:51 26 4
gpt4 key购买 nike

我正在尝试从数据库中检索用户,他们的名字是 'DOMAIN\name'。

我已经在 sql 控制台中检查了查询,简单的选择如下:

select * from users where name='DOMAIN\\name'

如果数据库中的名称看起来像“DOMAIN\user”(单反斜杠),它会返回正确的行。

但是 QSqlQuery 返回空:
代码类似于:
const QString command = QStringLiteral("select * "
"from %1 where name = '%2'")
.arg(Constants::kUsersTableName).arg(userId);

qCDebug() << "Query:" << command;

QSqlDatabase db = QSqlDatabase::database(m_connection, false);
QSqlQuery query(db);
if (!query.prepare(command) || !query.exec()) {
...

日志 :

Query: "select * from users where name = 'DOMAIN\\name'"



知道为什么 QSqlQuery 在数据库控制台为用户返回有效记录的同时返回空。

数据库管理系统:MySQL

最佳答案

MySQL 使用 \作为其转义字符,因此正确的查询字符串必须两次转义斜杠,一次用于 c++,一次用于 mysql:

"select * from users where name='DOMAIN\\\\name'"

更简单的解决方案是正确使用准备好的语句和占位符,这是一个非常重要的好处,可以保护您的代码免受 SQLI 的影响。 .

请注意,大多数(如果不是所有)数据库引擎都不允许字段和表名作为占位符,因此您仍然需要手动构建字符串的该部分:
const QString usernamePlaceholder = ":username"
const QString command = QStringLiteral("select * "
"from %1 where name = %2")
.arg(Constants::kUsersTableName).arg(usernamePlaceholder);

QSqlDatabase db = QSqlDatabase::database(m_connection, false);
QSqlQuery query(db);
if (!query.prepare(command)) {
qCDebug() << query.lastError();
return;
}
query.bindValue(usernamePlaceholder, userId);
if (!query.exec()) {
qCDebug() << query.lastError();
return;
}
bindValue将处理您的值所需的任何引用和转义。

关于c++ - 带反斜杠的 QSqlQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60752175/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com