2013-05-31 74 views
0

下面的函数读取来自外部机器的缓冲,用strtok的我得到了一些标记,我需要和printf的我有一些结果一样插入变量值到MySQL表

Results1: 12, 23.345, 2.34, 23.45, 5.67 

我想保存这些导致一个称为结果的Mysql表,但我不知道在我的查询中在VALUES()内写什么。我如何插入resa,resb,resc,resd,rese?

for (;;) 
{ 
char buff[1000]; 

n=read(fd,buff,1000); 
sleep(1); 

char resa[25] = "", resb[25] = "", resc[25] = "", resd[25] = "", rese[25] = ""; 
char* ptr; 

ptr = strtok(buff, "+PARAMETERS()\nsYSTEM ,=M:DK:RT:PTT()"); 
int i = 0; 
while (ptr != NULL) 
{ 
    ptr = strtok(NULL, "+PARAMETERS()\nsYSTEM ,=M:DK:RT:PTT()"); 
    if (i == 2) 
     strcat(resa, ptr); 
    if (i == 5) 
     strcat(resb, ptr); 
    if (i == 6) 
     strcat(resc, ptr); 
    if (i == 8) 
     strcat(resd, ptr); 
    if (i == 10) 
     strcat(rese, ptr); 
    i++; 
    } 

    printf("Results1: %s, %s, %s, %s, %s\n\n", resa,resb,resc,resd,rese); 

if(mysql_query(conn, "INSERT INTO results VALUES(...)")) 
{ 
    fprintf(stderr, "%s\n", mysql_error(conn)); 
    return -1; 
} 

res = mysql_use_result(conn); 
} 
+0

Duplicate(?):http://stackoverflow.com/questions/6210506/insert-client-input-into-mysql-database-with-c?rq=1 – fab

回答

0

使用查询

INSERT INTO results("resa","resb","resc","resd","rese") VALUES(resa,resb,resc,resd,rese) 

而不是

INSERT INTO results VALUES(resa,resb,resc,resd,rese) 
0

使用这样的。

if(!mysql_query(conn, "INSERT INTO table_name (column_name)VALUES (value)")) 
    { 
     fprintf(stderr, "%s\n", mysql_error(conn)); 
     return -1; 
    } 

    res = mysql_use_result(conn); 
1

你可能想用sprintf()打印成字符数组,就像你使用printf()打印到stdout

char querystring[256]; 
size_t sizeQuerystring = sizeof querystring; 

if (sizeQuerystring < snprintf(querystring, sizeQuerystring, 
    "INSERT INTO results (resa, resb, resc, resd, rese)" \ 
    "VALUES (%s, %s, %s, %s, %s)", 
    resa, resb, resc, resd, rese)) 
{ 
    fprintf(stderr, "The query string to small.\n"); 
} 
else 
{ 
    ... /* issue query */ 
} 

您需要注意不要溢出目标数组。 snprintf()有助于以编程方式执行此操作。


如果使用GCC你可以使用asprintf(),按照需要分配尽可能多的条目的字符数组。之后该阵列需要free()

char * pquerystring = NULL; 

if (-1 == asprintf(&pquerystring, 
    "INSERT INTO results (resa, resb, resc, resd, rese)" \ 
    "VALUES (%s, %s, %s, %s, %s)", 
    resa, resb, resc, resd, rese)) 
{ 
    perror("asprintf() failed"); 
} 
else 
{ 
    ... /* issue query */ 
} 

free(pquerystring); 

由于asprintf()是一个扩展的C标准使用它打破了代码的可移植性。

+0

是'\'必需的吗?无论我是否拥有它,它都能奏效。 https://ideone.com/A3aNsJ https://ideone.com/P1UQL9 – cokedude

+0

@cokedude:不,它不是。总是初始化变量只是一种习惯。 – alk

+0

对不起,应该是在后面的蜱中有一个反斜杠。不知道它为什么没有出现。是否需要单独行上引用的字符串之间的反斜杠? – cokedude