C - 如何使用变量作为 SQL 查询的一部分?

标签 c sqlite

简介

我正在尝试使用 C 将变量合并到查询中。我正在使用 sqlite tutorialspoint 遵循本教程。 ,也是我第一次接触使用 SQL。本教程向我展示了如何使用如下查询:

查询

sql = "UPDATE COMPANY set SALARY = 25000.00 where ID=1; " \
     "SELECT * from COMPANY";

*那么我该如何将变量合并到这个语句中,例如,如果我想用分配给“ID”的变量替换 1。

例如(我失败的尝试)

sql = "UPDATE COMPANY set SALARY = 25000.00 where ID=" + variable + ";" \
     "SELECT * from COMPANY";

我在谷歌上搜索过,但是我找不到任何关于使用 C 语言语法在 sql 查询中使用变量的 Material 。我该如何以正确且安全的方式解决这个问题,合并变量而不使程序容易受到 SQL 注入(inject)攻击?

最佳答案

C-API 提供了函数 sqlite3_prepare_v2sqlite3_bind,以便您可以bind parametersprepared statements 。这意味着,您可以使用占位符来替换字符串中的参数。

每个占位符都由索引引用,因此您可以使用任意数量的参数(最多可达 SQLITE_MAX_VARIABLE_NUMBER 设置的编译时限制)。然后将参数绑定(bind)到指定索引处的占位符。

有许多函数和方法可以完成参数替换,但为了帮助您入门,这里有一个示例,它将整数绑定(bind)到 sql 语句中的第一个占位符:

int rc;
sqlite3 *db;
sqlite3_stmt *stmt = NULL;
...
// here I assume you open the db, and provide any other working code as needed...
...
// the employee id number.
int id_num;
...

// create the sql statement, with a single placeholder marked by '?'.
char *sql = "UPDATE COMPANY set SALARY = 25000.00 where ID=?";

// prepare the sql statement.
rc = sqlite3_prepare_v2(db, sql, strlen(sql)+1, &stmt, NULL);
if (rc != SQLITE_OK) {
    printf("Failed to prepare statement: %s\n\r", sqlite3_errstr(rc));
    sqlite3_close(db);
    return 1;
} 
else {
    printf("SQL statement prepared: OK\n\n\r");
}

// bind an integer to the parameter placeholder. 
rc = sqlite3_bind_int(stmt, 1, id_num);
if (rc != SQLITE_OK) {
    printf("Failed to bind parameter: %s\n\r", sqlite3_errstr(rc));
    sqlite3_close(db);
    return 1;
} 
else {
    printf("SQL bind integer param: OK\n\n\r");
}

// evaluate the prepared statement.
rc = sqlite3_step(stmt);
// other successful return codes are possible...
if (rc != SQLITE_DONE) {
    printf("Failed to execute statement: %s\n\r", sqlite3_errstr(rc));
    sqlite3_close(db);
    return 1;
}

// deallocate/finalize the prepared statement when you no longer need it.
// you may also place this in any error handling sections.
sqlite3_finalize(stmt);

...
// close the db when finished.
sqlite3_close(db)
...
// finish your code.

关于C - 如何使用变量作为 SQL 查询的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45840798/

相关文章:

android - 从列中具有逗号分隔值的 Sqlite 中获取数据

c - 如何在C中显示64^5的值?

c - DEoptim 在 R 中似乎卡住

c - char 数组初始值设定项错误中元素过多

c - SQLite - 找到某个值并找到该行输入值出现的另一列上的最高值,然后选择该行上的所有元素

android - 如何在 Android SQLite 和 SQL Server 之间进行双向同步

mysql - 如何使用多个最昂贵的项目在 sql 中查找最昂贵的项目?

ios - SQLite 外部内容 FTS 每次都需要重建?

c++ - 尝试更改结构 C/C++ 中的字符串时出现 SIGSEGV

c - 为什么会触发 BUG_ON(!in_nmi())?