2016-04-27 6 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_connectおよびmysql_query実行が非常に良好です。
しかし、mysql_affected_rows戻り値-1。
問題がどこにあるか私はdocumentationから....なぜmysql関数はC++で-1を返しましたか?

+1

CはC++と同じではありません。どちらか1つを選択してください。 – jboockmann

+1

そこには適切なSQLエスケープの恐ろしい欠点があり、このことはおそらく巨大な[SQLインジェクションホール](http://bobby-tables.com/)です。私はしばしばCコードでそれを見ることはありません。 – tadman

+0

私は-1が選択クエリに対して正しいと思います。SELECTコマンドはどの行にも影響を与えません。したがって、別の関数がconnect_ptrから行数を取得する必要があります。実際には有効な結果が返されますが、実際に挿入されますか? – Marco

答えて

1

を知らない:

-1、クエリはSELECTクエリに対して、エラーまたはそれを返されたことを示しているにmysql_affected_rows()されました前 にmysql_store_result()また

を呼び出すに呼ばれ、私はあなたがSQLインジェクションを避けるために、代わりにsprintfのプリペアドステートメントを使用することをお勧めします。

関連する問題