c++连接mysql数据库登陆,注册,并且获取注册用户的id

     这几天学习到了c++连接数据库,跟之前java的真的是完全不同。特别是登陆成功与否的判断问题,走了许多弯路,mysql_query()这个函数负责执行sql语句,只要sql语句没有出错就会一只返回0,所以不能凭借他的返回值来判断是否登陆成功,应该配合mysql_store_result()mysql_num_rows()来获取受影响的行数,如果查找到数据则返回1,没有查找到就返回0,可以凭借此来判断是否登陆成功。


     而注册就简单地多了,直接mysql_query()方法判断sql语句是否执行成功。


     在我的数据库如下图所示,id为主键,自增不为空,所以用户注册之后需要返回他的注册id 是多少,这时有两个方法,mysql.h里面的mysql_insert_id()方法和max(id)方法但因为后者在并发用户同时注册时返回值的正确性,所以不在此多介绍,

mysql_insert_id()定义:

mysql_insert_id() 函数返回上一步 INSERT 操作产生的 ID。

如果上一查询没有产生 AUTO_INCREMENT 的 ID,则 mysql_insert_id() 返回 0。

语法

mysql_insert_id(connection)


可以很清楚的看到这个函数的用法,结果就是返回一个值,就是用户最后后注册的id。

运行后的结果:



下面是源码,写的有点乱,见谅。

#include<iostream>
#include<Windows.h>
#include <mysql.h>
#include<string>
using namespace std;

MYSQL_RES* result = NULL;
int connect() {//用于连接数据库并初始化
	MYSQL mysql;//必备的一个数据结构
	mysql_init(&mysql);//开辟空间
	MYSQL_RES* result = NULL;
	 //初始化数据库
	if (0 == mysql_library_init(0, NULL, NULL)) {
		cout << "mysql_library_init() succeed" << endl;
	}
	else {
		cout << "mysql_library_init() failed" << endl;
		return -1;
	}

	//初始化数据结构
	if (NULL != mysql_init(&mysql)) {
		cout << "mysql_init() succeed" << endl;
	}
	else {
		cout << "mysql_init() failed" << endl;
		return -1;
	}

	//连接数据库
	if (NULL
		!= mysql_real_connect(&mysql, "localhost", "root", "123456", "test",
			3306, NULL, 0))
		//这里的地址,用户名,密码,端口可以根据自己本地的情况更改
	{
		cout << "mysql_real_connect() succeed" << endl;
	}
	else {
		cout << "mysql_real_connect() failed" << endl;
		return -1;
	}

	//cout << "please input username" << endl;
	//string username;
	//getline(cin, username);//接收用户名
	//cout << "please input password" << endl;
	//string password;
	//getline(cin, password);//接收密码     
	//string query = "select * from test.login where username='" + username + "' and password='" + password + "'";
	//	//查询
	//mysql_query(&mysql, query.data());
	//result = mysql_store_result(&mysql);
	cout << mysql_num_rows(result);
	system("pause");
	//	//if (mysql_query(&mysql, query.data()))
	//if(mysql_num_rows(result))
	//	{
	//		cout << "登陆成功";
	//	}
	//	else {
	//		cout << "登陆失败";
	//	}
	//	system("pause");
	//	mysql_close(&mysql);
	//	mysql_server_end();
		
	
	cout << "please input username" << endl;
	string username;
	getline(cin, username);//接收用户名
	cout << "please input password" << endl;
	string password;
	getline(cin, password);//接收密码     
	string query = "insert into test.login values('0','" + username + "','" + password + "');";
	//string query = "insert into test.login(username,password) values('"username"','"password"');";
	//查询
	
	
	//cout << mysql_num_rows(result);
	//system("pause");
	//if (mysql_query(&mysql, query.data()))
	
	if (mysql_query(&mysql, query.data()))
	{
		cout << "插入失败";
		cout << endl;
		cout << mysql_error(&mysql);
	}
	else {
		cout << "插入成功";
		cout << endl;
		cout << "正在查询您的id" << endl;
	}
	Sleep(1000);
	cout << "还有3秒" << endl;
	Sleep(1000);//使程序暂停一秒,需包含windows.h头文件
	cout << "还有2秒" << endl;
	Sleep(1000);
	cout << "还有1秒" << endl;
	Sleep(1000);
	string fanhui = "SELECT LAST_INSERT_ID();";
	mysql_query(&mysql, fanhui.data());//用于执行sql语句,返回值为0则代表执行成功,不能借此判断是否插入或者查询成功,因为只要语句没问题都会返回0;
	int x = mysql_insert_id(&mysql);//该方法用于获取刚刚插入数据的id,赋值给x
	cout << "查询成功" << endl;
	cout << "您的id为:" << x << endl;
	system("pause");
	mysql_close(&mysql);
	mysql_server_end();

	return 0;
}
如有问题,欢迎各位指出,谢谢。
  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
