Linux 环境 C语言 操作MySql 的接口范例

http://www.cnblogs.com/wunaozai/p/3876134.html

 接上一小节,本来是计划这一节用来讲数据库的增删改查,但是在实现的过程中,出现了一点小问题,也不是技术的问题,就是在字符界面上比较不好操作。比如要注册一个帐号,就需要弄个字符界面提示,然后输入数字表示选择,在依次输入信息。(这一点,用C写过什么管理系统就知道,很是麻烦。)考虑到本程序讲的是网络编程,就不弄增删改查了,就判断一个用户名密码是否正确就行了。

  首先是安装mysql和创建数据库,所用到的命令如下:

1 su root  //使用root用户
2 yum install mysql-devel*
3 yum install mysql-server*
4 service mysqld start

  创建一个users数据库和一个client表

复制代码
1 $mysql -u root
2 mysql> create database users; 
3 mysql> use users;    //切换到users数据库中
4 mysql> create table clients(id int,username varchar(32),password varchar(32) ); //创建一个叫test的表
5 mysql> show create table clients;  //显示刚才创建的表信息
6 mysql> select * from clients;   //查询client表中数据
7 mysql> quit
复制代码

  1.插入数据

复制代码
 1 #include <stdio.h>
 2 #include <mysql.h>
 3 #include <stdlib.h>
 4 
 5 #define HOST "localhost"
 6 #define USERNAME "root"
 7 #define PASSWORD ""
 8 #define DATABASE "users"
 9 
10 int main(int argc,char *argv[])
11 {
12     MYSQL conn;
13     int res;
14     char *sql="insert into clients values('1','user1','123456');";
15     mysql_init(&conn);
16 
17     if(mysql_real_connect(&conn,HOST,USERNAME,PASSWORD,DATABASE,0,NULL,CLIENT_FOUND_ROWS))
18     {
19         printf("Connect Success!\n");
20         res=mysql_query(&conn,sql);
21         if(res)
22         {
23             printf("Insert Error!\n");
24         }
25         else
26         {
27             printf("Insert Success!\n");
28         }
29     }
30     else
31     {
32         printf("Connect Failed!\n");
33         exit(-1);
34     }
35     return 0;
36 }
复制代码

  2.删除数据

复制代码
 1 #include <stdio.h>
 2 #include <mysql.h>
 3 #include <stdlib.h>
 4 
 5 #define HOST "localhost"
 6 #define USERNAME "root"
 7 #define PASSWORD ""
 8 #define DATABASE "users"
 9 
10 int main(int argc,char *argv[])
11 {
12     MYSQL conn;
13     int res;
14     char *sql="delete from clients where username=\"user1\";";
15 
16     mysql_init(&conn);
17 
18     if(mysql_real_connect(&conn,HOST,USERNAME,PASSWORD,DATABASE,0,NULL,CLIENT_FOUND_ROWS))
19     {
20         printf("Connect Success!\n");
21         res=mysql_query(&conn,sql);
22         if(res)
23         {
24             printf("Delete Error!\n");
25         }
26         else
27         {
28             printf("Delete Success!\n");
29         }
30     }
31     else
32     {
33         printf("Connect Failed!\n");
34         exit(-1);
35     }
36     return 0;
37 }
复制代码

  3.修改数据

复制代码
 1 #include <stdio.h>
 2 #include <mysql.h>
 3 #include <stdlib.h>
 4 
 5 #define HOST "localhost"
 6 #define USERNAME "root"
 7 #define PASSWORD ""
 8 #define DATABASE "users"
 9 
10 int main(int argc,char *argv[])
11 {
12     MYSQL conn;
13     int res;
14     char *sql="update clients set username=\"user2\" where username=\"user1\";";
15     mysql_init(&conn);
16 
17     if(mysql_real_connect(&conn,HOST,USERNAME,PASSWORD,DATABASE,0,NULL,CLIENT_FOUND_ROWS))
18     {
19         printf("Connect Success!\n");
20         res=mysql_query(&conn,sql);
21         if(res)
22         {
23             printf("Update Error!\n");
24         }
25         else
26         {
27             printf("Update Success!\n");
28         }
29     }
30     else
31     {
32         printf("Connect Failed!\n");
33         exit(-1);
34     }
35     return 0;
36 }
复制代码

  4.查询数据

