Ubuntu下使用C语言和MySQL模拟一个银行管理系统

首先MySQL基础语法就不说了就增删改查,网上一找一大堆。API函数在MySQL官网上面都有。下面会主要介绍几个常用的。
MYSQL C语言API

1、云服务器选择

我选择的是腾讯云服务器,学生认证后很便宜,一年才90多人民币。
3月起租才27RMB。如果同时用腾讯云服务器的小伙伴注意咯,购买时候选择的是Ubuntu18.04的,但是不知道怎么回事,默认的c/c++开发环境是用不了的,测试你会发现提示找不到函数头文件。解决方法:
删除gcc安装和配置文件。

sudo apt-get --purge remove gcc

重新安装

sudo apt-get install gcc

一般上述操作执行完就行了,g++同理。

2、MySQL的安装

1.服务器的安装:
sudo apt-get install mysql-server
2、客户端的安装
sudo apt-get install mysql-client
3.  开发包的安装
sudo apt-get install libmysqlclient-dev

注意在安装的时候会有账户和密码的确认,但是xhsell连接服务器没有界面,所以直接enter跳过就行,Ubuntu下安装的时候要注意。
在这里插入图片描述
这个地方填写你的密码就行了。
安装完成检测一下:
ps:MySQL要以root身份运行

netstat -tap | grep mysql

在这里插入图片描述
服务器端安装方法就是同上一样,除了密码确认。默认是你的root和root密码,密码不是root密码的话就123456试一下。

启用MySQL:

service mysql start

进入MySQL:

mysql -u 用户名(root) -p 

在这里插入图片描述
简单测试一下:
在这里插入图片描述
修改配置
在这里插入图片描述

#号注释掉只能本地连接,允许网络连接
在这里插入图片描述
进入MySQL设置用户访问权限:
这部分我试了好几次没成功,网上找了一个大佬写的博客成功了。
grant all privileges on *.* to root@"%" identified by "password" with grant option;

.:第一个代表数据库名;第二个代表表名。这里的意思是所有数据库里的所有表都授权给用户

root:授予root账号

“%”:表示授权的用户IP可以指定,这里代表任意的IP地址都能访问MySQL数据库。

“password”:分配账号对应的密码,这里密码自己替换成你的mysql root帐号密码。

flush privileges;
刷新权限信息,也即是让我们所作的设置马上生效。

在这里插入图片描述
测试:
在这里插入图片描述
重启MySQL服务/etc/init.d/mysql restart
在这里插入图片描述
连接成功
下面讲一些常用的API函数:

函数头文件:#include "mysql.h"
			/usr/include/mysql 头文件路径
			-lmysqlclient //这个库路径是已经在系统变量中了
函数原型:
	MYSQL *mysql_real_connect(
			MYSQL *mysql, 
			const char *host, 
			const char *user, 
			const char *passwd, 
			const char *db, 
			unsigned int port, 
			const char *unix_socket, 
			unsigned long client_flag
			)
函数参数:
	mysql : 数据库需要的结构体 需要用 mysql_init(&mysql);//初始化数据库结构体
			这个结构体不需要了解 
			你只需要申请一个变量取地址给函数传进去即可了
			相当于 FILE * 指针  回头给后续函数用的东西
	host  :主机名 --- "localhost" NULL
	user  : "root"  用户名
	passwd: "1"    密码
	db    : 数据库的名字 "my_data"
	port  : 端口号--负责网络连接数据库的时候需要提供的
			不需要提供直接填 0即可
	unix_socket :网络套接字 也不需要提供 填 NULL即可
	client_flag :直接 填  0
/**********************************************************************/
函数功能:操作数据库的函数,相当于之前见过system()
函数头文件 :"mysql.h"
函数原型:
		int mysql_query(MYSQL *mysql, const char *query) 
函数参数:	
		mysql:连接成功后返回的数据库句柄
		
		query :数据的指令
函数返回值:
			0  成功
			-1 失败

		
/********************************************************************/
函数功能:关闭数据库的连接
函数头文件:#include "mysql.h"
函数原型:	
	void mysql_close(MYSQL *mysql) 
