从数据库中提取用户名
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 注入攻击的方式,人们将恶意数据写入您的应用程序以侵入您的系统。
永远,永远,永远不要那样做。始终将您的数据保存在类似于我在此处显示的准备好的语句中。
我对 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 注入攻击的方式,人们将恶意数据写入您的应用程序以侵入您的系统。
永远,永远,永远不要那样做。始终将您的数据保存在类似于我在此处显示的准备好的语句中。