首先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——