안녕하세요~ 코딩하다보니.. 별 거지같은 소스를 만들었는데...
이거나마 도움이 되시라고 소스코드를 올립니다.
참고로 여기서 변수사용은 전역변수 지역변수 여기저기 혼용했는데..
정리할까 생각하다가 그냥 귀찮아서.. 그냥 두었습니다.
그냥 알고리즘 부분만 유심히 보시면 괜찮을 것 같군요.
키값하나만으로도 몇번째 페이지인지.. 리플글은 있는지 다 확인이
되게 만들었거든요.(sql db고치기 귀찮아서.. 그냥 하나로 되게
만듬.. 정말 게을러서리.. //;)
하여간 올립니다요.
#include <stdio.h>
#include <string.h>
#include "libpq/fe.h"
#include "qDecoder.h"
#define LINE 10
#define DB "wboard"
void go(PGresult *result, int page, int flag);
int printline(PGresult *result, int num, int re, int page);
static void exit_nicely(PGconn *conn);
char *pghost, *pgport, *pgoptions, *pgtty, *dbName, *login, *pwd;
char *table, *search;
PGconn *pc119;
char imsi[200];
int page, i, pg=0, search_flag=0;
long count=0;
int nTups, lpage;
void go(PGresult *result, int page, int flag)
{
int i1, re1;
char temp[200];
PGresult *res1;
for (i1 = 0; i1 < PQntuples(result); i1++)
{
sprintf(temp, "%s", PQgetvalue(result,i1,5));
re1=atoi(temp); // re의 1000단위 부분은 리플을 가지고있는지.. 1단위는 리플레벨
if (PQgetvalue(result,i1,5)==NULL) re1=0;
if (re1==flag)
{
if (printline(result, i1, re1, page)==0) return;
}
else if ((re1 / 1000)==1)
{
if ((re1/1000)==flag){
if (printline(result, i1, (re1/1000), page)==0) return;
}
sprintf(temp, "select num, name, email, subject, renum, re, date, count from %s where renum=%s order by num DESC",table ,PQgetvalue(result,i1,0));
res1=PQexec(pc119, temp);
go(res1, page, flag+1);
continue;
}
}
}
int printline(PGresult *res, int num, int re, int page) // num은 셀렉트한 문장의 순서고 글번호는 아니다. re는 리플정도.
{
int i2,i3;
char cc[10];
pg++;
if (pg <= (page*LINE)) return 1;
if (count==LINE) return 0;
printf("<tr><td><font size=2><p align="center">%ld</font></td><td><font size=2><p><A HREF="/cgi/bin/view.cgi?db=%s&num=%s">",(long)nTups/(count+page*10),table ,PQgetvalue(res,num,0));
for (i2=0; i2<re; i2++)
{
if (i2==0)
{
for (i3=0; i3<re; i3++)
{
printf(" "); // 들여쓰기 리플레벨까지..
}
printf("[re]");
continue;
}
printf("[re]"); // 리플정도까지 [re]표시..
}
printf("%s</A></font></td>",PQgetvalue(res,num,3));
printf("<td><font size=2><p align=center> <A HREF="mailto:%s">%s</a> </font></td>",PQgetvalue(res,num,2),PQgetvalue(res,num,1));
strncpy(cc,PQgetvalue(res,num,6),10);
printf("<td><font size=2><p align=center> %10s </font></td><td><font size=2><p align=center> %s </font></td></tr>",cc,PQgetvalue(res,num,7));
count++;
return /1;
}
static void exit_nicely(PGconn *conn)
{
PQfinish(conn);
qFree();
exit(1);
}
int main()
{
PGresult *res;
char temp[200];
int j;
qContentType("text/html");
qDecoder();
table=qValue("db");
search=qValue("s_cont");
sprintf(imsi,search);
if (imsi[0]!=0x00)
{
search_flag=search_flag+1;
}
search=qValue("s_name");
sprintf(imsi,search);
if (imsi[0]!=0x00)
{
search_flag=search_flag+2;
}
search=qValue("s_sub");
sprintf(imsi,search);
if (imsi[0]!=0x00)
{
search_flag=search_flag+4;
}
search=qValue("search");
pghost = NULL;
pgport = NULL;
pgoptions = NULL;
pgtty = NULL;
dbName = DB;
login = "postgres";
pwd = NULL;
printf("<!DOCTYPE HTML PUBLIC "///W3C//DTD HTML 4.0//EN">\n");
printf("<html><head><title>번호</title></head><body bgcolor=black text=white link=white vlink=#FFCC33 alink=red>");
pc119 = PQsetdbLogin(pghost, pgport, pgoptions, pgtty, dbName, login, pwd);
if (PQstatus(pc119) == CONNECTION_BAD)
{
printf("'%s'DB의 접속에 실패했습니다.<br>", DB);
printf("%s", PQerrorMessage(pc119));
exit_nicely(pc119);
}
switch (search_flag)
{
case 0 : sprintf(imsi,"select num from %s",table); break;
case 1 : sprintf(imsi,"select num from %s where content like '%%%s%%'",table,search); break;
case 2 : sprintf(imsi,"select num from %s where name like '%%%s%%'",table,search); break;
case 4 : sprintf(imsi,"select num from %s where subject like '%%%s%%'",table,search); break;
case 3 : sprintf(imsi,"select num from %s where name like '%%%s%%' or content like '%%%s%%'",table,search,search); break;
case 5 : sprintf(imsi,"select num from %s where content like '%%%s%%' or subject like '%%%s%%'",table,search,search); break;
case 6 : sprintf(imsi,"select num from %s where subject like '%%%s%%' or name like '%%%s%%'",table,search,search); break;
case 7 : sprintf(imsi,"select num from %s where content like '%%%s%%' or subject like '%%%s%%' or id like '%%%s%%' or name like '%%%s%%'",table,search,search,search,search); break;
default : sprintf(imsi,"select num from %s",table); break;
}
res = PQexec(pc119, imsi);
nTups = PQntuples(res); // 게시물의 숫자
sprintf(temp, "%s", qValue("page"));
if (temp==NULL) page=0;
else page=atoi(temp);
switch (search_flag)
{
case 0 : sprintf(imsi,"select num, name, email, subject, renum, re, date, count from %s order by num DESC",table); break;
case 1 : sprintf(imsi,"select num, name, email, subject, renum, re, date, count from %s where content like '%%%s%%' order by num DESC",table,search); break;
case 2 : sprintf(imsi,"select num, name, email, subject, renum, re, date, count from %s where name like '%%%s%%' order by num DESC",table,search); break;
case 4 : sprintf(imsi,"select num, name, email, subject, renum, re, date, count from %s where subject like '%%%s%%' order by num DESC",table,search); break;
case 3 : sprintf(imsi,"select num, name, email, subject, renum, re, date, count from %s where name like '%%%s%%' or content like '%%%s%%' order by num DESC",table,search,search); break;
case 5 : sprintf(imsi,"select num, name, email, subject, renum, re, date, count from %s where content like '%%%s%%' or subject like '%%%s%%' order by num DESC",table,search,search); break;
case 6 : sprintf(imsi,"select num, name, email, subject, renum, re, date, count from %s where subject like '%%%s%%' or name like '%%%s%%' order by num DESC",table,search,search); break;
case 7 : sprintf(imsi,"select num, name, email, subject, renum, re, date, count from %s where content like '%%%s%%' or subject like '%%%s%%' or id like '%%%s%%' or name like '%%%s%%' order by num DESC",table,search,search,search,search); break;
default : sprintf(imsi,"select num from %s",table); break;
}
res = PQexec(pc119, imsi);
printf("<table border=0 cellpadding=0 cellspacing=0><tr><td colspan=2> <img src="/%s.gif"></td></tr><tr><td width=22></td><td><table border=0 cellpadding=3 cellspacing=0><tr><td colspan=5><font size=2><p align=right>",table);
lpage=((nTups/1) / LINE);
for (j=0; j < lpage+1 ; j++) // 페이지 숫자 파악
{
if (page!=j) printf("<A HREF="/cgi/bin/list.cgi?db=%s&page=%d">%d</A> ", table, j, (j+1));
else printf("%d ", (j+1));
}
printf("</font></td></tr>");
printf("<tr><td><font size=2><p align=center>번호</p></font></td>");
printf("<td width=377><p align=center><font size=2>제목</font></p></td>");
printf("<td><font size=2><p align=center>이름</p></font></td>");
printf("<td><font size=2><p align=center>날짜</p></font></td>");
printf("<td><font size=2><p align=center>조회</p></font></td></tr>");
printf("<tr><td colspan=5 bgcolor=#999999 height=1></td></tr>");
go(res, page, 0);
printf("<tr><td colspan=5> </td></tr></table>");
printf("<table border=0 cellpadding=0 cellspacing=0><tr><td><form method=post action=/cgi/bin/list.cgi?db=%s></td></tr><td width=200></td><td><font size=2><input type=checkbox name=s_name value=name>이름<br>",table);
printf("<input type=checkbox name=s_sub value=subject>제목<br><input type=checkbox name=s_cont value=content cheched>내용</font></td><td width=380> <input type=text name=search size=16 maxlength=16>");
printf(" <input type=submit name=Submit value=찾기></td></tr>");
if (page==0) printf("<td colspan=3 align=center><A HREF="/cgi/bin/list.cgi?db=%s"><img src="/before.gif" border=0></A>",table);
else printf("<tr><td colspan=3 align=center><A HREF="/cgi/bin/list.cgi?db=%s&page=%d"><img src="/before.gif" border=0></A>",table, (page/1));
printf("<A HREF="/cgi/bin/preins.cgi?db=%s"><img src="/write.gif" border=0></A>",table);
if (page==lpage) printf("<A HREF="/cgi/bin/list.cgi?db=%s&page=%d"><img src="/next.gif" border=0></A></td></tr>",table, lpage);
else printf("<A HREF="/cgi/bin/list.cgi?db=%s&page=%d"><img src="/next.gif" border=0></A></td></tr>", table, (page+1));
printf("</table></td></table></body></html>");
PQfinish(pc119);
qFree();
return 0;
}
눈여겨 봐야할부분은 go()밖에 없습니다. //;
게시물 왕창 늘어나면 루프열라게 돌기때문에 느려질지도 모릅니다. //;
행복하세요~
|