Linux C中md5加密以及mysql简单操作

4 7 月

这段时间准备写个小爬虫来玩玩,开始学习Linux下的程序设计。
考虑到稳定性的原因,优先考虑使用系统自带的库。
md5,使用了openssl/md5.h这个头。自己写了一个md5字符串函数,如下:

#include<openssl/md5.h>
char *md5(char *str)
{
	MD5_CTX ctx;
	unsigned char md[MD5_DIGEST_LENGTH];
	char *result = (char *)malloc(sizeof(char)*(MD5_DIGEST_LENGTH*2+1));
	int i;
	MD5_Init(&ctx);
	MD5_Update(&ctx,(void *)str,strlen(str));
	MD5_Final(md,&ctx);
	for (i=0;i<MD5_DIGEST_LENGTH;i++)
	  sprintf(result+i*2,"%02x",md[i]);
	return result;
}

在编译的时候遇到了个问题,提示连接的时候找不到MD5_Init等,在编译命令中增加-lcrypto,问题解决。

再就是mysql的操作了,我的系统是Fedora,首先安装mysql-devel,即yum install mysql-devel。
然后,自己写了下面3个函数用来操作数据库:

#include<mysql/mysql.h>
typedef MYSQL *PMYSQL;

PMYSQL Mysql_connect()
{
	const char *dbHost = "127.0.0.1";
	const char *dbUser = "root";
	const char *dbPass = "yj61dxjm";
	const char *dbName = "test";
	unsigned dbPort = 3306;
	PMYSQL pmysql = NULL;
	if (!(pmysql = mysql_init(pmysql)))
	{
		fprintf(stderr,"Mysql Server Inited Error!\n");
		return NULL;
	}
	if (!mysql_real_connect(pmysql, dbHost, dbUser, dbPass, dbName, dbPort, NULL, 0))
	{
		fprintf(stderr,"Mysql Connect Failed!\n");
		return NULL;
	}
	if (mysql_query(pmysql, "set names UTF8"))
	{
		fprintf(stderr,"Error%d : %s\n",mysql_errno(pmysql),mysql_error(pmysql));
		return NULL;
	}

	return pmysql;
}

MYSQL_RES * Mysql_query_select(PMYSQL pmysql,char *sql)
{
	MYSQL_RES *res;
	if (mysql_query(pmysql,sql))
	{
		fprintf(stderr,"Error%d : %s\n",mysql_errno(pmysql),mysql_error(pmysql));
		return NULL;
	}

	if (!(res = mysql_store_result(pmysql)))
	{
		fprintf(stderr,"Mysql Store Result Failed!\n");
		return NULL;
	}

	return res;
}

int Mysql_query(PMYSQL pmysql,char *sql)
{
	if (mysql_query(pmysql,sql))
	{
		fprintf(stderr,"Error%d : %s\n",mysql_errno(pmysql),mysql_error(pmysql));
		return 0;
	}
	return 1;
}

其中Mysql_connect()用于连接数据库,Mysql_query()执行无返回值的SQL语句,Mysql_query_select()用于执行有返回值的SQL语句。
下面给出我自己使用这三个函数的例子:

	PMYSQL pmysql;
	MYSQL_RES *res;
	MYSQL_ROW row;
	int i,temp;
	pmysql = Mysql_connect(); //连接数据库

	Mysql_query(pmysql,"insert into urls(website,hash,type,pagerank,links,time,score) values(\"www.baidu.com5\",\"aklsdjflkaj5\",\"0\",\"9\",\"1000\",\"2010-01-01 00:00:00\",\"100\")");//执行insert语句,delete,update用法一样,返回1表示执行成功,返回0表示执行失败。	

	res = Mysql_query_select(pmysql,"select * from urls"); //查询数据库
	for (i=0;i<res->field_count;i++)
	{
		temp = (res->fields[i].max_length>res->fields[i].name_length?res->fields[i].max_length:res->fields[i].name_length);//对比字段名和字段中最长字符串的长度,返回较大值
		sprintf(s,"%%-%ds ",temp);//设置输出格式
		printf(s,res->fields[i].name,res->fields[i].max_length);	//输出表头
	}
	printf("\n");
	while((row = mysql_fetch_row(res))!=0)
	{
		for (i=0;i<res->field_count;i++){
			temp = (res->fields[i].max_length>res->fields[i].name_length?res->fields[i].max_length:res->fields[i].name_length);
			sprintf(s,"%%-%ds ",temp);
			printf(s,row[i]);//输出表内容
		}
		printf("\n");

	}

MYSQL_RES这是非常有用的一个结构,需要了解详细情况的,可以去mysql.h中查看。。
mysql编译的时候,遇到了一些问题。首先是要加编译条件-lmysqlclient,但是,不知道为什么在我的Fedora中提示没有找到mysqlclient库,后来增加了-L/usr/lib/mysql 后成功编译。
即 gcc -o testmysql testmysql.c -Wall -lmysqlclient -L/usr/lib/mysql
当然,mysql库还有很多更加高级的用法,因为我用不到,也就不做研究了。

3 Replies to “Linux C中md5加密以及mysql简单操作

  1. 不好意思,请教个问题:插入用户密码时使用 md5(‘password’)
    可是在command 下执行 select * from users where passwd = md5(‘password’) 返回结果为空。
    这是为什么呢?

    执行:select md5(‘password’) from users;
    得到的结果和在数据库表里看到的是一样的。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注