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

时间:2017-08-23 13:14:16

标签: 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查询中使用变量的材料。我将如何以正确和安全的方式进行此操作,合并变量并且不会使程序易受SQL注入攻击?

1 个答案:

答案 0 :(得分:4)

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

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

有许多函数和方法可以完成参数替换,但为了让您入门,这里是一个将整数绑定到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.