函数参数:		
	连接函数返回的数据库结构体句柄
函数返回值:	
		空
/******************************************************************/
如何查看数据库返回的信息?
函数功能:专门查看数据库返回的信息的
函数原型:	
		MYSQL_RES *mysql_store_result(MYSQL *mysql)
函数参数:
		MYSQL *mysql : 数据库句柄
函数返回值:
		把数据库操作返回的内容存到 MYSQL_RES *  结构体里面

/********************************************************************/
函数功能:通过数据返回的结构体得到内容的行和列
函数原型:	unsigned int mysql_num_fields(MYSQL_RES* res) // 列
			my_ulonglong mysql_num_rows(MYSQL_RES *result) //行
函数参数:
	result : 数据库返回信息的结构体
函数返回值:
		返回的就是行和列
/***********************************************************************/
函数功能:得到返回信息的下一行整行信息
函数原型:	MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
函数参数:	
		result : 数据库返回信息的结构体
函数返回值:	
		就是这一行内容的双重指针char ** 
						这样一行内容的指针数组

数据库示例:
我的ip地址是服务器ip就给屏蔽了哈

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "unistd.h"
#include "fcntl.h"
#include "sys/types.h"
#include "mysql.h"
#include "stdint.h"
int main(void)
{
    MYSQL mysql;
    MYSQL * mysql_con=NULL;
    my_ulonglong row;
    unsigned int columns;
    MYSQL_RES * mysql_rel;
    MYSQL_ROW row_str;
    MYSQL_FIELD * columns_name;
    //初始化数据库结构体
    mysql_init(&mysql);
    //连接数据库
    mysql_con=mysql_real_connect(&mysql,"****.****.****.****","root","123456","jason_data",3306,NULL,0);
    if(mysql_con==NULL)
    {
        perror("mysql_real_connect");
        return 0;
    }
    printf("数据库jason_data连接成功\n");

    mysql_query(mysql_con,"select * from jason");
    //获得数据库查询到的信息
    mysql_rel=mysql_store_result(mysql_con);
    //根据数据库查询的信息获取行号
    row=mysql_num_rows(mysql_rel);
    //根据数据库查询的消息获得列号
    columns=mysql_num_fields(mysql_rel);
    printf("jason表的行号为:%lld \n",row);
    printf("jason表的列号为:%d \n",columns);
    for(int k=0;k<columns;k++)
    {
        columns_name=mysql_fetch_field(mysql_rel);
        printf("%-8s\t",columns_name->name);
    }
    printf("\n");
    for(int i=0;i<row;i++)
    {
        //检索表的下一行
        row_str=mysql_fetch_row(mysql_rel);
        for(int j=0;j<columns;j++)
        {
         
            
               printf("%-8s\t",row_str[j]); 
            
            
        }
        printf("\n");
    }
    mysql_free_result(mysql_rel);
    mysql_close(mysql_con);
   return 0;

}

在这里插入图片描述

3、数据库实战

