带反斜杠的QSqlQuery

问题描述 投票:1回答:1

我正在尝试从数据库中检索其名称为'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()) {
...

log:

查询:“从名称为'DOMAIN \\ name'的用户中选择*”

知道数据库控制台为用户返回有效记录时QSqlQuery同时返回空的任何想法。

dbms:MySQL

c++ sql qt
1个回答
0
投票

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将处理您的值所需的所有引用和转义。

© www.soinside.com 2019 - 2024. All rights reserved.