基于muduo开发的集群聊天服务器c++源码+数据库+使用说明.zip 基于muduo开发的集群聊天服务器c++源码+数据库+使用说明.zip 基于muduo开发的集群聊天服务器c++源码+数据库+使用说明.zip 【资源说明】 该项目是个人毕设项目源码,评审分达到95分,调试运行正常,确保可以运行!放心下载使用。 该项目资源主要针对计算机、自动化等相关专业的学生或从业者下载使用,也可作为期末课程设计、课程大作业、毕业设计等。 具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现类似其他功能。 在 Linux 环境下基于 muduo 开发的集群聊天服务器。实现新用户注册用户登录、添加好友、添加群组、好友通信、群组聊天、保持离线消息等功能。 ## 项目特点 - 基于 muduo 网络库开发网络核心模块,实现高效通信 - 使用第三方 JSON 库实现通信数据的序列化和反序列化 - 使用 Nginx 的 TCP 负载均衡功能,将客户端请求分派到多个服务器上,以提高并发处理能力 - 基于发布-订阅的服务器中间件redis消息队列,解决跨服务器通信难题 - 封装 MySQL 接口,将用户数据储存到磁盘中,实现数据持久化 - 基于 CMake 构建项目 ## 必要环境 - 安装`boost`库 - 安装`muduo`库 - 安装`Nginx` - 安装`redis` ## 构建项目 创建数据库 ```shell # 连接MySQL mysql -u root -p your passward # 创建数据库 create database chat; # 执行数据库脚本创建表 source chat.sql ``` 执行脚本构建项目 ```shell bash build.sh ``` ## 执行生成文件 ```shell # 启动服务端 cd ./bin ./ChatServer 6000 ``` ```shell # 启动客户端 ./ChatClient 127.0.0.1 8000 ``` ## 业务模块设计 ### 注册模块 我们从网络模块接收数据,根据 `MSGID` 定位到注册模块。从传递过来的 `json` 对象中获取用户 ID用户密码。并以此生成 `User` 对象,调用 model 层方法将新生成的 `User` 插入到数据库中。 ### 登录模块 从 `json` 对象中获取用户ID和密码,并在数据库中查询获取用户信息是否匹配。如果用户已经登录过,即 `state == "online"`,则返回错误信息。登录成功后需要在改服务端的用户表中记录登录用户,并显示该用户的好友列表和收到的离线消息。 ### 客户端异常退出模块 如果客户端异常退出了,我们会从服务端记录用户连接的表中找到该用户,如果它断连了就从此表中删除,并设置其状态为 `offline`。 ### 服务端异常退出模块 如果服务端异常退出,它会将所有在线的客户的状态都设置为 `offline`。即,让所有用户都下线。异常退出一般是 `CTRL + C` 时,我们需要捕捉信号。这里使用了 Linux 的信号处理函数,我们向信号注册回调函数,然后在函数内将所有用户置为下线状态。 ### 点对点聊天模块 通过传递的 `json` 查找对话用户 ID: - 用户处于登录状态:直接向该用户发送信息 - 用户处于离线状态:需存储离线消息 ### 添加好友模块 从 `json` 对象中获取添加登录用户 ID 和其想添加的好友的 ID,调用 model 层代码在 friend 表中插入好友信息。 ### 群组模块 创建群组需要描述群组名称,群组的描述,然后调用 model 层方法在数据库中记录新群组信息。 加入群组需要给出用户 ID 和想要加入群组的 ID,其中会显示该用户是群组的普通成员还是创建者。 群组聊天给出群组 ID 和聊天信息,群内成员在线会直接接收到。 ## 使用Nginx负载均衡模块 ### 负载均衡是什么 假设一台机器支持两万的并发量,现在我们需要保证八万的并发量。首先想到的是升级服务器的配置,比如提高 CPU 执行频率,加大内存等提高机器的物理性能来解决此问题。但是单台机器的性能毕竟是有限的,而且也有着摩尔定律也日已失效。 这个时候我们就可以增加服务器的数量,将用户请求分发到不同的服务器上分担压力,这就是负载均衡。那我们就需要有一个第三方组件充当负载均衡器,由它负责将不同的请求分发到不同的服务器上。而本项目,我们选择 `Nginx` 的负载均衡功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值