首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 連接 MySQL:如何將變量安全插入數據庫(防 SQL 注入)

     編輯:程式設計疑難解答

問題場景

使用 C++ 操作 MySQL 時,需將用戶輸入的變量(id、name、age 等)插入數據表。初學者常直接拼接 SQL 字符串,導致語法錯誤或安全隱患。

錯誤示範

// 錯誤:直接在 SQL 中寫變量名,不會被解析
mysql_query(&myCont, "INSERT INTO `i` (`id`, `name`) VALUES (id, 'name')");

正確方案:參數化查詢(預處理語句)

強烈建議使用 MYSQL_STMT 預處理語句,而非字符串拼接。這樣能自動處理轉義、防止 SQL 注入,且代碼更清晰。

核心步驟

  1. 準備 SQL 模板:INSERT INTO `i` (`id`, `name`, `age`, `subject`, `score`) VALUES (?, ?, ?, ?, ?)
  2. 初始化 MYSQL_STMT,綁定參數(mysql_stmt_bind_param)。
  3. 循環賦值變量,調用 mysql_stmt_execute 執行。

關鍵代碼片段

MYSQL_STMT *stmt = mysql_stmt_init(&myCont);
const char *query = "INSERT INTO `i` (`id`, `name`, `age`, `subject`, `score`) VALUES (?, ?, ?, ?, ?)";
mysql_stmt_prepare(stmt, query, strlen(query));

// 綁定參數
MYSQL_BIND bind[5];
memset(bind, 0, sizeof(bind));
// ... 為每個參數設置 buffer_type, buffer, is_null 等 ...
mysql_stmt_bind_param(stmt, bind);

for (int i = 1; i <= n; i++) {
    // 獲取用戶輸入到 id, name, age, subject, score 變量
    // 更新 bind 中的 buffer 指向這些變量
    mysql_stmt_execute(stmt);
}
mysql_stmt_close(stmt);

為何不推薦字符串拼接?

  • 需手動處理引號轉義(mysql_real_escape_string),易出錯。
  • 字符串拼接效率低,無法利用數據庫解析緩存。
  • 極高風險導致 SQL 注入漏洞。

掌握預處理語句是 C/C++ 數據庫開發的必備技能,請務必養成習慣。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved