2016-03-28 19 views
2

Bu konuda 3 saat çalıştım ve bunu yapamam. MySQL C API belgelerini mysql_stmt işlevleri hakkında 10 kez okudum.MySQL C API parametreli sorgu getirme sonucu

Benim ihtiyacım şu şekildedir: mysql_stmt_fetch()

şey 1 kullanıcı girdisi yok çünkü bir parametrized sorgu ihtiyaç olduğunu. aşağıdaki gibi

Kod geçerli:

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

Zaten mysql_stmt_bind_result ve diğer işlevleri test etti. İlk deneme hazırlandı, bağlandı ve uygulandı. Satır sayısı al ve her zaman 0 oldu. Ne olursa olsun, her zaman 0.

Parametrized bir sorgudan bir sonuç elde etmek için doğru yolu söyleyen var mı?

DÜZENLEME 1: yeni kod çalışır ama bir şey garip ne görünüyor:

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

çıktı:

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

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

Buranın üzerinde olduğunu düşünüyorum

MYSQL_BIND'u oluşturdum ve paramları (giriş) bağlamak için hazırladım. Sonra idam ettim. Ne olduğunu bilmediğim bir hata yapar. Sorun giderme için geçerli sql sorgusunu görmek için bir char * 'a nasıl erişebileceğimi araştırıyorum. Bence

cevap

2

, hataların bir çift var:

1) sorgu bir (giriş) parametresi ve 2 (çıkış) sütun var, ama senin belki giriş parametresinin, sadece bir MYSQL_BIND tanımlayan.

2) başlatmak zaman: Bu bağlama giriş parametresinin olduğunu

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

varsa, değiştirmek gerekir:

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

ve bu çağrı ile pass:

mysql_stmt_bind_param(stmt,bind); 

3) mysql_stmt_execute komutunuz nerede? dont iş getirme sorgu Ben kodu alıp kontrol yok

yürütülmez, ancak cezası benziyor

+0

Hm (değilse beni fark). Tamam, MYSQL_BIND sadece giriş için değil? – int3