忽略 API 回傳值會導致靜默失敗,除錯極度困難。MySQL C API 兩類回傳慣例:
mysql_init()、mysql_real_connect())。mysql_error():人類可讀錯誤字串(優先顯示給用戶)。mysql_errno():數值錯誤碼(供程式邏輯判斷)。#include
#include
#include
#define HOST "localhost"
#define USER "root"
#define PASS "secret"
#define DB "test"
int main() {
MYSQL *conn = mysql_init(NULL);
if (!conn) {
fprintf(stderr, "mysql_init() failed\n");
return EXIT_FAILURE;
}
if (!mysql_real_connect(conn, HOST, USER, PASS, DB, 0, NULL, 0)) {
fprintf(stderr, "Connection failed: %s (errno=%d)\n",
mysql_error(conn), mysql_errno(conn));
return EXIT_FAILURE;
}
printf("Connected successfully\n");
mysql_close(conn);
return EXIT_SUCCESS;
}
Access denied:檢查主機/用戶/密碼、mysql.user 權限表、skip-grant-tables 是否誤開。strings 指令即可提取),改用配置檔、環境變數或命令列參數運行時注入。透過 argc/argv、getopt()、配置檔解析(my_print_defaults)動態獲取連線資訊,實現安全部署。