2012-02-25 46 views
0

我無法得到下面的代碼工作。它使用正常的選擇或插入,但是當我嘗試插入一個變量時,它不起作用。有人可以讓我知道這裏有什麼問題嗎?C中的MYSQL API - linux

請注意輸出結果如下。

int main(int argc, char **argv) 
{ 

    MYSQL *conn; 
    char str[100] = "test"; 
    conn = mysql_init(NULL); 

    char stmt_buf[100]; 
    sprintf (stmt_buf, "insert into test values ('%s')", str); 

    printf("\n%s\n",stmt_buf); 

    mysql_query (conn, stmt_buf); 
    mysql_close(conn); 
    return 0; 
} 

~$./version

insert into test values ('test') 
Segmentation fault 
+0

你應該通過GDB運行你的程序來找出它崩潰的地方。 'gdb。/ version' - >'run' – spencercw 2012-02-25 18:19:56

+0

您是否嘗試使用所有警告和調試信息(例如gcc -Wall -g')來編譯代碼,以便改進代碼直至編譯器未給出警告爲止使用調試器(例如'gdb')? – 2012-02-25 18:21:02

+0

我做了,但輸出沒有幫助,如下所示。程序收到信號SIGSEGV,分段故障。 0x00199634來自/usr/lib/libmysqlclient.so.16的mysql_send_query() – 2012-02-25 18:21:41

回答

1

我沒有看到你連接到數據庫通過mysql_real_connect 也沒有mysql_select_dbmysql_exec_sql調用。

下面是一個例子給你。

int main(int argc, char **argv) 
{ 
    MYSQL mysql; 
    char stmt_buf[100]; 
    if (mysql_init(&mysql) == NULL) { 
     printf("Can not initialize"); 
     exit(1); 
    } 
    if (!mysql_real_connect 
     (&mysql, "localhost", "USERNAME", "PASSWORD", NULL, 0, NULL, 0)) { 
     mysql_error(&mysql); 
     exit(1); 
    } 

    if (mysql_select_db(&mysql, "DATABASENAME")) { 
     mysql_error(&mysql); 
     exit(1); 
    } 

    sprintf(stmt_buf, "insert into test values ('%s')", "test"); 

    if (mysql_exec_sql(&mysql, stmt_buf)) 
     mysql_error(&mysql)); 

    mysql_close(&mysql); 
} 
+0

請注意:如果有人用不可信用戶輸入替換「test」,這是一個SQL注入等待發生。 http://xkcd.com/327/ – BraveNewCurrency 2013-11-05 02:48:01

2

你不做任何錯誤檢查。我的猜測是conn == NULL

備案,千萬不要使用sprintf。相反,使用snprintf,也就是說,如果您對SQL注入沒問題。

+0

我試過snprintf並得到了相同的結果 – 2012-02-25 18:23:01

+0

明白了,沒有連接到MYSQL LOL,謝謝大家 – 2012-02-25 18:32:36