复制代码
 1 #include <stdio.h>
 2 #include <mysql.h>
 3 #include <stdlib.h>
 4 
 5 #define HOST "localhost"
 6 #define USERNAME "root"
 7 #define PASSWORD ""
 8 #define DATABASE "users"
 9 
10 int main(int argc,char *argv[])
11 {
12     MYSQL conn;
13     MYSQL_RES *res_ptr;//指向查询结果的指针
14     MYSQL_FIELD *field;//字段结构体指针
15     MYSQL_ROW result_row;//按行返回的查询信息
16 
17     int res;
18     int i,j;
19     int row,column;//查询返回的行数和列数
20     char *sql="select * from clients;";
21     mysql_init(&conn);
22 
23 
24     if(mysql_real_connect(&conn,HOST,USERNAME,PASSWORD,DATABASE,0,NULL,CLIENT_FOUND_ROWS))
25     {
26         printf("Connect Success!\n");
27         res=mysql_query(&conn,sql);
28         //res=0表示查询成功
29         if(res)
30         {
31             printf("Select Error!\n");
32         }
33         else
34         {
35             printf("Select Success!\n");
36             //将查询的结果给res_ptr
37             res_ptr=mysql_store_result(&conn);
38             //如果结果不为空,就可以输出了
39             if(res_ptr)//可以用这个的真假来判断用户名密码是否正确
40             {
41                 //有结果了
42                 column=mysql_num_fields(res_ptr);//获取列数
43                 row=mysql_num_rows(res_ptr)+1;//加1是因为第一行是字段名
44                 printf("查询到的数据有 %d 行\n",row);
45 
46                 //输出结果的字段名
47                 for(i=0;field=mysql_fetch_field(res_ptr);i++)
48                 {
49                     printf("%s\t",field->name);
50                 }
51                 printf("\n");
52                 //按行输出结果
53                 for(i=1;i<row;i++)
54                 {
55                     result_row=mysql_fetch_row(res_ptr);
56                     for(j=0;j<column;j++)
57                     {
58                         printf("%s\t",result_row[j]);
59                     }
60                     printf("\n");
61                 }
62             }
63             else
64             {
65                 //没有结果
66                 printf("没有查询到匹配的数据。");
67             }
68         }
69     }
70     else
71     {
72         printf("Connect Failed!\n");
73         exit(-1);
74     }
75     mysql_close(&conn);
76     return 0;
77 }
复制代码

  对应的makefile

1 main:
2         gcc insert.c `mysql_config --cflags --libs` -o insert
3         gcc delete.c `mysql_config --cflags --libs` -o delete
4         gcc update.c `mysql_config --cflags --libs` -o update
5         gcc select.c `mysql_config --cflags --libs` -o select

  由于本次的重点不是数据库的操作,所以就简单的给出常用的基本方法,在我们的聊天程序中只加入查询用户密码的功能,其他的如注册用户什么的就不写了,应该没有什么难度,就是有点烦。

  加入数据库连接后的聊天程序

  client.c 不变

  server.c 修改如下

复制代码
  ... 
 17 #include <mysql.h>//用于mysql连接
 18 ... 
