最近在做一个网络通信的小项目,其中用到了一些基本的数据库Mysql的知识。在项目中有一个需求是:判断用户注册时的用户名是否已被注册,针对这个需求,需要用到mysql_query()来执行select语句查询数据库中是否存在当前用户输入的用户名信息
我的思路是这样的:
- 通过mysql_query()来执行select语句,在数据库中进行查找
- 根据函数返回值来判断数据库中是否有查询的用户名信息
- 根据mysql_query()的描述,我当时想的是:返回值为0代表查询到了用户名信息,返回值为非0代表出错,没有查询到用户名信息
可是在实际跑代码的过程中,我发现:
- 不管在我实际的数据库中有没有要查询的用户名信息, mysql_query()的返回值都为0
后来我才弄明白,不管数据库中有没有要查询的用户名信息,只要select语句执行成功,mysql_query()的返回值就都为0
所以,要想知道数据库中是否存在查询的用户名信息,还需要借助两个函数:mysql_store_result()和 mysql_fetch_row()
- mysql_store_result()用来保存mysql_query()执行相应语句的结果,只要mysql_query()执行不出错,就不会返回空指针
- mysql_fetch_row()用来获得mysql_store_result()中保存结果的行数,若没有要检索的行,也就是mysql_query()执行相应语句的结果为空,mysql_fetch_row()将返回NULL
所以,我们可以通过判断mysql_fetch_row()的返回值来判定数据库中是否存在检索的用户名信息
在我项目中的代码如下:
#include <mysql.h>
MYSQL *mysql;
MYSQL_RES *res_ptr;
MYSQL_ROW sqlrow;
char query[100];
std::string strclientmsg;
sprintf(query, "select password from UserInfo where username = '%s'", name);
int ret = pReactor->sqlQuery(query);
res_ptr = mysql_store_result(pReactor->mysql);
sqlrow = mysql_fetch_row(pReactor->res_ptr);
if(sqlrow)
{
strclientmsg += "The name has been registered";
}
mysql_free_result(pReactor->res_ptr);
每次调用完mysql_store_result()后,记得调用mysql_free_result()释放内存