问题背景:mysql查询数据时,如果未查询到数据,却进行了后续对数据的操作,会导致段错误,如果在生产状态下,可能会导致服务器崩溃死机。
解决办法:
向mysql查询数据时,不管能否查询到数据mysql_real_query()函数都会返回0,所以通过mysql_real_query()无法得知是否查询成功,我的解决办法是使用mysql_store_result()来判定是否查询到数据。
但是网上对mysql_store_result()的返回值的说法简直是误人子弟,有说法是判断返回值为NULL,则没有查询到数据。有的说返回值是0代表成功,非零失败。
但是查看myql.h的源码看到mysql_store_result()返回值是一个结构体指针,除非因为结构体指针申请失败,返回值才会为空。这和是否的得到数据完全无关。
代码实现:(可能实现的很low大佬请绕路)
方法一:
MYSQL_RES *res;
if(mysqL_real_query(mysql_conn,cmd,sizeof(cmd)))
{
return -1;
}
res = mysql_store_result(mysql_conn);
if(res == NULL || strlen(res->data) < 2)
{
return -1;
}
注意:strlen(res->data) < 2 主要是这个判断产生的作用,返回的数据在res->data,但是实际操作的时候,如果没有查询到数据res->data也不为空,判断是否小于2即可
方法二:
if(mysqL_real_query(mysql_conn,cmd,sizeof(cmd)))
{
return -1;
}
res = mysql_store_result(mysql_conn);
if(res == NULL )
{
return -1;
}
int rows = mysql_num_rows(res);
if(rows == 0) //通过判断所得的返回行数判断是否有查询到的数据
{
mysql_free_result(res);
return -1;
}