来源于B站的《C语言/C++连接mysql 项目实战+数据库学习入门 》作者:Linux高性能服务器开发
目标:在数据库中建立用户表,游戏地图表,在c++中调用mysql获取数据库中信息,并更新信息
涉及到 :1.mysql数据库制作 2 .c++用户登录功能 3.读取用户信息,地图信息 4。更新用户信息
1.制作数据库 1.1.制作箱子数据库show tables;
create database box;
select database();
use box;
1.2制作玩家用户表
create table user(
id int(11) NOT NULL PRIMARY KEY auto_increment,
username varchar(64) not null unique ,
password varchar(32) not null ,
leve_id int default 1
);
show tables;
insert into user values(1000,'yzy',md5(12345),1);
select *from user;
1.3制作游戏地图表
create table levels(
id int not null primary key default 1,
name varchar(64) not null unique ,
map_row int not null ,
map_col int not null ,
map_data varchar(4096) not null ,
next_map int default 0
);
desc levels;
insert into levels values (1,'牛刀小试',9,12,'0,0,0,0,0,0,0,0,0,0,0,0|0,1,0,1,1,1,1,1,1,1,0,0|0,1,4,1,0,2,1,0,2,1,0,0|
0,1,0,1,0,1,0,0,1,1,1,0|0,1,0,2,0,1,1,4,1,1,1,0|0,1,1,1,0,3,1,1,1,4,1,0|0,1,2,1,1,4,1,1,1,1,1,0|0,1,0,0,1,0,1,1,0,0,1,0|
0,0,0,0,0,0,0,0,0,0,0,0',2);
insert into levels values (2,'牛刀大试',9,12,'0,0,0,0,0,0,0,0,0,0,0,0|0,1,0,1,1,1,1,1,1,1,0,0|0,1,4,1,0,2,1,0,2,1,0,0|
0,1,0,1,0,1,0,0,1,1,1,0|0,1,0,2,0,1,1,4,1,1,1,0|0,1,1,1,0,3,1,1,1,4,1,0|0,1,2,1,1,4,1,1,1,1,1,0|0,1,0,0,1,0,1,1,0,0,1,0|
0,0,0,0,0,0,0,0,0,0,0,0',1);
2.c++调用数据库
2.1项目属性设置
2.1.1在项目-属性-VC++目录-包含目录添加C:\Program Files\MySQL\MySQL Server 8.0\include
2.1.2在项目-属性-VC++目录-库目录添加C:\Program Files\MySQL\MySQL Server 8.0\lib
具体个人路径可在命令行查询 开始右键-运行-cmd-path 查看MySQL Shell 8.0所在绝对路径
2.1.3在连接器-输入 -附加默认项中添加libmysql.lib
2.1.4将C:\Program Files\MySQL\MySQL Server 8.0\lib目录下的libmysql.dll复制到C:\Windows\System32或者项目文件目录下。
2.1.5头文件应用#include
**注意VS使用的平台是64/86!!
3定义表结构体至此c++项目已连接到mysql库
3.1定义用户表结构体
typedef struct _userinfo {
int id;
string username;
string password;
int level_id;
}userinfo;
///
//
struct userinfo {
int id;
string username;
string password;
int level_id;
};
推荐第一种定义方式
3.2定义地图结构体
typedef struct _levelinfo {
int id;
string name;
int map_row;
int map_column;
string map_data;
int next_level;
}levelinfo;
3.3其余头文件宏定义与函数
using namespace std;
#define DB_name "box"
#define DB_host "127.0.0.1"
#define DB_port 3306
#define DB_user "root"
#define DB_user_password "5965424"
#define MAX_LOGIN_TIMES 4
//用户登录
bool logi(userinfo &user);
//连接数据库
bool connectsql(MYSQL& mysql);
//获取地图信息
bool getmap(levelinfo &map, int mapid);
//更新用户信息
bool updata(userinfo& user, int next_id);
4.用户登录设计
int main()
{
//定义用户
userinfo user;
// 定义当前地图
levelinfo map;
//用户登录
bool ret = false;
int test_time = 0;
while (!ret)
{
ret = logi(user);
test_time++;
if (test_time > MAX_LOGIN_TIMES)
{
cout << "+++++++++++++++++++++++++++++++++++++" << endl;
cout << "++++++错误次数过多,退!退!退!" << endl;
cout << "+++++++++++++++++++++++++++++++++++++" << endl;
system("pause");
exit(-1);
}
if (ret == false)
{
cout << "登录失败,重新登陆" << endl;
}
else
{
cout << "登录成功!!"<> user.username;
cout << "请输入密码:";
cin >> user.password;
//连接数据库
if (connectsql(mysql) == false)
{
return false;
}
//查询数据
snprintf(sql, 256, "select id,leve_id from user where username='%s' and password=md5(%s);", user.username.c_str(), user.password.c_str());
ret = mysql_query(&mysql, sql);//成功返回0
if (ret)
{
cout << "连接失败" << endl;
cout << "错误原因 " << mysql_error(&mysql) << endl;
mysql_close(&mysql);
return false;
}
//返回结果
res = mysql_store_result(&mysql);
row = mysql_fetch_row(res);
if (row == NULL)//没有查到记录
{
mysql_free_result(res);
mysql_close(&mysql);
return false;
}
user.id = atoi (row[0]);
user.level_id = atoi(row[1]);
//释放数据库
mysql_free_result(res);
mysql_close(&mysql);
return true;
}
bool connectsql(MYSQL& mysql)
{
mysql_init(&mysql);
mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");
if (mysql_real_connect(&mysql, DB_host, DB_user, DB_user_password, DB_name, DB_port, NULL, 0) == NULL)
{
cout << "连接失败" << endl;
cout << "错误原因 " << mysql_error(&mysql) << endl;
return false;
}
return true;
}
main函数就是意思意思,无实际用处灵活使用。
5.获取地图数据int main()
{
//定义用户
userinfo user;
// 定义当前地图
levelinfo map;
//获取地图数据
if (getmap(map, user.level_id))
{
cout << "地图数据获取成功!" << endl;
}
else
{
cout << "地图数据获取失败!" << endl;
}
}
bool getmap(levelinfo &map,int mapid)
{
MYSQL mysql;
MYSQL_RES* res;//查询结果集
MYSQL_ROW row;//记录结构体
char sql[256];
bool ret = false;
//连接数据库
if (connectsql(mysql) == false)
{
return false;
}
//根据mapid获取data
snprintf(sql, 256, "select id,name,map_row,map_col,map_data,next_map from levels where id=%d;", mapid);
ret = mysql_query(&mysql, sql);//成功返回0
if (ret)
{
cout << "数据库查询失败!" << endl;
cout << "错误原因 " << mysql_error(&mysql) << endl;
mysql_close(&mysql);
return false;
}
//返回结果
res = mysql_store_result(&mysql);
row = mysql_fetch_row(res);
if (row == NULL)//没有查到记录
{
mysql_free_result(res);
mysql_close(&mysql);
return false;
}
map.id = atoi(row[0]);
map.name = row[1];
map.map_row = atoi(row[2]);
map.map_column = atoi(row[3]);
map.map_data = (row[4]);
map.next_level = atoi(row[5]);
cout << "地图行数:" << map.map_row << "地图列数:" << map.map_column << endl;
cout << "地图名称:" << map.name << endl;
//释放数据库
mysql_free_result(res);
mysql_close(&mysql);
return true;
}
连接数据库的方式大同小异
6.更新数据库设计 int main()
{
updata(user, map.next_level);
cout << "当前玩家游玩关卡:" << user.level_id << endl;
system("pause");
return 0;
}
bool updata(userinfo& user, int next_id)
{
MYSQL mysql;
MYSQL_RES* res;//查询结果集
MYSQL_ROW row;//记录结构体
char sql[256];
bool ret = false;
//连接数据库
if (connectsql(mysql) == false)
{
return false;
}
snprintf(sql, 256, "update user set leve_id = %d where id=%d;", next_id,user.id);
ret = mysql_query(&mysql, sql);//成功返回0
if (ret)
{
cout << "更新数据失败" << endl;
cout << "错误原因 " << mysql_error(&mysql) << endl;
mysql_close(&mysql);
return false;
}
user.level_id = next_id;
mysql_close(&mysql);
return true;
}
7.最后附上常用典型连接数据库例子
void testsql()
{
MYSQL mysql;//数据库句柄
MYSQL_RES* res;//查询结果集
MYSQL_ROW row;//记录结构体
//初试化数据库
mysql_init(&mysql);
//设置字符编码
mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");
//连接数据库
if (mysql_real_connect(&mysql, "127.0.0.1", "root", "5965424", "yzytest", 3306, NULL, 0) == NULL)
{
cout << "连接失败" << endl;
cout << "错误原因 " << mysql_error(&mysql) << endl;
exit(-1);
}
//查询数据
int ret = mysql_query(&mysql, "select*from emp;");
cout << "员工明细: " << ret << endl;
//获取数据集
res = mysql_store_result(&mysql);
//给row赋值,判断row是否为空,不空就打印
while (row = mysql_fetch_row(res))
{
cout << row[0] << " ";
cout << row[1] << " ";
cout << row[2] << " ";
cout << row[7] << " " << endl;
}
//释放结果集
mysql_free_result(res);
//关闭数据库
mysql_close(&mysql);
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)