'; } } $sop = strtolower($sop); if ($sop != 'and' && $sop != 'or') $sop = 'and'; // 분류 선택 또는 검색어가 있다면 $stx = trim($stx); //검색인지 아닌지 구분하는 변수 초기화 $is_search_bbs = false; if ($sca || $stx || $stx === '0') { //검색이면 $is_search_bbs = true; //검색구분변수 true 지정 $sql_search = get_sql_search($sca, $sfl, $stx, $sop); // 가장 작은 번호를 얻어서 변수에 저장 (하단의 페이징에서 사용) $sql = " select MIN(wr_num) as min_wr_num from {$write_table} "; $row = sql_fetch($sql); $min_spt = (int)$row['min_wr_num']; if (!$spt) $spt = $min_spt; $sql_search .= " and (wr_num between {$spt} and ({$spt} + {$config['cf_search_part']})) "; // 원글만 얻는다. (코멘트의 내용도 검색하기 위함) // 라엘님 제안 코드로 대체 http://sir.kr/g5_bug/2922 $sql = " SELECT COUNT(DISTINCT `wr_parent`) AS `cnt` FROM {$write_table} WHERE {$sql_search} "; $row = sql_fetch($sql); $total_count = $row['cnt']; /* $sql = " select distinct wr_parent from {$write_table} where {$sql_search} "; $result = sql_query($sql); $total_count = sql_num_rows($result); */ } else { $sql_search = ""; $total_count = $board['bo_count_write']; } if(G5_IS_MOBILE) { $page_rows = $board['bo_mobile_page_rows']; $list_page_rows = $board['bo_mobile_page_rows']; } else { $page_rows = $board['bo_page_rows']; $list_page_rows = $board['bo_page_rows']; } if ($page < 1) { $page = 1; } // 페이지가 없으면 첫 페이지 (1 페이지) // 년도 2자리 $today2 = G5_TIME_YMD; $list = array(); $i = 0; $notice_count = 0; $notice_array = array(); // 공지 처리 if (!$is_search_bbs) { $arr_notice = explode(',', trim($board['bo_notice'])); $from_notice_idx = ($page - 1) * $page_rows; if($from_notice_idx < 0) $from_notice_idx = 0; // 유효한 공지 wr_id만 수집 (정수화로 SQL injection 방지) $notice_ids_int = array(); foreach ($arr_notice as $k_idx => $nid_raw) { $nid_int = (int) trim($nid_raw); if ($nid_int > 0) { $notice_ids_int[$k_idx] = $nid_int; } } // N+1 쿼리 제거: 공지 전체를 단일 IN 쿼리로 일괄 조회 $notice_rows_by_id = array(); if (!empty($notice_ids_int)) { $sql = " select * from {$write_table} where wr_id in (" . implode(',', $notice_ids_int) . ") "; $result = sql_query($sql); while ($nrow = sql_fetch_array($result)) { $notice_rows_by_id[$nrow['wr_id']] = $nrow; } } // 원래 bo_notice 순서대로 처리 (페이징 로직의 $k 인덱스 의미 보존) foreach ($notice_ids_int as $k => $nid) { if (!isset($notice_rows_by_id[$nid])) continue; $row = $notice_rows_by_id[$nid]; $notice_array[] = $row['wr_id']; if($k < $from_notice_idx) continue; $list[$i] = get_list($row, $board, $board_skin_url, G5_IS_MOBILE ? $board['bo_mobile_subject_len'] : $board['bo_subject_len']); $list[$i]['is_notice'] = true; $list[$i]['list_content'] = $list[$i]['wr_content']; // 비밀글인 경우 리스트에서 내용이 출력되지 않게 글 내용을 지웁니다. if (strstr($list[$i]['wr_option'], "secret")) { $list[$i]['wr_content'] = ''; } $list[$i]['num'] = 0; $i++; $notice_count++; if($notice_count >= $list_page_rows) break; } } $total_page = ceil($total_count / $page_rows); // 전체 페이지 계산 $from_record = ($page - 1) * $page_rows; // 시작 열을 구함 // 공지글이 있으면 변수에 반영 if(!empty($notice_array)) { $from_record -= count($notice_array); if($from_record < 0) $from_record = 0; if($notice_count > 0) $page_rows -= $notice_count; if($page_rows < 0) $page_rows = $list_page_rows; } // 관리자라면 CheckBox 보임 $is_checkbox = false; if ($is_member && ($is_admin == 'super' || $group['gr_admin'] == $member['mb_id'] || $board['bo_admin'] == $member['mb_id'])) $is_checkbox = true; // 정렬에 사용하는 QUERY_STRING $qstr2 = 'bo_table='.$bo_table.'&sop='.$sop; // 0 으로 나눌시 오류를 방지하기 위하여 값이 없으면 1 로 설정 $bo_gallery_cols = $board['bo_gallery_cols'] ? $board['bo_gallery_cols'] : 1; $td_width = (int)(100 / $bo_gallery_cols); // 정렬 // 인덱스 필드가 아니면 정렬에 사용하지 않음 //if (!$sst || ($sst && !(strstr($sst, 'wr_id') || strstr($sst, "wr_datetime")))) { if (!$sst) { $bo_allowed_sort_field = array(); if (function_exists('get_board_sort_fields')) { foreach (get_board_sort_fields($board) as $bo_sort_v) { $bo_allowed_sort_field[] = $bo_sort_v[0]; } } if ($board['bo_sort_field'] && in_array($board['bo_sort_field'], $bo_allowed_sort_field, true)) { $sst = $board['bo_sort_field']; } else { $sst = "wr_num, wr_reply"; $sod = ""; } } else { $board_sort_fields = get_board_sort_fields($board, 1); if (!$sod && array_key_exists($sst, $board_sort_fields)) { $sst = $board_sort_fields[$sst]; } else { // 게시물 리스트의 정렬 대상 필드가 아니라면 공백으로 (nasca 님 09.06.16) // 리스트에서 다른 필드로 정렬을 하려면 아래의 코드에 해당 필드를 추가하세요. // $sst = preg_match("/^(wr_subject|wr_datetime|wr_hit|wr_good|wr_nogood)$/i", $sst) ? $sst : ""; $sst = preg_match("/^(wr_datetime|wr_hit|wr_good|wr_nogood)$/i", $sst) ? $sst : ""; } } if(!$sst) $sst = "wr_num, wr_reply"; // 정렬 방향 화이트리스트 $sod = preg_match("/^(asc|desc)$/i", $sod) ? $sod : ''; if ($sst) { $sql_order = " order by {$sst} {$sod} "; } // 페이지의 공지개수가 목록수 보다 작을 때만 실행 $rows_to_process = array(); if ($page_rows > 0) { if ($is_search_bbs) { // 1차: 검색 결과의 wr_parent ID 목록 조회 $sql = " select distinct wr_parent from {$write_table} where {$sql_search} {$sql_order} limit {$from_record}, $page_rows "; $result = sql_query($sql); $parent_ids_in_order = array(); while ($id_row = sql_fetch_array($result)) { $pid = (int) $id_row['wr_parent']; if ($pid > 0) { $parent_ids_in_order[] = $pid; } } // 2차: N+1 쿼리 제거 - 단일 IN 쿼리로 전체 행 일괄 조회 if (!empty($parent_ids_in_order)) { $batch_sql = " select * from {$write_table} where wr_id in (" . implode(',', $parent_ids_in_order) . ") "; $batch_result = sql_query($batch_sql); $rows_by_id = array(); while ($br = sql_fetch_array($batch_result)) { $rows_by_id[$br['wr_id']] = $br; } // DISTINCT 쿼리의 원래 정렬 순서대로 재구성 foreach ($parent_ids_in_order as $pid) { if (isset($rows_by_id[$pid])) { $rows_to_process[] = $rows_by_id[$pid]; } } } } else { $sql = " select * from {$write_table} where wr_is_comment = 0 "; if(!empty($notice_array)) $sql .= " and wr_id not in (".implode(', ', $notice_array).") "; $sql .= " {$sql_order} limit {$from_record}, $page_rows "; $result = sql_query($sql); while ($row = sql_fetch_array($result)) { $rows_to_process[] = $row; } } } $k = 0; foreach ($rows_to_process as $row) { $list[$i] = get_list($row, $board, $board_skin_url, G5_IS_MOBILE ? $board['bo_mobile_subject_len'] : $board['bo_subject_len']); if (strstr($sfl, 'subject')) { $list[$i]['subject'] = search_font($stx, $list[$i]['subject']); } $list[$i]['is_notice'] = false; $list[$i]['list_content'] = $list[$i]['wr_content']; // 비밀글인 경우 리스트에서 내용이 출력되지 않게 글 내용을 지웁니다. if (strstr($list[$i]['wr_option'], "secret")) { $list[$i]['wr_content'] = ''; } $list_num = $total_count - ($page - 1) * $list_page_rows - $notice_count; $list[$i]['num'] = $list_num - $k; $i++; $k++; } g5_latest_cache_data($board['bo_table'], $list); $write_pages = get_paging(G5_IS_MOBILE ? $config['cf_mobile_pages'] : $config['cf_write_pages'], $page, $total_page, get_pretty_url($bo_table, '', $qstr.'&page=')); $list_href = ''; $prev_part_href = ''; $next_part_href = ''; if ($is_search_bbs) { $list_href = get_pretty_url($bo_table); $patterns = array('#&page=[0-9]*#', '#&spt=[0-9\-]*#'); //if ($prev_spt >= $min_spt) $prev_spt = $spt - $config['cf_search_part']; if (isset($min_spt) && $prev_spt >= $min_spt) { $qstr1 = preg_replace($patterns, '', $qstr); $prev_part_href = get_pretty_url($bo_table,0,$qstr1.'&spt='.$prev_spt.'&page=1'); $write_pages = page_insertbefore($write_pages, '이전검색'); } $next_spt = $spt + $config['cf_search_part']; if ($next_spt < 0) { $qstr1 = preg_replace($patterns, '', $qstr); $next_part_href = get_pretty_url($bo_table,0,$qstr1.'&spt='.$next_spt.'&page=1'); $write_pages = page_insertafter($write_pages, '다음검색'); } } $write_href = ''; if ($member['mb_level'] >= $board['bo_write_level']) { $write_href = short_url_clean(G5_BBS_URL.'/write.php?bo_table='.$bo_table); } $nobr_begin = $nobr_end = ""; if (preg_match("/gecko|firefox/i", $_SERVER['HTTP_USER_AGENT'])) { $nobr_begin = ''; $nobr_end = ''; } // RSS 보기 사용에 체크가 되어 있어야 RSS 보기 가능 061106 $rss_href = ''; if ($board['bo_use_rss_view']) { $rss_href = G5_BBS_URL.'/rss.php?bo_table='.$bo_table; } $stx = get_text(stripslashes($stx)); include_once($board_skin_path.'/list.skin.php');