gpt4 book ai didi

C++ 用户输入到 sqlite3

转载 作者:行者123 更新时间:2023-11-28 04:43:58 26 4
gpt4 key购买 nike

我有一个类作业要求我们编写一个 C++ 程序来跟踪支出,允许修改记录,并返回有关个人支出的“满意度”数字(即用户对花这笔钱的感觉如何)。我们的讲师表示他希望我们在此程序中使用 sqlite3。他给了我们一个示例程序,该程序在 sqlite3 中构建一个表并为列输入预定值。该程序运行良好,没有问题。

我想做的是修改程序以接受用户输入并将它们存储在 sqlite3 数据库中。这是我到目前为止的代码:

int main()
{
string salesDesc;
int price;
int satisf;
sqlite3 *db;
char *szErrMsg = 0;

cout << "Description of Expense: ";
cin >> saleDesc;
cout << endl;

cout << "Price: ";
cin >> price;
cout << endl;

cout << "Your Satisfaction: ";
cin >> satisf;
cout << endl;

// open database
int rc = sqlite3_open("spending_track.sqlite", &db);
if (rc)
{
cout << "Cannot open database\n";
}
else
{
cout << "Database opened successfully\n";
}

const char *pSQL[6];
pSQL[0] = "CREATE TABLE IF NOT EXISTS expenses(id INTEGER PRIMARY KEY "
"AUTOINCREMENT NOT NULL, logged TIMESTAMP DEFAULT "
"CURRENT_TIMESTAMP NOT NULL, desc VARCHAR(40), price INT,"
"satisfaction INT)";
pSQL[1] = "INSERT INTO expenses('" + string(saleDesc) + "'," price "," satisf ")";
pSQL[2] = "SELECT * FROM expenses";
pSQL[3] = "SELECT sum(satisf) FROM expenses";

// blablabla the rest of the program

当我尝试编译它时,我收到以下错误:

error: cannot convert 'std::_cxx11::basic_string' to 'const char*' in assignment pSQL[1] = "INSERT INTO expenses('" + string(saleDesc) + "'," price "," satisf ")";

如果我将 string(saleDesc) 更改为 saleDesc,我会得到同样的错误。

如果我将 string saleDesc; 更改为 char* saleDesc;,我会收到以下错误:

error: invalid operands of types 'const char[23]' and 'char*' to binary 'operator+' pSQL[1] = "INSERT INTO expenses('" + string(saleDesc) + "'," price "," satisf ")";

我不确定还有什么方法可以让它发挥作用。我还听说允许用户直接输入到 sqlite3 表是个坏主意。执行此操作的更“正确”方法是什么?

最佳答案

由于这只是一个类作业,我怀疑您不必担心 SQL 注入(inject)攻击,所以我不会费心去清理您的输入。

您的另一个问题是您混淆了 char*std::string。 sqlite API 要求您将 char* 传递给它,以便它可以在 C 代码中使用,但这并不意味着您需要使用它们。 std::string 是 char 数组的包装器,您可以使用 c_str() 方法获取它。我不认为你真的需要把 SQL 语句放在最后一个数组中。像这样的事情怎么样:

std::string  addTable = "CREATE TABLE IF NOT EXISTS expenses(id INTEGER PRIMARY KEY "
"AUTOINCREMENT NOT NULL, logged TIMESTAMP DEFAULT "
"CURRENT_TIMESTAMP NOT NULL, desc VARCHAR(40), price INT,"
"satisfaction INT)";
std::string insertExpense = "INSERT INTO expenses('" + saleDesc + "'," + std::to_string(price) "," + std::to_string(satisf) + ")";
std::string selectAllExpenses = "SELECT * FROM expenses";

然后当你想将它传递给 sqlite API 时,你可以使用 c_str()

sqlite3_exec(db, addTable.c_str(), ...

关于C++ 用户输入到 sqlite3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49661402/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com