2013-05-31 3 views
0

Следующая функция считывает буфер из внешней машины, с strtok я получаю некоторые маркеры, которые мне нужны, и в Printf У меня есть некоторые результаты, какВставить переменную значение в таблицу тузд

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() ed.

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

Смежные вопросы