2016-03-28 8 views
2

私はこの3時間のようでしたが、この作業を行うことはできません。 私はmysql_stmt関数について10回、MySQL C APIのドキュメントを読んでいます。私は必要なものMySQL C APIでクエリをフェッチしたときの結果を

は、このようなものです:mysql_stmt_fetch()

事は1つのユーザーの入力があるので、私はパラメータ化クエリが必要です。次のように

コードは次のとおりです。

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であった。

パラメータ化されたクエリから正しい結果を得る方法を教えてもらえますか?

EDIT 1:動作しますどのようなようだが、何かがおかしいです 新しいコード:

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"; 
} 

アウトは次のとおりです。

mysql_stmt_execute(), failed 
Got packet bigger than 'max_allowed_packet' bytes 

私はそれがここにだと思う:

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

したがって、MYSQL_BINDを作成し、params(入力)をバインドする準備をしました。 それから私は実行しました。それは私がそれが何であるかわからないエラーを作ります。 私はchar *にアクセスしてトラブルシューティングのための現在のSQLクエリを見ることができます。私が思う

答えて

2

は、あなたがエラーのカップルを持っている:

1)あなたのクエリが1(入力)パラメータおよび2(出力)の列を持っていますが、あなたは多分、入力パラメータのために、ただ1 MYSQL_BINDを定義します。

2)あなたは初期化します。

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

をこのバインドは、入力パラメータのためであれば、あなたが変更する必要があります。

bind[0].buffer= token; 
bind[0].buffer_length= strlen(token) + 1; 

と、この呼び出しでそれを渡します

mysql_stmt_bind_param(stmt,bind); 

3)あなたのmysql_stmt_executeコマンドはどこですか?いけない仕事フェッチクエリが

を実行していないですフム

+0

(ない場合は私に気づく)私は、コードをフェッチチェックいけないが、それは罰金のように見えます。さて、MYSQL_BINDは入力だけではないのですか? – int3

関連する問題