Mysql C API를 이용한 초간단 회원 관리

chongnux의 이미지

씨언어 수업하다가 생각이 나서 교육용으로 한번 맹글어 봤습니다. ㅋㅋ

[ 튜터리얼 ]
http//ilinuxbay.com/contentChannel/article.php?scol_serial=1761&aca_idx=3

걍. 소스만 보실 분은..
[ 소스 ]

/*________________________________________________________________________
* 작성자 윤영한 (shee@ilinuxbay.com)
* 작성일 2003. 08. 25. (월) 133642 KST
* 화일명 mysql_member.c
* 내 용 유저에 대한 정보를 MYSQL C API를 이용
* 해서 관리한다.
* 참 조 Teach Yourself C week 기본 골격을 이용
* 수업용 교재로 이용 활용 가능성 구현
* - 모듈화 및 중복성 배제
* - http//ilinuxbay.com/
*
* MYSQL
*
* CREATE TABLE `member` (
* `idx` int(11) NOT NULL auto_increment,
* `id` varchar(20) NOT NULL default '',
* `name` varchar(20) NOT NULL default '',
* `email` varchar(50) NOT NULL default '',
* PRIMARY KEY (`idx`)
* ) TYPE=MyISAM
*
* HOWTO COMPILE
* gcc -o mysql_member mysql_member.c -I/usr/local/mysql/include/mysql \
* -L/usr/local/mysql/lib/mysql -lmysqlclient -lz -lcrypt -lnsl -lm
* ______________________________________________________________________*/

//라이브러리 선언
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<mysql.h>
#include<sys/time.h>

//상수정의
#define YES 1
#define NO 0
#define MYSQL_HOST "localhost"
#define MYSQL_USER "root"
#define MYSQL_PWD ""
#define MYSQL_DB "work"

//쿼리 정의
#define SELECT_QUERY "SELECT idx, id, name, email FROM `member`"
#define INSERT_QUERY "INSERT INTO `member` ( `idx` , `id` , `name` , `email` ) VALUES ( '', '%s', '%s', '%s' )"
#define DELETE_QUERY "DELETE FROM `member` WHERE idx='%s'"
#define UPDATE_QUERY "UPDATE `member` SET `id` = '%s',`name` = '%s',`email` = '%s' WHERE `idx` = '%s'"
#define SEARCH_QUERY "SELECT idx, id, name, email FROM `member` WHERE name LIKE '%s'"

//변수정의
struct user {
char idx[20];
char id[20];
char name[20];
char email[50];
}member;

MYSQL_RES *res;
MYSQL_ROW row;
MYSQL *conn, mysql;
char qbuf[160]; //최대 쿼리의 사이즈 만큼 할당한다.

//함수원형

void conn_mysql(void);
void user_list(void);
void user_input(void);
void user_modify(void);
void user_del(void);
void user_search(void);
int continue_fun(void);
int display_menu(void);

//MAIN 함수
int main(){

//지역변수선언
int cont = YES;

//데이터 베이스를 초기화 해서 connection을 얻어 온다.
conn_mysql();

//메뉴 출력
while( cont == YES){
switch( display_menu()){
case '1' user_list();
break;
case '2' user_input();
break;
case '3' user_modify();
break;
case '4' user_del();
break;
case '5' user_search();
break;
case '6' printf("\n프로그램 종료 !\n");
cont = NO;
break;
default printf("\n\n메뉴중 1~6 사이의 번호를 선택해 주세요.");
break;
}//__end switch
}//__end while

//데이터 베이스의 결과를 메모리에서 해지한다.
mysql_free_result(res);

//데이터 베이스 연결을 닫는다.
mysql_close(conn);
return(0);
}

//함수선언
// 데이터 베이스 초기화 conn_mysql()
void conn_mysql(void){
mysql_init(&mysql);
conn = mysql_real_connect(&mysql,MYSQL_HOST,MYSQL_USER,MYSQL_PWD,MYSQL_DB,0,0,0);

if(conn == NULL){
fprintf(stderr,"데이터 베이스 연결 실패 %s\n",mysql_error(&mysql));
exit(1);
}
}

//사용자 리스트를 출력 user_list()
void user_list(void){
puts("___________________________________________________________________");
puts("idx ID 이름 이메일");
puts("-------------------------------------------------------------------");

//MYSQL에 질의
if((res = mysql_query(conn,SELECT_QUERY)) != NULL){
fprintf(stderr,"질의 실패 %s\n",mysql_error(conn));
exit(1);
}
//질의를 한 결과를 출력한다.
res = mysql_store_result(conn);

while((row = mysql_fetch_row(res)) != NULL){
printf("%-6s %-10s %-20s %-50s \n",row[0],row[1],row[2],row[3]);
}
}

