2012-02-25 43 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