我正在尝试从数据库中检索其名称为“ 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
答案 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;
}
将处理您的值所需的所有引号和转义。