2016-04-27 54 views
0
bool MySql_Register(const char* id, const char* pw) { 
    MYSQL* connect_ptr; 
    connect_ptr = mysql_init(NULL); 
    if(!mysql_real_connect(connect_ptr, HOST, USER, PW, NAME, 3306, NULL, 0)) { 
    fprintf(stderr, "%s ",mysql_error(connect_ptr)); 
    exit(1); 
    } 

    char sql[256] = {0}; 
    sprintf(sql, "select * from user where id='%s'", id); 
    mysql_query(connect_ptr, sql); 
    int len = mysql_affected_rows(connect_ptr); 

    if(len == 1) 
    return PK_ID_OVERLAP; 
    sprintf(sql, "insert into user (id, pw) values ('%s', '%s')", id, pw); 
    mysql_query(connect_ptr, sql); 
    len = mysql_affected_rows(connect_ptr); 

    if(len == 1) 
    return true; 
    else 
    return false; 
} 

mysql_connectmysql_query運行非常好。
mysql_affected_rows返回值-1。
我不知道哪裏出了問題....爲什麼mysql函數在C++中返回值-1?

+1

C不同於C++ ..請選擇其中之一。 – jboockmann

+1

在那裏有一個可怕的SQL轉義的缺乏,這可能是一個巨大的[SQL注入漏洞](http://bobby-tables.com/)。我經常在C代碼中看到這一點。 – tadman

+0

我認爲-1對於select查詢是正確的,SELECT命令不會影響任何行,所以應該有另一個函數從connect_ptr獲取行計數,插入實際上應該返回一個有效的結果,但是您檢查行是否爲實際插入? – Marco

回答

1

documentation

-1表示查詢返回一個錯誤,或對SELECT查詢,mysql_affected_rows()函數是調用 了mysql_store_result()

而且之前調用,我建議你使用準備好的語句,而不是sprintf避免SQL注入。