37
38 void print_time(char * ch,time_t *now) 39 { 40 struct tm*stm; 41 stm=localtime(now);//立即获取当前时间 42 sprintf(ch,"%02d:%02d:%02d\n",stm->tm_hour,stm->tm_min,stm->tm_sec); 43 } 44 45 int mysql_check_login(struct user su) 46 { 47 MYSQL conn; 48 MYSQL_RES *res_ptr; 49 int res; 50 int row; 51 char sql[256]={0}; 52 strcpy(sql,"select * from clients where username=\""); 53 strcat(sql,su.name); 54 strcat(sql,"\" and password=\""); 55 strcat(sql,su.pwd); 56 strcat(sql,"\";"); 57 printf("查询的sql:%s\n",sql); 58 59 mysql_init(&conn); 60 if(mysql_real_connect(&conn,"localhost","root","","users",0,NULL,CLIENT_FOUND_ROWS)) 61 { 62 res=mysql_query(&conn,sql); 63 if(res) 64 { 65 perror("Select SQL Error!\n"); 66 exit(-1); 67 } 68 else 69 { 70 res_ptr=mysql_store_result(&conn); 71 if(res_ptr) 72 { 73 row=mysql_num_rows(res_ptr); 74 if(row==0) 75 return 0; 76 return 1;//1表示验证成功 77 } 78 else 79 { 80 return 0;//0表示验证失败 81 } 82 } 83 } 84 else 85 { 86 perror("Database Connect Failed!"); 87 exit(-1); 88 } 89 mysql_close(&conn); 90 return 0; 91 } 92 93 int main(int argc,char *argv[]) 94 {...
110 struct timeval timeout; 111 struct user use; 112 time_t now; struct tm *timenow; 113 ... 168 while(1) 169 {... 174 switch(select(max_servfd+1,&servfd,NULL,NULL,&timeout)) 175 { 176 case -1: 177 perror("select error"); 178 break; 179 case 0: 180 break; 181 default: 182 //printf("has datas to offer accept\n"); 183 if(FD_ISSET(sockfd,&servfd))//sockfd 有数据表示可以进行accept 184 {   ...
200 printf("客户端发来的用户名是:%s,密码:%s\n",use.name,use.pwd); 201 memset(recvBuf,0,sizeof(recvBuf)); 202 if(mysql_check_login(use)) 203 { 204 printf("验证成功!\n"); 205 strcpy(sendBuf,"yes"); 206 } 207 else 208 { 209 printf("验证失败!\n"); 210 strcpy(sendBuf,"no"); 211 } 212 if((sendSize=send(clientfd,sendBuf,MAX_DATA_SIZE,0))==-1) 213 { 214 perror("fail to receive datas"); 215 }...
221 } 222 break; 223 } 224 //FD_COPY(recvfd,servfd); 225 for(i=0;i<MAX_CON_NO;i++)//最大队列进行判断,优化的话,可以使用链表 226 {...
231 } 232 233 switch(select(max_recvfd+1,&recvfd,NULL,NULL,&timeout)) 234 {...
288 } 289 } 290 return 0; 291 }
复制代码

   本次就增加了一个mysql_check_login这个函数用于用户名和密码的判断。也没有加入太多的功能。只要有个大概思路就可以了,剩下的注册和修改基本相似,就不加入到程序中了。

  接下来还是老规矩,上一张运行时的截图

  数据库中的用户名是user1,密码是123456。看,完成了验证了。顿时感觉好极了。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384168.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二进制逻辑运算符有关练习题

//1.写一个函数返回参数二进制中 1 的个数 #include<stdio.h> int div 0; //除数 int rem 0; //余数 int count 0; //计1 int count_one_bits(unsigned int div) {int con 0; //商while (div > 1){con div / 2;rem div % 2;div con;if (1 rem){count;}}…

Catch That Cow——BFS

【题目描述】 Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer Jo…

利用mysql提供的c语言接口操作数据库

http://blog.csdn.net/bladeandmaster88/article/details/52980872 //1.工程要在c/c->常规->附加包含目录添加mysql.h的路径D:\mysql5.5\include //2.工程要在链接器->常规->附加库目录添加libmysql.lib的路径D:\mysql5.5\lib #include <WinSock2.h>/…

数组相关运算

数组的初始化 数组及指针在内存中的存储 一维数组在内存中的存储 有关数组的运算 //一维数组 int a[] {1,2,3,4}; printf("%d\n",sizeof(a));//16这里的a表示的是整个数组,计算出的是整个数组的大小,单位为byte printf("%d\n",sizeof(a 0));/*a没有单独…

Find The Multiple——简单搜索+大胆尝试

【题目描述】 Given a positive integer n, write a program to find out a nonzero multiple m of n whose decimal representation contains only the digits 0 and 1. You may assume that n is not greater than 200 and there is a corresponding m containing no more t…

C语言操作MYSQL小例子

http://blog.csdn.net/small_qch/article/details/8180678 初学使用用C语言操作MYSQL&#xff0c;写了个小例子&#xff0c;帖上来献丢人一下&#xff0c;呵呵。 程序很简单&#xff0c;先连接数据库&#xff0c;然后向class1表中插入一条数据&#xff0c;最后获取并输出整个cl…

Find a way——BFS

【题目描述】 Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Ningbo one year, yifenfei have many people to meet. Especially a good friend Merceki. Yifenfei’s home is at the countryside, but Merceki’s home is in the ce…

