안녕하세용...
오라클용 게시판을 만들고 있는 오라클 초봄니당. -_-;
답변형 게시판을 구현할때 보통 4개 정도의 필드를 사용하고
리스트 출력할때도 그만큼 속도도 느린 알고리즘으로 되있는데 전 다른 방식으로
구현을 해 봤습니다.
답변형 게시판에 대해 많이 뒤져보다 보니 Index 키를 double형으로 해서 답변형 게시판을 구현을 한 사람이 있더군요...
저도 나름대로 index 를 double형으로 구현해 봤습니다.
이렇케 하면 좋은점은 글 쓰기를 할때는 약간 느려질지는 모르니만..
일반적으로 글 쓰기보다 리스트 보기가 히트가 많이 되므로.. 리스트 뿌려주는데
최상의 속도가 최고의 게시판이라고 생각합니다.
아래는 허접한 실력으로 구현한 글쓰기 부분이며
계층으로 리스트 뿌려줄때는 그냥 order by seq desc 일케 하면 됩니당.
아래 소스에서 허접한 부분이 있으리라 이 초보는 생각하는데... 정보 공유의 정신으로 올니니깐...
부족한 부분은 고수님들의 답변을 부탁드립니다.
if($exec == "okreply") {
$seq1 = explode(".", $seq); //소수점 구분
$seq2 = strlen($seq1[1]); //minus1 구하기
if($seq2 < 1) {
$seq3 = (int)($seq -1);
$seqx = $seq3.".";
} else {
$seq3 = substr($seq1[1],$seq2-1,1) -1;
//요것이 한계에 다다를때 에러나는 부분
if($seq3 < 1) { message("이 게시판은 더이상 답변할 수 없도록 설정 되어 있습니다.","Y"); exit;}
$seq4 = $seq1[0].".".substr($seq1[1],0,$seq2-1);
$seqx = $seq4.$seq3;
}
$s2 = $seqx."2";
$s3 = $seqx."3";
$s4 = $seqx."4";
$s5 = $seqx."5";
$s6 = $seqx."6";
$s7 = $seqx."7";
$s8 = $seqx."8";
$s9 = $seqx."9";
$que = "SELECT count(*) FROM $table_id WHERE
seq=$s2 or
seq=$s3 or
seq=$s4 or
seq=$s5 or
seq=$s6 or
seq=$s7 or
seq=$s8 or
seq=$s9 ";
$stmt = OCIParse($conn,$que);
OCIDefineByName($stmt,"COUNT(*)",&$count);
OCIExecute($stmt);
OCIFetch($stmt);
OCIFreeStatement($stmt);
$minus2 = $count + 1;
$minus1 = "";
while($seq2){
$minus1 .= "0";
$seq2 -= 1;
}
$minus = "0.".$minus1."$minus2";
$dseq = (double)($seq - $minus);
// 답변글 메일받기 일때
$que = "SELECT email,remail FROM $table_id where seq=$seq";
$stmt = OCIParse($conn,$que);
OCIDefineByName($stmt,"EMAIL",&$pre_email);
OCIDefineByName($stmt,"REMAIL",&$pre_remail);
OCIExecute($stmt);
OCIFetch($stmt);
OCIFreeStatement($stmt);
if($pre_remail) { ok_sendmail($pre_email); }
}
//답변이 아닌 그냥 글쓰기 일때
else {
$que = "SELECT seq FROM $table_id order by seq desc";
$stmt = OCIParse($conn,$que);
OCIDefineByName($stmt,"SEQ",&$temp);
OCIExecute($stmt);
OCIFetch($stmt);
OCIFreeStatement($stmt);
$dseq = (double)($temp + 1);
}
$que = "INSERT INTO $table_id VALUES(
$dseq,
'$name',
.
.
.
)";
$stmt = OCIParse($conn,$que);
OCIExecute($stmt);
OCIFreeStatement($stmt);
if ($conf[SENDMAIL]) { //관리자에게 메일 보내기
if(ok_sendmail($conf[EMAIL])) $message = "관리자에게 성공적으로 메일이 보내졌습니다. ";
}
--------------------------------- 디슨 생각
|