C++中的SqLITE3在选择上输出空列表 我目前正在使用SqLeTe3 C++,一切都很好,我可以在表中添加东西,但是当我从MyTabe中选择一个*时。返回我空值。。。 变量rc

C++中的SqLITE3在选择上输出空列表 我目前正在使用SqLeTe3 C++,一切都很好,我可以在表中添加东西,但是当我从MyTabe中选择一个*时。返回我空值。。。 变量rc,c++,sql,sqlite,C++,Sql,Sqlite,是21。。这意味着我用错了图书馆。。然后,我在同一个.db文件上使用python和联机sql进行了检查,它向我输出了好的结果 如果有人能帮我解释一下我做错了什么,以及如何改正? 多谢各位 附言: 这是我的函数addUser,以防问题出现在add中 bool addUser(std::string username, std::string password){ char cpassword[password.size()+1]; strcpy(cpassword, passwor

是21。。这意味着我用错了图书馆。。然后,我在同一个.db文件上使用python和联机sql进行了检查,它向我输出了好的结果

如果有人能帮我解释一下我做错了什么,以及如何改正? 多谢各位

附言: 这是我的函数addUser,以防问题出现在add中

bool addUser(std::string username, std::string password){
    char cpassword[password.size()+1];
    strcpy(cpassword, password.c_str());
    std::string shashedP = hashPass(cpassword); // hashPass returns std::string

    std::string sql = "INSERT INTO users (username, passw) VALUES ('" + username  + "', " + shashedP + ");";
    char csql[sql.size()+1];
    strcpy(csql, sql.c_str());
    rc = sqlite3_exec(db, csql, callback, 0, &zErrMsg); // rc = SQLITE3_OK = 0 everytime
    ...

那是。。。奇怪的代码加成已经被提到,虽然不是真正有效的C++,但是一些编译器确实支持C样式的VLAs作为扩展。正常的工作流程是对任何返回行或以占位符形式接受用户提供的参数的内容使用准备好的语句。sqlite3_exec通常只适用于创建表以及没有结果和运行时定义的参数传递给查询的表

例如:

std::string query = "SELECT foo FROM bar WHERE name = ?";
std::string name = "Bob";
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(db, query.c_str(), query.size(), &stmt, nullptr) != SQLITE_OK) {
  // Error reporting and handling
}
sqlite3_bind_text(stmt, 1, name.c_str(), name.size(), SQLITE_STATIC);
while (sqlite3_step(stmt) == SQLITE_ROW) {
  int foo = sqlite3_column_int(stmt, 0);
  // Do stuff with the current row's foo
}
sqlite3_finalize(stmt);

.

Fyi,老实说,我认为本代码或任何VLA中都不需要csql VLA,但作为一个示例,这一个很方便。首先,VLA不是标准的,所以你应该避免使用它们。其次,没有任何理由不将sql.c_str作为第二个参数传递给sqlite3_exec,从而使您从一开始就不用使用有问题的VLA。最后,一个警告:以您自己的方式将SQL串接在一起是一个成功的秘诀。
std::string query = "SELECT foo FROM bar WHERE name = ?";
std::string name = "Bob";
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(db, query.c_str(), query.size(), &stmt, nullptr) != SQLITE_OK) {
  // Error reporting and handling
}
sqlite3_bind_text(stmt, 1, name.c_str(), name.size(), SQLITE_STATIC);
while (sqlite3_step(stmt) == SQLITE_ROW) {
  int foo = sqlite3_column_int(stmt, 0);
  // Do stuff with the current row's foo
}
sqlite3_finalize(stmt);