2017-04-06 33 views
0

我使用MariaDB C-connector API在C中創建函數,以允許用戶輸入新的用戶名和密碼並將它們存儲在MariaDB/MySQL數據庫中。我使用strcpy_s()和strcat_s()將多個字符串連接在一個緩衝區內,以便生成MariaDB/MySQL查詢以將信息放入數據庫。這會導致「字段列表中的未知列」錯誤。我在前面提出了一個類似的問題,當我使用「foo」和「bar」作爲預設字符串來實現這個功能時,我收到的迴應(工作)是將「foo」和「bar」改爲「'foo '「和」'bar'「。這工作。有沒有辦法在運行時以「'foo'」形式與「foo」形式從用戶那裏獲取字符串?以下是該功能的相關代碼。關於MariaDB/MySQL C連接器API的C中的字符串I/O?

void NEW_PLAYER(MYSQL *con) 
{ 
    char NAME[16]; 
    char PASSWORD[16]; 
    char ch = NULL; 
    unsigned int i = 0; 

    printf("New Username: "); 
    while (ch != '\n') // terminates when the user presses enter 
    { 
     ch = getchar(); 
     NAME[i] = ch; 
     i++; 
    } 
    NAME[i] = '\0'; 
    i = 0; 
    ch = NULL; 
    printf("New Password: "); 
    while (ch != '\n') // terminates if user hits enter 
    { 
     ch = getchar(); 
     PASSWORD[i] = ch; 
     i++; 
    } 
    PASSWORD[i] = '\0'; 
    printf("%s", NAME); 
    printf("%s", PASSWORD); 
    char TEMP[256]; 
    char str1[] = "INSERT INTO PLAYERS VALUES("; 
    strcpy_s(TEMP, str1); strcat_s(TEMP, NAME); 
    strcat_s(TEMP, ", "); 
    strcat_s(TEMP, PASSWORD); 
    strcat_s(TEMP, " ,0, 0, 0, 1)"); 

    if (mysql_query(con, TEMP)) { 
     fprintf(stderr, "%s\n", mysql_error(con)); 
     exit(-1); 
    } 
} 

回答

0
  • 您需要在INSERT陳述文字周圍的引號。
  • 如果NAMEPASSWORD, and/or TEMP`不夠大,內存將損壞。
  • 您必須轉義NAME或PASSWORD中的某些特殊字符(特別是引號)。

C是要與MySQL被打在非常低的語言,在這整函數,與修正,將需要5-10行代碼大多數語言。

+0

你能告訴我你的代碼是什麼意思嗎? – RakovS

+0

你知道Perl,PHP,VB,Java,Python嗎? –

+0

吊。。如果團隊知道這一點,我可以理解使用特定的語言。如果這是因爲「C允許更好的優化」,那麼這是錯誤的。當然,您可以更好地微調代碼。但真正的性能收益是通過查看大圖並優化算法。當很多時間都花在諸如字符串處理等瑣事上時,很難做到這一點。 50年前,一種類似的口頭禪適用於「彙編語言」。 –