QSqlQuery с обратной косой чертой - PullRequest
1 голос
/ 19 марта 2020

Я пытаюсь получить пользователей из базы данных, их имена: DOMAIN \ name.

Я проверил запрос в консоли sql, просто выберите как:

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

возвращает правильную строку, если имя в базе данных выглядит как 'DOMAIN \ user' (одиночный обратный sla sh).

однако 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:

Запрос: "выберите * из пользователей, где name = 'DOMAIN \\ name'"

любая идея, почему QSqlQuery возвращает пустое значение в в то же время, когда консоль базы данных возвращает действительную запись для пользователя.

дБмс: MySQL

1 Ответ

0 голосов
/ 19 марта 2020

MySQL использует \ в качестве escape-символа, поэтому для правильной строки запроса вам необходимо экранировать sla sh дважды, один раз для 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 позаботится о том, какие кавычки и экранирование требуются для ваших значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...