从数据库中提取用户名

Extracting an username from the database

我对 pqxx 库比较陌生,所以我似乎不知道如何从数据库中获取数据。

我有 DBUser 的头文件class

#pragma once
#include <string>
class DBUser
{
private:
    std::string m_user, m_password;
public:
    void CreateUser(std::string const& user, std::string const& pw);
    void LoginUser(std::string const& user, std::string const& pw);
};

这是带有登录实现的 cpp

#include "DBUser.h"
#include "DBLink.h"
#include <pqxx/pqxx>

void DBUser::CreateUser(std::string const& user, std::string const& pw)
{
    pqxx::work worker(*DBLink::GetInstance());
    try {
        worker.exec0("INSERT INTO users VALUES('" + user + "', " +
            "'" + worker.conn().encrypt_password(user, pw, "md5") + "')");
        worker.commit();
    }
    catch (const std::exception& e) {
        worker.abort();
        throw;
    }
}

void DBUser::LoginUser(std::string const& user, std::string const& pw)
{
    pqxx::work worker(*DBLink::GetInstance());
    try {
        pqxx::result username_result = worker.exec0("SELECT username FROM users WHERE username=" + 'user');
        worker.commit();
    }
    catch (const std::exception& e) {
        worker.abort();
        throw;
    }
}

每当我尝试 运行 程序时,我都会在 c++ 的 xstring 文件中收到错误。我也尝试使用行 class 获取必要的数据,但没有成功,同样的错误,所以有人可以告诉我并解释如何从数据库输出数据吗?

编辑:添加了我收到的确切错误

好吧,你不会想那样做的。您应该使用位置参数和准备好的语句。

查看此页面:

https://libpqxx.readthedocs.io/en/6.4/a01480.html

例如,这是我的一些代码:

static constexpr char const * INSERT_LIST { "author_id, series_id" };

void DB_AuthorSeries_Base::doInsert(pqxx::connection &conn, AuthorSeries &obj) {
    pqxx::work work {conn};
    string sql { string{"INSERT INTO author_series ("} + INSERT_LIST + ") VALUES (nullif(, 0), nullif(, 0)) RETURNING id" };
    pqxx::result results = work.exec_params(sql,
        obj.getAuthorId(),
        obj.getSeriesId());
    work.commit();
    obj.setId(results[0][0].as<int>());
}

注意 $1、T2 等

现在,我不知道您的插入语句是否会执行您想要的操作,因为我一直使用 createuser。但是...让您的 SQL 调用中包含原始数据是一个非常非常非常坏的习惯。这就是 SQL 注入攻击的方式,人们将恶意数据写入您的应用程序以侵入您的系统。

永远,永远,永远不要那样做。始终将您的数据保存在类似于我在此处显示的准备好的语句中。