首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL C API参数化查询获取结果

问MySQL C API参数化查询获取结果
EN

Stack Overflow用户
提问于 2016-03-29 00:37:28
回答 1查看 607关注 0票数 2

我已经在这上面花了3个小时了,但我不能让它工作。关于mysql_stmt函数,我大概读了10遍MySQL C应用编程接口文档。

我需要的是这样的:mysql_stmt_fetch()

问题是我需要一个参数化的查询,因为只有一个用户输入。

代码如下:

代码语言:javascript
复制
char* regSol(char* token,MYSQL *conn){
    char* regnr;
    MYSQL_STMT *stmt;
    MYSQL_BIND bind[1];
    unsigned long str_length;
   /*
    * Validation
    */
    stmt = mysql_stmt_init(conn);
    char *sql="SELECT REGNR,Token FROM registed WHERE Token=?";
    if(mysql_stmt_prepare(stmt,sql,strlen(sql))){
        fprintf(stderr, " mysql_stmt_prepare(), SELECT failed\n");
        fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
        exit(1);
    }

    memset(bind, 0, sizeof(bind)); //clears the structure.

    bind[0].buffer= 0;
    bind[0].buffer_length= 0;
    bind[0].length= &str_length;

    if(mysql_stmt_bind_result(stmt,bind))
    {
      fprintf(stderr, " mysql_stmt_bind_result(), failed\n");
      fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
      exit(1);
    }    
    /*
     fetch data
     */

    unsigned long long nrow=0;

    mysql_stmt_fetch(stmt);
    if (str_length > 0)
    {
      char *data= (char*) malloc(str_length);
      bind[0].buffer= data;
      bind[0].buffer_length= str_length;
      mysql_stmt_fetch_column(stmt, bind, 0, 0);
      fprintf(stdout,"DEBUG !! - %s - !!\n",data);
    }

    return NULL;
}

我已经测试了mysql_stmt_bind_result和其他函数。第一次尝试是准备、绑定和执行。获取行数,它始终为0。无论如何,始终为0。

谁能告诉我从参数化查询中获得结果的正确方法?

编辑1:新的代码看起来可以工作,但有些东西很奇怪:

代码语言:javascript
复制
char* regSol(char* token,MYSQL *conn){

    /*
     * Needs to be completed. I have no idea why I can make this work
     * Tested a lot of functions and got some SEGVs and 0 rows.
     * And results that aren't even in the database
     */
    char* regnr;
    MYSQL_STMT *stmt;
    MYSQL_BIND bind[1];
    unsigned long str_length;
   /*
    * Validation
    */
    stmt = mysql_stmt_init(conn);
    char *sql="SELECT REGNR FROM registed WHERE Token=?";
    if(mysql_stmt_prepare(stmt,sql,strlen(sql))){
        fprintf(stderr, " mysql_stmt_prepare(), SELECT failed\n");
        fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
        exit(1);
    }

    memset(bind, 0, sizeof(bind)); //clears the structure.
    bind[0].buffer_type=MYSQL_TYPE_STRING;
    bind[0].buffer=(char*)token;
    bind[0].buffer_length=strlen(token)+1;
    bind[0].length= &str_length;

    if(mysql_stmt_bind_param(stmt,bind))
    {
      fprintf(stderr, " mysql_stmt_bind_param(), failed\n");
      fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
      exit(1);
    }

    if(mysql_stmt_execute(stmt)){
        fprintf(stderr," mysql_stmt_execute(), failed\n");
        fprintf(stderr, "%s\n",mysql_stmt_error(stmt));
        exit(1);
    }

    /*
     fetch data
     */
    //bind result
    MYSQL_BIND resbind[1];
    unsigned long reslen=0;
    resbind[0].buffer=0;
    resbind[0].buffer_length=0;
    resbind[0].length=&reslen;

    if(mysql_stmt_bind_result(stmt,resbind)){
        fprintf(stderr," mysql_stmt_bind_result(), failed\n");
        fprintf(stderr, "%s\n",mysql_stmt_error(stmt));
        exit(1);
    }

    mysql_stmt_fetch(stmt);
    if (reslen > 0) //size of buffer?
    {
        char *data=(char*)malloc(reslen);
        bind[0].buffer=data;
        bind[0].buffer_length=reslen;
        mysql_stmt_fetch_column(stmt, bind, 0, 0);
        fprintf(stdout,"Result Len:%lu\nRegistation NR:%s",reslen,data);
        free(data);
    }
    return "1";
}

结果是:

代码语言:javascript
复制
mysql_stmt_execute(), failed
Got packet bigger than 'max_allowed_packet' bytes

我想它就在这里:

代码语言:javascript
复制
if(mysql_stmt_execute(stmt)){
        fprintf(stderr," mysql_stmt_execute(), failed\n");
        fprintf(stderr, "%s\n",mysql_stmt_error(stmt));
        exit(1);
    }

因此,我创建了MYSQL_BIND并准备绑定参数(输入)。然后我执行了。它犯了一个错误,我不知道它是什么。我正在搜索如何访问char*以查看用于故障排除的当前sql查询。

EN

回答 1

Stack Overflow用户

发布于 2016-03-29 01:12:12

我认为,你有几个错误:

1)您的查询有一个(输入)参数和两个(输出)列,但您只定义了一个MYSQL_BIND,可能用于输入参数。

2)初始化时:

代码语言:javascript
复制
bind[0].buffer= 0;
bind[0].buffer_length= 0;
bind[0].length= &str_length;

如果此绑定用于输入参数,则必须更改为:

代码语言:javascript
复制
bind[0].buffer= token;
bind[0].buffer_length= strlen(token) + 1;

并通过此调用传递它:

代码语言:javascript
复制
mysql_stmt_bind_param(stmt,bind);

3)你的mysql_stmt_execute命令在哪里?未执行查询时,fetch不起作用

我不检查fetch代码,但它看起来很好(如果没有,请通知我)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36266635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档