2016-04-27 3 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 und mysql_query läuft sehr gut.
, aber mysql_affected_rows Rückgabewert -1.
Ich weiß nicht, wo das Problem ist ....Warum hat die Funktion mysql den Wert -1 in C++ zurückgegeben?

+1

C ist nicht das gleiche wie C++ .. bitte wählen Sie eine von ihnen. – jboockmann

+1

Es gibt einen furchterregenden Mangel an korrektem SQL-Entweichen, und dieses Ding ist wahrscheinlich ein riesiges [SQL-Injektionsloch] (http://bobby-tables.com/). Das sehe ich nicht oft im C-Code. – tadman

+0

Ich denke, -1 ist korrekt für die Select-Abfrage, ein SELECT-Befehl hat keine Auswirkungen auf Zeilen, so sollte es eine andere Funktion erhalten die Anzahl der Zeilen von connect_ptr, die Einfügung sollte eigentlich ein gültiges Ergebnis zurückgeben, aber Sie überprüft, ob die Zeile war tatsächlich eingefügt? – Marco

Antwort

1

Vom documentation:

-1 zeigt an, dass die Abfrage einen Fehler zurückgegeben oder dass für eine SELECT-Abfrage, mysql_affected_rows() war genannt vor mysql_store_result zu nennen()

Außerdem schlage ich vor, Sie statt sprintf vorbereitete Anweisungen zu verwenden, um SQL-Injektionen zu vermeiden.

Verwandte Themen