【问题标题】:C++ SQLite cannot convert `std::basic_string<char, std::char_traits<char>, std::allocator<char> >' to `char*' in assignmentC++ SQLite 不能在赋值中将 `std::basic_string<char, std::char_traits<char>, std::allocator<char> >' 转换为 `char*'
【发布时间】:2015-02-25 17:11:21
【问题描述】:

我正在尝试使用 C++ 和 SQLite,但我不知道如何将参数传递到单个字符串中以形成 SQLite 命令。

void InsertDB(unsigned long long phone,string name,int age,string address,long int zipcode)
{
stringstream insert;
insert << "INSERT INTO ADBOOK (PHONE,NAME,AGE,ADDRESS,ZIPCODE) VALUES (" << phone << ",'" << name << "'," << age << ",'" << address << "'," << zipcode << " ); ";
sql = insert.str();

/* Execute SQL statement */
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if( rc != SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}else{
fprintf(stdout, "Records created successfully\n");
}
return;     

}

我不断收到错误消息 错误:无法在赋值中转换std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;' tochar*'

我怎样才能使这个代码块工作?

有没有更简单的方法来实现这个?这是一个需要 C++ 和任何类型的数据库(MySQL 等)的项目

好的,这是完整的代码,这是一个大学项目,我真的需要一些帮助来解决这个问题http://pastebin.com/XiisxBxf

【问题讨论】:

  • rc = sqlite3_exec(db, sql.data(), callback, 0, &amp;zErrMsg);
  • Hello SQL 注入攻击
  • @jrok:最好使用c_str(),以确保它以 C 风格终止。

标签: c++ sqlite


【解决方案1】:

您可以使用std::string 的成员函数c_str() 来获取指向以零结尾的字符序列的指针,适合传递给C 风格的函数:

rc = sqlite3_exec(db, sql.c_str(), callback, 0, &zErrMsg);
                         ^^^^^^^^

顺便问一下,如果我将我的名字命名为"); DROP TABLE ADBOOK #",会发生什么?永远不要将用户提供的字符串直接插入到查询中; prepare 带有占位符的语句到 bind 的输入。

另外,顺便说一句,电话号码和邮政编码都不能用整数表示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多