4. C언어 & INSERT
1. MySQL 사용자·데이터베이스 준비
더보기

-- [테이블 생성: 회원 정보 저장]
CREATE TABLE Members (
code INT PRIMARY KEY AUTO_INCREMENT, -- 고유 번호
id VARCHAR(12) NOT NULL, -- 사용자 ID
pw VARCHAR(18) NOT NULL, -- 비밀번호
fname VARCHAR(50) NOT NULL, -- 이름
lname VARCHAR(50) NOT NULL, -- 성
ph VARCHAR(20), -- 전화번호
email VARCHAR(100), -- 이메일
disabled TINYINT(1) NOT NULL DEFAULT 0 -- 비활성(0=활성, 1=비활성)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- [샘플 데이터 6명 등록]
INSERT INTO Members (id, pw, fname, lname, ph, email, disabled) VALUES
('aaa', '1111', 'Richard', 'Choi', '010-1234', 'abcd@a.com', 0),
('bbb', '222', 'Olivia', 'Kim', '017-9999', 'zz@b.com', 0),
('ccc', '33', 'Rose', 'Park', '019-6788', 'vvv@c.com', 1),
('d', '4', 'C++', 'Lee', '054-123', 'a@a.com', 0),
('e', '55', 'Python', 'Ryu', '02-88', 'b@b.com', 0),
('f', '666', 'Java', 'Jo', '070-876', 'c@c.com', 1);

2. CRUD 요약
더보기
-- [CREATE: 회원 추가]
INSERT INTO Members (id, pw, fname, lname, ph, email, disabled)
VALUES ('hacker', '1234', 'Eve', 'Hacker', '010-0000', 'eve@hacker.com', 0);
-- [READ: 전체 회원 목록 조회]
SELECT code, id, pw, fname, lname, ph, email, disabled FROM Members;
-- [UPDATE: 회원 비밀번호 변경]
UPDATE Members SET pw = 'newpass' WHERE id = 'e';
-- [DELETE: 회원 삭제]
DELETE FROM Members WHERE id = 'hacker';
3. CREATE (INSERT) : 회원 추가 (1)
더보기
1. INSERT 쿼리
-- 새로운 회원 추가 (예: id='hacker', pw='1234', 이름='Eve', 성='Hacker')
INSERT INTO Members (id, pw, fname, lname, ph, email, disabled)
VALUES ('hacker', '1234', 'Eve', 'Hacker', '010-0000', 'eve@hacker.com', 0);
2. INSERT C언어 사용 예제(1) - insert_member 함수(회원 추가)
void insert_member( MYSQL *conn,
const char *id,
const char *pw,
const char *fname,
const char *lname,
const char *ph,
const char *email,
int disabled )
{
// [1] 쿼리문 저장용 버퍼 준비
char sql[512];
// [2] 쿼리문 조립: 전달받은 파라미터를 쿼리문에 삽입
snprintf( sql, sizeof(sql),
"INSERT INTO Members (id, pw, fname, lname, ph, email, disabled) VALUES "
"('%s', '%s', '%s', '%s', '%s', '%s', %d);",
id,
pw,
fname,
lname,
ph,
email,
disabled);
// [3] 쿼리 실행 (실패 시 에러 메시지 출력)
if (mysql_query(conn, sql)) {
fprintf(stderr, "INSERT failed: %s\n", mysql_error(conn));
}
}
mysql_query(conn, query)
공식문서 링크 MySQL :: MySQL 8.0 C API Developer Guide :: 5.4.57 mysql_query()MySQL 8.0 C API Developer Guide / ... / C API Basic Interface / C API Basic Function Descriptions / mysql_query() int mysql_query(MYSQL *mysql, const char *stmt_str) Execut
basiclike.tistory.com
4. CREATE (INSERT) : 회원 추가 (2) /w 구조체
더보기
1. INSERT C언어 사용 예제(2) - insert_member_struct 함수(구조체를 이용한 회원 추가)
// 회원정보 구조체 선언
typedef struct {
char id[13]; // 사용자 ID (VARCHAR(12) + '\0')
char pw[19]; // 비밀번호 (VARCHAR(18) + '\0')
char fname[51]; // 이름 (First Name)
char lname[51]; // 성 (Last Name)
char ph[21]; // 전화번호
char email[101]; // 이메일
int disabled; // 비활성 여부 (0:활성, 1:비활성)
} Member;
void insert_member_struct( MYSQL *conn, // MySQL 연결 객체
const Member *mem ) // 추가할 회원정보 구조체 포인터
{
// [1] 쿼리문 저장용 버퍼 준비
char sql[512];
// [2] INSERT 쿼리문 조립
snprintf( sql, sizeof(sql),
"INSERT INTO Members "
"(id, pw, fname, lname, ph, email, disabled) "
"VALUES ('%s', '%s', '%s', '%s', '%s', '%s', %d);",
mem->id,
mem->pw,
mem->fname,
mem->lname,
mem->ph,
mem->email,
mem->disabled );
// [3] 쿼리 실행 (실패 시 에러 메시지 출력)
if (mysql_query(conn, sql)) {
fprintf(stderr, "INSERT failed: %s\n", mysql_error(conn));
}
}
int main(void) {
MYSQL *conn = mysql_init(NULL);
// ... (이하 DB 코드 생략)
// 회원정보 구조체 변수 선언 및 값 대입
Member m = {"aaa", "1111", "홍", "길동", "010-1111", "aaa@a.com", 0};
// 구조체 기반 INSERT 호출
insert_member_struct(conn, &m);
mysql_close(conn);
return 0;
}
5. 소스코드
더보기
/*
* mysql_insert_test.c
*
* Ubuntu에서 C 언어로 MySQL에 접속하여
* Members 테이블을 구조체로 삽입하는 예제
*
* 컴파일 명령어:
* gcc mysql_insert_test.c -o mysql_insert_test \
* $(mysql_config --cflags) $(mysql_config --libs)
*
* 실행:
* ./mysql_insert_test
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysql/mysql.h>
// [1] DB 연결 정보 매크로
#define DB_HOST "localhost"
#define DB_USER "root"
#define DB_PASS "1234"
#define DB_NAME "sqldb"
#define DB_PORT 3306
#define DB_SOCKET NULL
#define DB_CLIENT_FLAGS 0
// [2] 회원정보 구조체 선언
typedef struct {
char id[13]; // [2-1] 사용자 ID (VARCHAR(12) + '\0')
char pw[19]; // [2-2] 비밀번호 (VARCHAR(18) + '\0')
char fname[51]; // [2-3] 이름
char lname[51]; // [2-4] 성
char ph[21]; // [2-5] 전화번호
char email[101]; // [2-6] 이메일
int disabled; // [2-7] 비활성 여부 (0:활성, 1:비활성)
} Member;
// [3] 구조체 기반 회원 추가 함수
void insert_member_struct(MYSQL *conn, const Member *mem) {
char sql[512];
// [3-1] INSERT 쿼리문 조립
snprintf(sql, sizeof(sql),
"INSERT INTO Members "
"(id, pw, fname, lname, ph, email, disabled) "
"VALUES ('%s', '%s', '%s', '%s', '%s', '%s', %d);",
mem->id,
mem->pw,
mem->fname,
mem->lname,
mem->ph,
mem->email,
mem->disabled
);
// [3-2] 쿼리 실행 (실패 시 에러 메시지 출력)
if (mysql_query(conn, sql)) {
fprintf(stderr, "[3-2] INSERT failed: %s\n", mysql_error(conn));
} else {
printf("[3-2] 회원정보가 성공적으로 추가되었습니다.\n");
}
}
int main(void) {
MYSQL *conn;
// [4] MySQL 연결 관련 변수
// [5] MySQL 객체 초기화
conn = mysql_init(NULL);
if (!conn) {
fprintf(stderr, "[5] mysql_init() failed\n");
return EXIT_FAILURE;
}
// [6] 데이터베이스 연결
if (!mysql_real_connect(conn,
DB_HOST,
DB_USER,
DB_PASS,
DB_NAME,
DB_PORT,
DB_SOCKET,
DB_CLIENT_FLAGS)) {
fprintf(stderr, "[6] mysql_real_connect() failed:\n %s\n", mysql_error(conn));
mysql_close(conn);
return EXIT_FAILURE;
}
// [7] 회원정보 구조체 변수 선언 및 값 대입
Member m;
strcpy(m.id, "c언어");
strcpy(m.pw, "c++socket");
strcpy(m.fname, "지능");
strcpy(m.lname, "인공");
strcpy(m.ph, "011-2025");
strcpy(m.email, "LMS@email.com");
m.disabled = 0;
// [8] 구조체 기반 INSERT 호출
insert_member_struct(conn, &m);
// [9] DB 연결 종료
mysql_close(conn);
return 0;
}
6. snprintf