*/ function printrow($pgdb, $row, $url, $num, $depth, $issearch = null){ global $keyword, $arrkeyword; $depthstr = ""; for($i = 1; $i < $depth; $i++){ $depthstr .= " "; } if($depth) $depthstr .= "┕>"; if($issearch) $row = pg_fetch_object($pgdb->exec("execute getrow($row->id)"),0); // keyword highlighting if($keyword){ $row->name = highlight($row->name, $arrkeyword); $row->subject = highlight($row->subject, $arrkeyword); } if($row->deleted){ echo "\n"; if($depth < 1) echo "$num\n"; else echo " \n"; echo "$depthstr(삭제되었음)       \n"; } else{ echo "\n"; if($depth < 1) echo "$num\n"; else echo " \n"; echo "$depthstr$row->subject$row->comments $row->name $row->cdate $row->reads \n"; } } // 권한 체크 $allowgroups = split(",", ereg_replace("[{}]", "",$menuinfo->lgroups)); $ispermit = false; // 관리자면 무조건 OK if($userinfo->groups[1]){ $ispermit = true; } // 아무나면 무조건 OK if($allowgroups[0] == ""){ $ispermit = true; } foreach($allowgroups as $allowgroup){ if($ispermit) break; if($userinfo->groups[$allowgroup]) { $ispermit = true; } } if(! $ispermit){ $errormsg = "

접근 권한 없음

\n"; $errormsg .= "이 작업은 오직 " . getGroupNames($pgdb,$allowgroups) . " 그룹 회원들만 허용합니다.

"; include("html/error.php"); exit; } /* 리스팅 알고리즘. 1. [1][2][3][4]... 페이징을 구현하기 위해서, 최대 페이지 링크갯수를 만들어낼 수 있을 만큼 미리 다 구하고, offset 값이 커지는 기존 방식을 포기함 - PostgreSQL에서는 offset 값이 커지면 속도가 떨어짐 2. 해당 페이지 부분에서만 보여준다. 3. 해당 페이지를 보여줄 때는 prepare 구문을 이용한다. */ $sfield || $sfield = "id"; if(! $sdesc){ if($sfield == "subject") $sdesc = "asc"; if($sfield == "id") $sdesc = "desc"; if($sfield == "reads") $sdesc = "desc"; if($sfield == "name") $sdesc = "asc"; } if($sdesc == "desc") { $strdesc = "↓"; $newsdesc = "asc"; } else { $strdesc = "↑"; $newsdesc = "desc"; } // 서브 섹션 만들기 $res = $pgdb->exec("select * from menus where criteria = '$criteria' and subcrit <> '' order by sortnum"); $i = 0; $subcrits = ""; $havesubcrit = false; $nothadsub = false; while($subrow = @pg_fetch_object($res,$i++)){ if($i > 1) $subcrits .= " | "; if($subcrit != $subrow->subcrit) { if((!$subcrit) && (! $keyword) && ($subrow->subcrit == "qna")) { $nothadsub = true; $subcrit = "qna"; $subcrits .= ""; } else $subcrits .= ""; } else $subcrits .= ""; $subcrits .= str_replace("&", "&", $subrow->name); if($subcrit != $subrow->subcrit) { if((!$subcrit) && (! $keyword) && ($subrow->subcrit == "qna")) $subcrits .= ""; else $subcrits .= ""; } else $subcrits .= ""; $havesubcrit = true; } if($havesubcrit && $nothadsub){ $subcritinfo = pg_fetch_object($pgdb->exec("select * from menus where criteria = '$criteria' and subcrit = 'qna'"),0); $menuinfo = $subcritinfo; $worktable = "bd_$critinfo->menuid"; } echo "
\n"; echo "
" ; echo str_replace("&", "&", "$critinfo->name $subcritinfo->name $incname"); echo "
\n"; echo $subcrits; echo "
\n"; // prepare 정의 $pgdb->exec("prepare getrow(int) as select id,subject,name, case when cdate > (abstime(now())::int - (60 * 60 * 48)) then '' || to_char(abstime(cdate),'YYYY-MM-DD') || '' else to_char(abstime(cdate),'YYYY-MM-DD') end as cdate,to_char(reads,'FM999,999,999,999') as reads, case when comments > 0 then case when commdate > (abstime(now())::int - (60 * 60 * 48)) then ' [' || comments || ']' else ' [' || comments || ']' end else ''::text end as comments,deleted from $worktable where id = $1"); $columns_for_list = "id,subject,name, case when cdate > (abstime(now())::int - (60 * 60 * 48)) then '' || to_char(abstime(cdate),'YYYY-MM-DD') || '' else to_char(abstime(cdate),'YYYY-MM-DD') end as cdate,to_char(reads,'FM999,999,999,999') as reads, case when comments > 0 then case when commdate > (abstime(now())::int - (60 * 60 * 48)) then ' [' || comments || ']' else ' [' || comments || ']' end else ''::text end as comments,deleted, crows"; $pgdb->exec("prepare getthreadrow(int) as select depth, $columns_for_list from getthread('$worktable', $1, 1) as t(depth int,id int,subject text, name text, cdate int, reads int, comments int, commdate int, deleted int, crows int)"); // 초기값 $page || $page = 1; $limit || $limit = 20; $maxlink || $maxlink = 10; if($menuinfo->menutype == 2 || $keyword){ if($isback) { $wherestr = "> $id"; $newlimit = $limit * $maxlink; } else { $wherestr = "<= $id"; $newlimit = $limit * $maxlink + 1; } // 일반 리스팅 & 검색 리스팅 if($keyword){ if($arrkeyword[0]){ if(count($arrkeyword) < 2){ $arrkeyword[0] = str_replace("_", '\\\\_', $arrkeyword[0]); $search_query = "select distinct k as id from bd_" . $critinfo->menuid . "_fti where v like '" . $arrkeyword[0] . "%' order by k desc"; } else{ $i = 0; $search_query = ""; foreach($arrkeyword as $searchstr){ $searchstr = str_replace("_", '\\\\_', $searchstr); if($i) $search_query .= " intersect "; $search_query .= "select k as id from bd_" . $critinfo->menuid . "_fti where v like '$searchstr%'"; $i++; } $search_query .= " order by id desc"; } $res = $pgdb->exec($search_query); $search_total = pg_num_rows($res); $maxrow = pg_num_rows($res); } else { $maxrow = 0; } } else { $maxrow = 0; if($menuinfo->total){ if($isback){ $res = $pgdb->exec("select $columns_for_list from $worktable where id $wherestr and topic = '$subcritinfo->subcrit' and pid = 0 order by id limit $newlimit"); } else{ // 일반 리스팅 기본 // 일단 시작 id를 구한다. if(! $id){ if($sfield == "id") { if($sdesc == "desc") $startid = $menuinfo->lastid; else $startid = 0; } /* 게시물 정렬을 자유롭게 해보려다 실패함 elseif($sfield == "subject") list($startid) = @pg_fetch_row($pgdb->exec("select id from $worktable where topic = '$subcritinfo->subcrit' and pid = 0 and deleted = 0 order by subject $sdesc , id $sdesc limit 1"),0); elseif($sfield == "name") list($startid) = @pg_fetch_row($pgdb->exec("select id from $worktable where topic = '$subcritinfo->subcrit' and pid = 0 and deleted = 0 order by name $sdesc , id $sdesc limit 1"),0); elseif($sfield == "reads") list($startid) = @pg_fetch_row($pgdb->exec("select id from $worktable where topic = '$subcritinfo->subcrit' and pid = 0 and deleted = 0 order by reads $sdesc , id $sdesc limit 1"),0); */ } else { $startid = $id; } if($sfield == "id"){ if($sdesc == "desc") $wherestr = "id <= $startid"; else $wherestr = "id > $startid"; $orderby = "id $sdesc"; } /* 정렬 부분 주석 - 사용안함 elseif($sfield == "subject"){ if($sdesc == "desc") $wherestr = "subject <= (select subject from $worktable where id = $startid) "; else $wherestr = "subject >= (select subject from $worktable where id = $startid) "; $orderby = "subject $sdesc, id $sdesc"; } elseif($sfield == "name"){ if($sdesc == "desc") $wherestr = "name <= (select name from $worktable where id = $startid) "; else $wherestr = "name >= (select name from $worktable where id = $startid) "; $orderby = "name $sdesc, id $sdesc"; } elseif($sfield == "reads"){ if($sdesc == "desc") $wherestr = "reads <= (select reads from $worktable where id = $startid) "; else $wherestr = "reads >= (select reads from $worktable where id = $startid) "; $orderby = "reads $sdesc, id $sdesc"; } */ $newlimit = $limit * $maxlink + 1; //$res = $pgdb->exec("select id,subject,comments, crows from $worktable where $wherestr and topic = '$subcritinfo->subcrit' and pid = 0 order by $orderby limit $newlimit"); $res = $pgdb->exec("select $columns_for_list from $worktable where $wherestr and topic = '$subcritinfo->subcrit' and pid = 0 order by $orderby limit $newlimit"); } $maxrow = pg_num_rows($res); } } if($search_total) { $origtotal = $critinfo->total; $origtotal2 = $search_total; $maxpage = (int)(($search_total - 1) / $limit) + 1; $menuinfo->total = $search_total; } else { $origtotal = $menuinfo->total; $origtotal2 = $menuinfo->maxpage; $maxpage = (int)(($menuinfo->maxpage - 1) / $limit) + 1; } echo "
"; if($keyword) { echo "검색어:  $interkeyword  검색결과: "; echo "전체게시물: " . number_format($origtotal) . "건"; } else{ echo "전체게시물: " . number_format($origtotal2) . "/" . number_format($origtotal) . "건"; } if($search_total) echo " 가운데 " . number_format($search_total) . "건 발견됨"; echo " | "; echo "Page: " . number_format($page) . " / " . number_format($maxpage) ; echo "
\n"; echo "
\n"; if($keyword) echo "[원래목록]"; else echo "새글 쓰기\n"; echo "
\n
\n"; echo "
\n"; if($search_total){ echo "\n"; } else { // 일반 리스팅 일 경우 정렬을 자유롭게 echo "\n\n"; $fieldarr = array("subject"=>"제목", "name"=>"작성자", "id" => "작성일", "reads" => "조회"); foreach($fieldarr as $fieldkey => $fieldname){ echo "\n"; } echo "\n"; } // echo "\n"; $isnext = false; $isprev = false; $linknum = (int)(($page - 1) / $maxlink); if($isback){ // 일단 startid 구한다. // 다음 offsetS, offsetE를구하고, // for문 $offsetS = 0; $endid = $id; if($page == $maxpage) { $offsetE = ($origtotal2-1) % $limit; list($startid) = pg_fetch_row($res, ($origtotal2 - 1) % ($limit * $maxlink)); } else { $offsetE = $limit - 1; if($maxrow == $limit * $maxlink + 1) list($startid) = pg_fetch_row($res, $maxrow - 2); else list($startid) = pg_fetch_row($res, $maxrow - 1); } $id = $startid; // 끝페이지는 시작부터 남아있는 페이지 - 1 $qq = $origtotal2 - ($page * $limit); if($qq < 0) $qq = 0; for($i=$offsetE;$i>=$offsetS;$i--){ $arcno = $i + 1 + $qq; //list($aId, $aCrows) = pg_fetch_row($res, $i); $arow = pg_fetch_object($res, $i); if($search_total) printrow($pgdb, $arow, "?inc=read&aid=$arow->id&criteria=$criteria&subcrit=$subcrit&id=$id&limit=$limit&keyword=$ukeyword&page=$page", $arcno , 0, true); else printrow($pgdb, $arow, "?inc=read&aid=$arow->id&criteria=$criteria&subcrit=$subcrit&id=$id&limit=$limit&keyword=$ukeyword&page=$page", $arcno , 0); if((! $keyword) && $arow->crows) { $res2 = $pgdb->exec("execute getthreadrow($arow->id)"); for($j=0;$jid&criteria=$criteria&subcrit=$subcrit&id=$id&limit=$limit&keyword=$ukeyword&page=$page", $arcno, $threadrow->depth); } } } } else { if($keyword) $offsetS = ($page - 1) * $limit; else $offsetS = (($page - 1) % $maxlink) * $limit; $offsetE = $offsetS + $limit - 1; if($maxrow){ list($startid) = pg_fetch_row($res, 0); list($endid) = pg_fetch_row($res, $maxrow -1); for($i=$offsetS;$i<=$offsetE;$i++){ if($keyword) $arcno = $origtotal2 - $i; else $arcno = $origtotal2 - $i - ($linknum * $limit * $maxlink); if($i > $maxrow - 1) break; //list($aId, $aCrows) = pg_fetch_row($res, $i); $arow = pg_fetch_object($res, $i); if($search_total) printrow($pgdb, $arow, "?inc=read&aid=$arow->id&criteria=$criteria&subcrit=$subcrit&id=$id&limit=$limit&keyword=$ukeyword&page=$page", $arcno , 0, true); else printrow($pgdb, $arow, "?inc=read&aid=$arow->id&criteria=$criteria&subcrit=$subcrit&id=$id&limit=$limit&keyword=$ukeyword&page=$page", $arcno , 0); if((! $keyword) && $arow->crows) { $res2 = $pgdb->exec("execute getthreadrow($arow->id)"); for($j=0;$jid&criteria=$criteria&subcrit=$subcrit&id=$id&limit=$limit&keyword=$ukeyword&page=$page", $arcno, $threadrow->depth); } } } } else { echo "\n"; } } echo "
No. 제목 작성자 작성일 조회
No."; /* if($sfield == $fieldkey) { echo $strdesc; echo ""; } else { echo ""; } */ echo $fieldname; //echo ""; echo "
해당자료 없음
"; include("ad.php"); echo "
\n"; if($maxrow){ echo "
\n"; include("lib/mknavi2.php"); echo "
\n"; } if($interkeyword){ list($endtime1, $endtime2) = split(" ", microtime()); $endtime1 += $endtime2; $pgdb->exec("insert into keywords (num, criteria, keyword, ctime, rtime) values (nextval('keywords_num_seq'), '$criteria', '$interkeyword', now(), '" . number_format($endtime1 - $starttime1, 3) . "')"); } } ?>