用C语言操作MySQL数据库

http://blog.chinaunix.net/uid-26743670-id-3479887.html 参考MYSQL的帮助文档整理 这里归纳了C API可使用的函数&#xff0c;并在下一节详细介绍了它们。请参见25.2.3节&#xff0c;“C API函数描述”。 函数 描述 mysql_affected_rows() 返回上次UPDATE、DELETE或INSERT查…

三字棋

整个游戏可以分为以下几个环节 1.打印一个玩游戏的菜单 2.玩游戏 (1)玩家走一步 (2)电脑走一步 每走一步对结果进行显示,其中游戏的结果可分为玩家赢,电脑赢,以及平局 代码显示如下 game.c #define _CRT_SECURE_NO_WARNINGS 1 #include<stdlib.h> #include<stdio.h&…

gets fgets 区别

http://www.cnblogs.com/aexin/p/3908003.html 1. gets与fgets gets函数原型&#xff1a;char*gets(char*buffer);//读取字符到数组&#xff1a;gets(str);str为数组名。 gets函数功能&#xff1a;从键盘上输入字符&#xff0c;直至接受到换行符或EOF时停止&#xff0c;并将读取…

Fliptile——搜索+二进制优化

【题目描述】 Farmer John knows that an intellectually satisfied cow is a happy cow who will give more milk. He has arranged a brainy activity for cows in which they manipulate an M N grid (1 ≤ M ≤ 15; 1 ≤ N ≤ 15) of square tiles, each of which is col…

扫雷

1.将扫雷界面看成一个二维数组,先对界面进行打印 2.置雷 3.排雷 4.对每次的结果进行游戏输出 5.提醒用户游戏输赢 game.c #define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" //初始化 void init_board(char mine[ROWS][COLS], int rows, int cols, char set) {in…

C相关练习题

1.调整数组使奇数全部都位于偶数前面。 输入一个整数数组&#xff0c;实现一个函数&#xff0c;来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分&#xff0c;所有偶数位于数组的后半部分。 #include<stdio.h> void range(int arr[], int sz) {int left…

【C语言】单链表的所有操作的实现(包括PopBack、PushBack、PopFront、PushFront、Insert)

http://blog.csdn.net/hanjing_1995/article/details/51539563 [cpp] view plaincopy #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; //单链表的实现 #include<assert.h> typedef int DataType; typedef…

Shuffle'm Up——简单模拟

【题目描述】 A common pastime for poker players at a poker table is to shuffle stacks of chips. Shuffling chips is performed by starting with two stacks of poker chips, S1 and S2, each stack containing C chips. Each stack may contain chips of several diff…

C++ explicit关键字详解

http://www.cnblogs.com/ymy124/p/3632634.html 首先, C中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式). 那么显示声…

Fire!——两个BFS

【题目描述】 【题目分析】 看到题目后很清楚是两个BFS&#xff0c;可是我觉得对于火的BFS可以转换成判断&#xff0c;我的做法是将火的位置全部记录下来&#xff0c;然后判断某个位置距离每个火的步数是否小于当前步数&#xff0c;可是错了&#xff0c;还不清楚为什么&#x…

函数调用过程(栈桢)

栈桢 首先来看一段代码 #include<stdio.h> int add(int x, int y) {int z x y;return z; } int main() {int a 10;int b 20;int ret add(a, b);printf("ret %d\n",ret);return 0; } 此处是为了给a,b分别开辟空间,这时栈桢如图所示 两条push命令将a,b变…

C++智能指针简单剖析

http://blog.csdn.net/lanxuezaipiao/article/details/41603883 导读 最近在补看《C Primer Plus》第六版&#xff0c;这的确是本好书&#xff0c;其中关于智能指针的章节解析的非常清晰&#xff0c;一解我以前的多处困惑。C面试过程中&#xff0c;很多面试官都喜欢问智能指针相…

非常可乐——BFS

【题目描述】 大家一定觉的运动以后喝可乐是一件很惬意的事情&#xff0c;但是seeyou却不这么认为。因为每次当seeyou买了可乐以后&#xff0c;阿牛就要求和seeyou一起分享这一瓶可乐&#xff0c;而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子&#xff0c;它们的容…