在C語言中,MySQL數據庫是一種常用的開源關系型數據庫。當我們想要在C語言代碼中與MySQL數據庫進行交互時,常常需要使用參數化查詢。參數化查詢可以防止SQL注入攻擊,同時也可以提高數據庫的性能與穩定性。
下面是一個示例的C語言代碼,使用MySQL庫中提供的參數化查詢函數來與數據庫進行交互。
MYSQL_STMT *stmt = mysql_stmt_init(conn); if (!stmt) { fprintf(stderr, "mysql_stmt_init failed\n"); exit(1); } if (mysql_stmt_prepare(stmt, "SELECT * FROM users WHERE name = ?", strlen("SELECT * FROM users WHERE name = ?")) != 0) { fprintf(stderr, "mysql_stmt_prepare failed\n"); exit(1); } MYSQL_BIND bind[1]; char name_param[32]; memset(bind, 0, sizeof(bind)); memset(name_param, 0, sizeof(name_param)); bind[0].buffer_type = MYSQL_TYPE_STRING; bind[0].buffer = (void *)name_param; bind[0].buffer_length = sizeof(name_param); mysql_stmt_bind_param(stmt, bind); mysql_stmt_execute(stmt); MYSQL_BIND result[2]; char name[32], email[64]; memset(result, 0, sizeof(result)); memset(name, 0, sizeof(name)); memset(email, 0, sizeof(email)); result[0].buffer_type = MYSQL_TYPE_STRING; result[0].buffer = (void *)name; result[0].buffer_length = sizeof(name); result[1].buffer_type = MYSQL_TYPE_STRING; result[1].buffer = (void *)email; result[1].buffer_length = sizeof(email); mysql_stmt_bind_result(stmt, result); while (mysql_stmt_fetch(stmt) == 0) { printf("%s's email address is %s\n", name, email); } mysql_stmt_close(stmt);
在這個示例中,我們首先使用mysql_stmt_init函數初始化一個MYSQL_STMT結構體,并通過mysql_stmt_prepare函數準備一條參數化查詢SQL語句。在SQL語句中,我們將查詢條件用“?”代替,這樣就可以使用后續的MYSQL_BIND結構體對查詢條件進行綁定。在綁定參數時,我們需要設置MYSQL_BIND結構體的buffer_type、buffer和buffer_length屬性,分別表示參數的數據類型、保存參數的內存地址以及參數值的長度。
在綁定完參數后,我們就可以使用mysql_stmt_execute函數執行一條參數化查詢SQL語句。當查詢完成后,我們需要使用mysql_stmt_bind_result函數將查詢結果和MYSQL_BIND結構體進行綁定,以可以讀取查詢結果。和綁定查詢參數時一樣,我們同樣需要設置MYSQL_BIND結構體的buffer_type、buffer和buffer_length屬性,分別表示結果列的數據類型、保存結果數據的內存地址以及結果數據的長度。
最后,在使用mysql_stmt_fetch函數從查詢結果中讀取數據時,我們需要使用MYSQL_STMT結構體中保存的線程句柄來進行多次查詢結果的讀取,直到mysql_stmt_fetch函數返回0時,表示查詢完成。