使用 C 操作 MySQL 时的转义

翻阅了一下文档,C 的 API 操作 MySQL 的时候没有参数化查询的接口,于是就简单的做一个转义,其实照着官方文档,很简单,直接附上代码

#include <stdio.h>
#include <Windows.h>
#include "mysql.h"

#define TMP_SIZE 256
#define T_SIZE 1024
#define QUERY_SIZE 4096

int insert_record() {
	// define consts
	const char db_user[] = "root";
	const char db_pwd[] = "root";
	const char db_host[] = "localhost";
	const char db_name[] = "twitter";
	unsigned int db_port = 3306;

	// define mysql vars
	MYSQL mysql;
	MYSQL_RES *mysql_res;
	MYSQL_ROW mysql_row;
	MYSQL_FIELD *mysql_field;
	char tmp[TMP_SIZE][TMP_SIZE];

	mysql_init(&mysql);
	if (mysql_real_connect(&mysql, db_host, db_user, db_pwd,
		db_name, db_port, NULL, 0) == NULL) {
			printf("connect failed: %s\n", mysql_error(&mysql));
			return -1;
	}
	mysql_set_character_set(&mysql, "utf8");

	FILE *file = fopen(
		"C:/tweets2009-06.txt", "r");
	char t_escape[T_SIZE], t_user[T_SIZE], 
		t_content[T_SIZE], t_time[T_SIZE];
	// read the total count line
	fgets(t_escape, T_SIZE, file);
	printf("%s\n", t_escape);	

	for (long long i=0; i<10000; i++) {
		// time line
		fgets(t_escape, T_SIZE, file);
		mysql_real_escape_string(&mysql, t_time, 
			t_escape+2, strlen(t_escape)-3);
		// user link line
		fgets(t_escape, T_SIZE, file);
		mysql_real_escape_string(&mysql, t_user, 
			t_escape+21, strlen(t_escape)-22);
		// content line
		fgets(t_escape, T_SIZE, file);
		mysql_real_escape_string(&mysql, t_content, 
			t_escape+2, strlen(t_escape)-3);
		// empty line
		fgets(t_escape, T_SIZE, file);

		char query[QUERY_SIZE] = {0};
		sprintf(query,
			"insert into t (user, content, time) \
			values ('%s', '%s', '%s')",
			t_user, t_content, t_time);
		//printf("%s\n", query);
		
		if (mysql_query(&mysql, query) != 0) {
			printf("query failed: %s\n", mysql_error(&mysql));
			mysql_close(&mysql);
			return -1;
		}
	}

	mysql_close(&mysql);
	return 0;
}

int main() {
	insert_record();
	return 0;
}

使用到的函数是这个,http://dev.mysql.com/doc/refma…

Leave a Reply

Your email address will not be published. Required fields are marked *