2013-08-24 8 views
-1

나는 (로컬로) 내 mysql 데이터베이스 (ANSI C)에 연결하는 mysql 스 니펫을 사용하고 있습니다. 모든 것이 완벽하게 작동하지만, 내 데이터베이스에 연결하고 다음을 삽입하는 함수를 만들려고했습니다. 일부 변수에 기초한 새로운 기록. sprintf를 사용하여 이러한 변수를 잡아 내 SQL 쿼리를 구성합니다. 나는 준비가 내 변수와 내 SQL이 있으면mysql_query와 함께 sprintf 사용하기

문제

, 나는하여 mysql_query까지 보낼 수 있습니다. 아쉽게도 예상대로 작동하지 않으며 프로그램이 충돌하고 버퍼 오버 플로우를보고합니다.

다음은 문제를 설명하는 데 도움이되는 전반적인 기능입니다.

#include <mysql.h> 
#include <string.h> 
#include <stdio.h> 

char *table = "test_table"; // table is called test_table 
char *column = "value"; // column is called value 
char *value = "working"; // what value we are inserting 
char *query; // what we are sending to mysql_query 

sprintf(query, "INSERT INTO %s (%s) VALUES ('%s')", table, column, value); 

if (mysql_query(conn, query)) { 
    fprintf(stderr, "%s\n", mysql_error(conn)); 
    return; 
} 

목적

전체 기능의 목적은 그래서 내 프로그램에서 SQL 삽입 또는 업데이트 문을 다시 작성 보관하지 않아도됩니다. 하나의 함수를 호출하여 테이블, 열 및 해당 열의 값을 식별하는 몇 가지 매개 변수를 전달하려고합니다.

모든 도움을 주시면 감사하겠습니다. 나는 요즘 C에서 약간 녹슬 었어.

질문

왜 mysql_query가 문자열을 보낼 수 없습니까?

변경 사항

이것은 설명에 따라 작동했습니다.

+0

"질문"에서 볼 수없는 질문이 있습니까? 아니면 잊었 니? –

+1

'query'에 메모리를 할당하지 마십시오. 유효한 위치를 가리 키지는 않습니다. 나는 당신이 좋은 초보자의 C 프로그래밍 가이드를 읽으라고 제안한다. SQL로 엉망이되기 전에, [little Bobby tables] (http://bobby-tables.com)가있을 것이기 때문이다. –

+0

그리고'query'는 "아무 데"를 가리키는 포인터이기 때문에이 코드가 충돌하는 것 같아요. –

답변

1

query의 보조 기억 장치가 없습니다.

그것의 하나 끝날 어느 쪽도 아니는 저장 기간에 따라 불확정 값을 NULL 또는 설정도 :-)

빠른 수정이 어떤 코더하지만

char query[1000]; 

로 변경하는 것입니다 봉급을받을 가치가있는 경우에도 버퍼 오버플로가 발생하지 않았는지 확인해야합니다.

+0

문제는 없지만 사용하지 않는 주석을 삭제했습니다. –

+0

전체 함수를 붙여 넣기를 원하지는 않았지만 예, 함수 안에 있습니다. – Fastidious

+0

원래 const char query [MAX_STRING_LENGTH];를 설정했습니다. 이것은 경고와 함께 컴파일되고 작동합니다. 또한 빠른 수정으로 데이터베이스를 업데이트합니다. 하지만, mysql_query는 const를 기대한다고 경고한다. 그런 다음 sprintf는 const를 삭제한다고 경고합니다. – Fastidious