//사용자 정보 입력 user_input()
void user_input(void){

puts("___________________________________________________________________");
puts(" 사용자 입력");
puts("-------------------------------------------------------------------");
printf(" 사용자 ID ");
fgets(member.id,sizeof(member.id),stdin);
member.id[strlen(member.id)-1]='\0';

printf(" 사용자 이름 ");
fgets(member.name,sizeof(member.name),stdin);
member.name[strlen(member.name)-1]='\0';

printf(" 사용자 이메일 ");
fgets(member.email,sizeof(member.email),stdin);
member.email[strlen(member.email)-1]='\0';

//입력 받은 데이터를 이용 쿼리를 생성
sprintf(qbuf,INSERT_QUERY,member.id,member.name,member.email);

if(mysql_query(conn,qbuf)){
fprintf(stderr,"질의 실패 %s\n",mysql_error(conn));
exit(1);
}
}

//사용자 정보 수정 user_modify()
void user_modify(void){


puts("___________________________________________________________________");
puts(" 사용자 수정");
puts("-------------------------------------------------------------------");
printf("수정의 원하는 idx ");
fgets(member.idx,sizeof(member.idx),stdin);
member.id[strlen(member.idx)-1]='\0';

printf(" 사용자 ID ");
fgets(member.id,sizeof(member.id),stdin);
member.id[strlen(member.id)-1]='\0';

printf(" 사용자 이름 ");
fgets(member.name,sizeof(member.name),stdin);
member.name[strlen(member.name)-1]='\0';

printf(" 사용자 이메일 ");
fgets(member.email,sizeof(member.email),stdin);
member.email[strlen(member.email)-1]='\0';

//입력 받은 데이터를 이용 쿼리를 생성
sprintf(qbuf,UPDATE_QUERY,member.id,member.name,member.email,member.idx);

if(mysql_query(conn,qbuf)){
fprintf(stderr,"질의 실패 %s\n",mysql_error(conn));
exit(1);
}
}

//사용자 정보 삭제 user_del()
void user_del(void){

puts("___________________________________________________________________");
puts(" 사용자 삭제");
puts("-------------------------------------------------------------------");
printf("삭제를 원하는 idx ");
fgets(member.idx,sizeof(member.idx),stdin);
member.id[strlen(member.idx)-1]='\0';

//입력 받은 데이터를 이용 쿼리를 생성
sprintf(qbuf,DELETE_QUERY,member.idx);

if(mysql_query(conn,qbuf)){
fprintf(stderr,"질의 실패 %s\n",mysql_error(conn));
exit(1);
}
}

//사용자 정보 검색 user_search()
void user_search(void){

puts("___________________________________________________________________");
puts(" 사용자 검색");
puts("-------------------------------------------------------------------");
printf("이름으로 검색 name ");
fgets(member.name,sizeof(member.name),stdin);
member.name[strlen(member.name)-1]='\0';
strcat(member.name,"%");

//입력 받은 데이터를 이용 쿼리를 생성
sprintf(qbuf,SEARCH_QUERY,member.name);

if(mysql_query(conn,qbuf)){
fprintf(stderr,"질의 실패 %s\n",mysql_error(conn));
exit(1);
}

//질의를 한 결과를 출력한다.
res = mysql_store_result(conn);
puts("");
puts("___________________________________________________________________");
puts("idx ID 이름 이메일");
puts("-------------------------------------------------------------------");

while((row = mysql_fetch_row(res)) != NULL){
printf("%-6s %-10s %-20s %-50s \n",row[0],row[1],row[2],row[3]);
}
}

//프로그램 진행 체크 함수 menu_continue()

int continue_fun(void){
char ch, buf[20];
do{
printf("\n계속 하시겠습니까 ? (Y)es/(N)o ");
fgets(buf,sizeof(buf),stdin);
ch = *buf;

}while(strchr("NnYy",ch) == NULL);

if(ch == 'n' || ch == 'N'){
return(NO);
}else{
return(YES);
}
}

//메뉴 선택 함수 display_menu()
int display_menu(void){
char ch, buf[20];
puts("");
puts(" MENU ");
puts("_______________");
puts("");
puts("1. 사용자 리스트");
puts("2. 사용자 입력 ");
puts("3. 사용자 수정 ");
puts("4. 사용자 삭제 ");
puts("5. 사용자 검색 ");
puts("6. 종료 ");
printf("\n\n 메뉴 선택 ");
fgets(buf,20,stdin);
ch = *buf;
return(ch);
}

Forums: 

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.