SQLite3-SQL错误:无法识别C的令牌:“”

SQLite3-SQL错误:无法识别C的令牌:“”,sql,c,sqlite,Sql,C,Sqlite,我知道这已经在中得到了回答,但我不明白我们如何使用“?”来表示使用C的SQLite 我是这样做的- rc = sqlite3_open("test.db", &db); if(rc) { debug_log("Can't open database: %s\n", sqlite3_errmsg(db));

我知道这已经在中得到了回答,但我不明白我们如何使用“?”来表示使用C的SQLite

我是这样做的-

        rc = sqlite3_open("test.db", &db);

        if(rc) {
            debug_log("Can't open database: %s\n", sqlite3_errmsg(db));                                                                                                                                  rv = 3;
            goto end;
        } else {
            debug_log("Opened database successfully\n");
        }

        querylen = strlen("SELECT * from HMAC WHERE path = %s AND checksum = %s;");
        pathlen  = strlen(path);                                                                                                                                                                     sql      = (char *)malloc(querylen + pathlen + strlen(hex));
        sprintf(sql, "SELECT * from HMAC WHERE path = \'%s\' AND checksum = \'%s\';", path, hex);

        fprintf(stderr, "%s\n", sql);
        /* Execute SQL statement */
        rc = sqlite3_exec(db, sql, callback, NULL, &zErrMsg);
                                                                                                                                                                                                     if (rc != SQLITE_OK ) {
            rv = 3;
            fprintf(stderr, "SQL error: %s\n", zErrMsg);
            sqlite3_free(zErrMsg);
            goto end;
        }

        if (checksum_matched == 1) {
            rv = 0;
        } else {
            rv = 1;
        }

        free(sql);
        sqlite3_close(db);
但是当我尝试检索一些案例的数据时-

SELECT * from HMAC WHERE path = '/usr/share/monitors/SNMPDCA_monitor' AND checksum = '66ace8fa66362d2cbbd926aac0b47531a7113afca0ab68b6202ecf0a7eaa87a2';
SQL error: unrecognized token: ""
更新:添加有用的内容,供将来遇到相同问题的其他人参考

    sqlite3_stmt *stmt;
    rc = sqlite3_open("/usr/lib/hmac-binaries/test.db", &db);
    if(rc) {
        debug_log("Can't open database: %s\n", sqlite3_errmsg(db));
        rv = 3;
        goto close_conn;
    } else {
        debug_log("Opened database successfully\n");
    }
    querylen = strlen("SELECT * from HMAC WHERE path=?;");
    sql      = (char *)malloc(querylen + 1);
    if (sql == NULL) {
        fprintf(stderr, "ENOMEM\n");
        rv = -1;
        goto close_conn;
    }
    sprintf(sql, "SELECT * from HMAC WHERE path=?;");
    rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "error: %s\n", sqlite3_errmsg(db));
        rv = 3;
        goto close_conn;
    } else {
        sqlite3_bind_text(stmt, 1, path, -1, NULL);
    }
    rv = 1;
    while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) {
        if (strcmp(sqlite3_column_text(stmt, 3), hex) == 0) {
            rv = 0;
            break;
        }
    }
    if (rv != 0 && rc != SQLITE_DONE) {
        rv = 3;
    }
    sqlite3_finalize(stmt);
close_conn:
    if (sql)
        free(sql);
    sqlite3_close(db);

在SQLite API中有一个问号?用作占位符,该占位符稍后将替换为实际值。这用于创建准备好的语句,如中所述

您文章中的源代码不包含使用预处理语句的示例,因此我将附上一个最简单的示例:

包括 包括 int mainvoid{ sqlite3*db; char*err_msg=0; sqlite3_stmt*res; int rc=sqlite3_opentest.db,&db; 如果rc!=SQLITE\u正常{ fprintfstderr,无法打开数据库:%s\n,sqlite3\u errmsgdb; sqlite3_closedb; 返回1; } //问号用于为SQL查询提供Id。 const char*sql=SELECT Id,Name FROM Cars,其中Id=?; //sqlite3_prepare_v2函数编译SQL查询。 rc=sqlite3\u prepare\u v2db,sql,-1,&res,0; 如果rc==SQLITE\u正常{ //sqlite3_bind_int将整数值绑定到准备好的语句。 //占位符替换为整数值3。函数的第二个 //参数是要设置的SQL参数的索引,第三个是 //parameter是要绑定到参数的值。 sqlite3_bind_intres,1,3; }否则{ fprintfstderr,未能执行语句:%s\n,sqlite3\u errmsgdb; } //sqlite3_步骤函数计算SQL语句。 int step=sqlite3_stepres; 如果步骤==SQLITE\u行{ printf%s:,sqlite3\u column\u textres,0; printf%s\n,sqlite3\u column\u textres,1; } sqlite3_finalizeres; sqlite3_closedb; 返回0; }
我建议您阅读官方和,以了解更多使用预置语句的示例。

使用并将您的值绑定到其中的参数。@Shawn您能提供一个示例吗?谢谢您的帮助。我正在把它标记为已批准。