模拟银行管理系统,用户开户,登陆,查询余额,转账等。
数据库端在腾讯云服务器。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysql.h>
#include <unistd.h>
#include <sys/types.h>
char name[20]={0};
char tel[20]={0};
char passwd[20]={0};
char log_tel[200]={0};//登录tel
char log_passwd[200]={0};//登录密码
char myself_money[1024]={0};
char trans_dol[20]={0};
int log_in(void);
int menu(void);
int balance(void);//余额查询
int sava(void);//存钱
int transfer(void);//转账
int main(void)
{

   if(log_in())
   {
    menu();
   }
   return 0;
}
int log_in(void)
{
    while(1)
    {
        int n=0;
        char passwd_verify[20]={0};
        char mysql_buf[200]={0};
        MYSQL mysql;
        MYSQL * mysql_con=NULL;//连接数据库返回值
        my_ulonglong row=0;//查询行号
        unsigned int columns=0;//查询列号
        MYSQL_RES * mysql_rel=NULL;//数据库查询状态
        MYSQL_ROW row_str=NULL;//检索表下一行
        MYSQL_FIELD * columns_name=NULL;//列名
        printf("     Welcome to Jason Banking System        \n");
        printf("********************************************\n");
        printf("      开户[1]               登录[2]           \n");
        printf("                 退出[0]                   \n "); 
        scanf("%d",&n);  
        if(n==1)
        {
            int passwd_flag=0;
            printf("请输入您的真实姓名\n");
            scanf("%s",name);
            getchar();
            printf("请输入您的电话号码\n");
            scanf("%s",tel);
            getchar();
            while (1)
            {
                printf("请输入您的密码\n");
                scanf("%s",passwd);
                getchar();
                printf("请再次输入您的密码\n");
                scanf("%s",passwd_verify);
                getchar();
                if(strcmp(passwd,passwd_verify)!=0)
                {
                    printf("您输入的两次密码不相同,请重新输入\n");
                    memset(passwd,0,sizeof(passwd));
                    memset(passwd_verify,0,sizeof(passwd_verify));
                    continue;
                }
                else
                {
                    break;
                }
                

            }
              //初始化数据库结构体
             mysql_init(&mysql);
              //连接数据库
             mysql_con=mysql_real_connect(&mysql,"***.***.***.***","root","123456","jason_data",3306,NULL,0);
            if(mysql_con==NULL)
            {
                perror("mysql_real_connect");
                return 0;
            }
             //将数据插入数据库
            sprintf(mysql_buf,"insert into bank_list values(\"%s\",\"%s\",\"%s\",\"0\");",name,tel,passwd);
            int flag=mysql_query(mysql_con,mysql_buf);
            if(flag==0)
            {
                printf("开户成功,可登录\n");
                sleep(1);
                //mysql_free_result(mysql_rel);
                //mysql_close(mysql_con);
                system("clear");
                continue;
                
            }
            
        }
        else if (n==2)
        {
          while(1)
          {
            int tel_flag;
            int wd_flag;
            MYSQL mysql;
            MYSQL * mysql_con=NULL;//连接数据库返回值
            my_ulonglong row=0;//查询行号
            unsigned int columns=0;//查询列号
            MYSQL_RES * mysql_rel=NULL;//数据库查询状态
            MYSQL_ROW row_str=NULL;//检索表下一行
            MYSQL_FIELD * columns_name=NULL;//列名
            memset(log_tel,0,sizeof(log_tel));
            memset(log_passwd,0,sizeof(log_passwd));
            printf("请输入您的tel\n");
            scanf("%s",log_tel);
            getchar();
            printf("请输入您的passwd\n");
            scanf("%s",log_passwd);
            getchar();
            //初始化数据库结构体
             mysql_init(&mysql);
              //连接数据库
             mysql_con=mysql_real_connect(&mysql,"***.***.***.***","root","123456","jason_data",3306,NULL,0);
            if(mysql_con==NULL)
            {
                perror("mysql_real_connect");
                return 0;
            }
            mysql_query(mysql_con,"select tel,passwd from bank_list");
            //获得数据库查询到的信息
            mysql_rel=mysql_store_result(mysql_con);
            //根据数据库查询的信息获取行号
            row=mysql_num_rows(mysql_rel);
            //根据数据库查询的消息获得列号
            columns=mysql_num_fields(mysql_rel);
            for(int i=0;i<row;i++)
            {
              //检索表的下一行
              row_str=mysql_fetch_row(mysql_rel);
              for(int j=0;j<columns;j++)
              {
                  if(j==0)
                  {
                     tel_flag=strcmp(log_tel,row_str[j]);
                  }
                  if(j==1)
                  {
                     wd_flag=strcmp(log_passwd,row_str[j]);
                  }
                  if((tel_flag==0)&&(wd_flag==0))
                  {
                      break;
                  }

              }
              if(tel_flag==0)
              {
                  break;
              }

            }
            if((tel_flag==0)&&(wd_flag==0))
            {
                printf("登录成功\n");
                sleep(1);
                system("clear");
                return 1;
            }
            else
            {
                printf("帐号或者密码错误,请重新输入\n");
                printf("重新输入[1]      退出请输入[0]\n");
                int p;
                scanf("%d",&p);
                getchar();
                if(p==0)
                {
                    return 0;
                }
                else
                {
                sleep(1);
                system("clear");
                continue;                    
                }
        
            }
            

          }
       

        }
        else
        {
            return 0;
        }
        


    }
     
}
int menu(void)
{
    while(1)
    {
      int n=0; 
      printf("****************************************\n");
      printf("     余额查询[1]        现金存入[2]        \n");
      printf("     转账[3]            退出[0]           \n");
      scanf("%d",&n);
      getchar();
      if(n==1)
      {
          balance();
      }
      else if (n==2)
      {
          sava();
      }
      else if (n==3)
      {
          transfer();
      }
      else if (n==0)
      {
          system("clear");
          printf("     *************************\n");
          printf("     *        Bey-Bey        *\n");
          printf("     *************************\n");
          return 0;
      }
      else
      {
          printf("输入错误请重新输入\n");
      }
           
    }


}
int balance(void)
{
    MYSQL mysql;
    MYSQL * mysql_con=NULL;//连接数据库返回值
    my_ulonglong row=0;//查询行号
    unsigned int columns=0;//查询列号
    MYSQL_RES * mysql_rel=NULL;//数据库查询状态
    MYSQL_ROW row_str=NULL;//检索表下一行
    MYSQL_FIELD * columns_name=NULL;//列名
    char buff[300]={0};
    memset(myself_money,0,sizeof(myself_money));
    //初始化数据库结构体
    mysql_init(&mysql);
    //连接数据库
    mysql_con=mysql_real_connect(&mysql,"***.***.***.***","root","123456","jason_data",3306,NULL,0);
    if(mysql_con==NULL)
    {
        perror("mysql_real_connect");
        return 0;
    }
    sprintf(buff,"select name,money from bank_list where tel = \"%s\";",log_tel);
    mysql_query(mysql_con,buff);
    //获得数据库查询到的信息
    mysql_rel=mysql_store_result(mysql_con);
    //根据数据库查询的信息获取行号
    row=mysql_num_rows(mysql_rel);
    //根据数据库查询的消息获得列号
    columns=mysql_num_fields(mysql_rel);
    for(int i=0;i<row;i++)
    {
        //检索表的下一行
        row_str=mysql_fetch_row(mysql_rel);
        for(int j=0;j<columns;j++)
        {
            if(j==0)
            {
                printf("尊敬的用户:%s  ",row_str[j]);
            }
            if(j==1)
            {
                printf("您的余额为: %s\n",row_str[j]);
                strcpy(myself_money,row_str[j]);
            }

        }

            
    }
    mysql_free_result(mysql_rel);
    mysql_close(mysql_con);

}
int sava(void)
{
    MYSQL mysql;
    MYSQL * mysql_con=NULL;//连接数据库返回值
    my_ulonglong row=0;//查询行号
    unsigned int columns=0;//查询列号
    MYSQL_RES * mysql_rel=NULL;//数据库查询状态
    MYSQL_ROW row_str=NULL;//检索表下一行
    MYSQL_FIELD * columns_name=NULL;//列名
    double money=0;
    char buff[300]={0};
    printf("请输入您需要存入的金额\n");
    scanf("%lf",&money);
    getchar();
    //初始化数据库结构体
    mysql_init(&mysql);
    //连接数据库
    mysql_con=mysql_real_connect(&mysql,"***.***.***.***","root","123456","jason_data",3306,NULL,0);
    if(mysql_con==NULL)
    {
        perror("mysql_real_connect");
        return 0;
    }
    sprintf(buff,"select money from bank_list where tel = \"%s\";",log_tel);
    mysql_query(mysql_con,buff);
    //获得数据库查询到的信息
    mysql_rel=mysql_store_result(mysql_con);
    //根据数据库查询的信息获取行号
    row=mysql_num_rows(mysql_rel);
    //根据数据库查询的消息获得列号
    columns=mysql_num_fields(mysql_rel);
    memset(buff,0,sizeof(buff));
    for(int i=0;i<row;i++)
    {

        //检索表的下一行
        row_str=mysql_fetch_row(mysql_rel);
        for(int j=0;j<columns;j++)
        {
             strcpy(buff,row_str[j]);
        }
            
    }
    double a=0;
    char sum[30]={0};
    //a=atoi(buff);//字符串转整数
    a=atof(buff);
    a=a+money;//最终金额
    sprintf(sum,"%lf",a);//整数转字符串
    memset(buff,0,sizeof(buff));
    sprintf(buff,"update bank_list set money = \"%s\" where tel=\"%s\";",sum,log_tel);
    mysql_query(mysql_con,buff);
    printf("%lf元已存入\n",money);
    mysql_free_result(mysql_rel);
    mysql_close(mysql_con);
}
int transfer(void)
{
    int tra_flag=0;
    balance();
    printf("可用余额为%s\n",myself_money);
    MYSQL mysql;
    MYSQL * mysql_con=NULL;//连接数据库返回值
    my_ulonglong row=0;//查询行号
    unsigned int columns=0;//查询列号
    MYSQL_RES * mysql_rel=NULL;//数据库查询状态
    MYSQL_ROW row_str=NULL;//检索表下一行
    MYSQL_FIELD * columns_name=NULL;//列名
    char transfer_tel[20]={0};
    char buf1[200]={0};
    char buf2[200]={0};
    char nuf1[200]={0};
    char nuf2[200]={0};
    printf("请输入对方账户tel\n");
    scanf("%s",transfer_tel);
    getchar();
    //初始化数据库结构体
    mysql_init(&mysql);
    //连接数据库
    mysql_con=mysql_real_connect(&mysql,"***.***.***.***","root","123456","jason_data",3306,NULL,0);
    if(mysql_con==NULL)
    {
        perror("mysql_real_connect");
        return 0;
    }
    mysql_query(mysql_con,"select name,tel,money from bank_list");
    //获得数据库查询到的信息
    mysql_rel=mysql_store_result(mysql_con);
    //根据数据库查询的信息获取行号
    row=mysql_num_rows(mysql_rel);
    //根据数据库查询的消息获得列号
    columns=mysql_num_fields(mysql_rel);
    for(int i=0;i<row;i++)
    {
        //检索表的下一行
        row_str=mysql_fetch_row(mysql_rel);
        for(int j=0;j<columns;j++)
        {
            if(j==1)
            {
                if(strcmp(transfer_tel,row_str[j])==0)
                {
                    printf("转账人:%s 转账人帐号:%s\n",row_str[j-1],row_str[j]);
                    strcpy(trans_dol,row_str[j+1]);
                    tra_flag=1;
                    break;
                }
            }
            

        }
        if(tra_flag==1)
        {
            break;
        }
            
    }
    mysql_free_result(mysql_rel);
    
    if(tra_flag!=1)
    {
        printf("此帐号不存在\n");
        return 0;
    }
    while(1)
    {
        
        double trans_money=0;
        double trans_num=0;
        double num=0;
        double doc_num=0;
        printf("请输入您要转账的金额\n");
        trans_num=atof(myself_money);//自己余额
        doc_num=atof(trans_dol);//转账人余额
        scanf("%lf",&trans_money);
        getchar();
        if(trans_money<=0)
        {
            printf("转账金额不许为0或负数\n");
            sleep(1);
            system("clear");
            continue;
        }
        else if(trans_money>trans_num)
        {
            printf("余额不足无法转账\n");
            sleep(1);
            system("clear");
            continue;
        }
        else
        {
            num=trans_num-trans_money;//余额
            doc_num=doc_num+trans_money;//转账人余额
            sprintf(buf1,"%lf",num);
            sprintf(buf2,"%lf",doc_num);
            sprintf(nuf1,"update bank_list set money = \"%s\" where tel=\"%s\";",buf1,log_tel);
            mysql_query(mysql_con,nuf1);
            sprintf(nuf2,"update bank_list set money = \"%s\" where tel=\"%s\";",buf2,transfer_tel);
            mysql_query(mysql_con,nuf2);
            printf("转账成功\n");
            sleep(1);
            break;
        }
        
        

    }
    mysql_close(mysql_con);

}


运行结果:
在这里插入图片描述
在这里插入图片描述
服务器端数据库:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
写的比较简陋,欢迎交流指正!
——END——

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值