• mysql的mysql_store_result函数调用问题(C的API)


     问题背景: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;

    }

  • 相关阅读:
    JAVA实现QQ登录、注册、修改密码等功能(美化版)
    node.js+室内装修风格选择系统 毕业设计-附源码211552
    项目架构:eslint 代码检测、提交代码审查
    【运维篇】5.6 Redis server 主从复制配置
    数字孪生技术栈的应用场景的优点
    vue中 router.beforeEach() 的用法
    springboot常用注释
    回溯算法的应用
    三个线程交替打印的几种实现方式
    SSH 工具 PuTTY 最新官方下载地址及教程
  • 原文地址:https://blog.csdn.net/qq_41937509/article/details/126146607