带反斜杠的QSqlQuery

时间:2020-03-19 06:50:35

标签: c++ sql qt

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

1 个答案:

答案 0 :(得分:0)

MySQL使用public class PushListenerService extends QBFcmPushListenerService { private static final String TAG = PushListenerService.class.getSimpleName(); @Autowired private ApplicationContext context; @Override public void onMessageReceived(RemoteMessage remoteMessage) { super.onMessageReceived(remoteMessage); SharedPrefsHelper sharedPrefsHelper = SharedPrefsHelper.getInstance(); if (sharedPrefsHelper.hasQbUser()) { QBUser qbUser = sharedPrefsHelper.getQbUser(); Log.d(TAG, "App has logged user" + qbUser.getId()); LoginService.start(context, qbUser); } } 作为其转义字符,因此必须对两次斜杠进行转义的正确查询字符串,一次用于c ++,一次用于mysql:

\

更简单的解决方案是正确使用准备好的语句和占位符,这非常重要,可以保护您的代码不受SQLI的侵害。

请注意,大多数(即使不是全部)数据库引擎也不允许字段名和表名占位符,因此您仍然需要手工构建字符串的那一部分:

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

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