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

介绍

我正在尝试使用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注入攻击?

C-API提供了sqlite3_prepare_v2sqlite3_bind函数,因此您可以将参数绑定到预准备语句 。 这意味着,您可以使用占位符来替换字符串中的参数。

每个占位符都由索引引用,因此您可以使用任意数量的参数(最多由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.