날짜별 검색시 다음 페이지 문제 좀 봐주시겠어요. 채택완료
안녕하세요.
게시판 리스트 상단에 날짜별로 검색 가능한 소스를 사용중입니다.
일반적인 그누보드에서는 문제 없는데,
그누보드 환경설정에서 짧은 주소 설정을 하고 사용하면,
링크에 문제가 있습니다.
아래가 테스트용 주소인데,
http://test01.dothome.co.kr/free
접속한 후 아무것도 하지 않은 상태에서 바로 게시판 하단의 페이지2를 누르면 링크가 잘못되어 없는 페이지가 나옵니다.
하지만 게시판 상단 날짜별 검색으로 아무렇게나 검색을 한 후(전체나 이번달로 설정 후 검색해보시면 됩니다.)
다시 하단의 페이지2를 누르면 정상적으로 2페이지가 열립니다.
원래 2페이지로 가려면
http://test01.dothome.co.kr/bbs/board.php?bo_table=free&page=2
이런식으로 링크가 되야 하는데,
게시판 접속 후 상단 날짜 검색을 안한 상태에서 바로 페이지2로 가면
http://test01.dothome.co.kr/board.php?bo_table=free&page=2
이런식으로 링크가 되서 없는 페이지가 나오는 상황입니다.
이부분의 소스는 아래와 같고,
맨 하단이 페이지 링크 설정 부분입니다.
<?php
if (!defined("_GNUBOARD_")) exit; // 개별 페이지 접근 불가
// 분류 사용 여부
$is_category = false;
$category_option = '';
if ($board['bo_use_category']) {
$is_category = true;
$category_href = G5_BBS_URL.'/board.php?bo_table='.$bo_table;</p>
<p> $category_option .= '<li><a href="'.$category_href.'"';
if ($sca=='')
$category_option .= ' id="bo_cate_on"';
$category_option .= '>전체</a></li>';</p>
<p> $categories = explode('|', $board['bo_category_list']); // 구분자가 , 로 되어 있음
for ($i=0; $i<count($categories); $i++) {
$category = trim($categories[$i]);
if ($category=='') continue;
$category_option .= '<li><a href="'.($category_href."&sca=".urlencode($category)).'"';
$category_msg = '';
if ($category==$sca) { // 현재 선택된 카테고리라면
$category_option .= ' id="bo_cate_on"';
$category_msg = '<span class="sound_only">열린 분류 </span>';
}
$category_option .= '>'.$category_msg.$category.'</a></li>';
}
}</p>
<p>if($_GET['fr_date'] && $_GET['to_date']){</p>
<p>$fr_date_a = $_GET['fr_date']." 00:00:00";
$to_date_a = $_GET['to_date']." 23:59:59";
$date_search .= "and (wr_datetime between '{$fr_date_a}' and '{$to_date_a}') ";
$qdates = "&fr_date={$_GET['fr_date']}&to_date={$_GET['to_date']}";
}</p>
<p>
$sop = strtolower($sop);
if ($sop != 'and' && $sop != 'or')
$sop = 'and';</p>
<p>// 분류 선택 또는 검색어가 있다면
$stx = trim($stx);
if ($sca || $stx) {
$sql_search = get_sql_search($sca, $sfl, $stx, $sop);</p>
<p> // 가장 작은 번호를 얻어서 변수에 저장 (하단의 페이징에서 사용)
$sql = " select MIN(wr_num) as min_wr_num from {$write_table} ";
$row = sql_fetch($sql);
$min_spt = (int)$row['min_wr_num'];</p>
<p> if (!$spt) $spt = $min_spt;</p>
<p> ///////$sql_search .= " {$text} and wr_is_comment = 0 and ({$spt} + {$config['cf_search_part']})) ";/////////////////////////////////////////
$sql_search .= " {$date_search} and (wr_num between {$spt} and ({$spt} + {$config['cf_search_part']})) ";</p>
<p> // 원글만 얻는다. (코멘트의 내용도 검색하기 위함)
$sql = " select distinct wr_parent from {$write_table} where {$sql_search} ";
$result = sql_query($sql);</p>
<p>} else {
////$sql_search = ""; //원본
////$total_count = $board['bo_count_write'];//원본</p>
<p> // 게시판의 글 수
$sql_search = "";
$sql = " select count(*) as cnt from {$write_table} where wr_is_comment = '0' {$date_search}"; //////////////////////////////////////////////////
$row = sql_fetch($sql);
$total_count = $row['cnt'];
}</p>
<p>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'];
}</p>
<p>if ($page < 1) { $page = 1; } // 페이지가 없으면 첫 페이지 (1 페이지)</p>
<p>// 년도 2자리
$today2 = G5_TIME_YMD;</p>
<p>$list = array();
$i = 0;
$notice_count = 0;
$notice_array = array();</p>
<p>// 공지 처리
if (!$sca && !$stx) {
$arr_notice = explode(',', trim($board['bo_notice']));
$from_notice_idx = ($page - 1) * $page_rows;
if($from_notice_idx < 0)
$from_notice_idx = 0;
$board_notice_count = count($arr_notice);</p>
<p> for ($k=0; $k<$board_notice_count; $k++) {
if (trim($arr_notice[$k]) == '') continue;</p>
<p> $row = sql_fetch(" select * from {$write_table} where wr_id = '{$arr_notice[$k]}' ");</p>
<p> if (!$row['wr_id']) continue;</p>
<p> $notice_array[] = $row['wr_id'];</p>
<p> if($k < $from_notice_idx) continue;</p>
<p> $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;</p>
<p> $i++;
$notice_count++;</p>
<p> if($notice_count >= $list_page_rows)
break;
}
}</p>
<p>$total_page = ceil($total_count / $page_rows); // 전체 페이지 계산
$from_record = ($page - 1) * $page_rows; // 시작 열을 구함</p>
<p>// 공지글이 있으면 변수에 반영
if(!empty($notice_array)) {
$from_record -= count($notice_array);</p>
<p> if($from_record < 0)
$from_record = 0;</p>
<p> if($notice_count > 0)
$page_rows -= $notice_count;</p>
<p> if($page_rows < 0)
$page_rows = $list_page_rows;
}</p>
<p>// 관리자라면 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;</p>
<p>// 정렬에 사용하는 QUERY_STRING
$qstr2 = 'bo_table='.$bo_table.'&sop='.$sop;</p>
<p>// 0 으로 나눌시 오류를 방지하기 위하여 값이 없으면 1 로 설정
$bo_gallery_cols = $board['bo_gallery_cols'] ? $board['bo_gallery_cols'] : 1;
$td_width = (int)(100 / $bo_gallery_cols);</p>
<p>// 정렬
// 인덱스 필드가 아니면 정렬에 사용하지 않음
//if (!$sst || ($sst && !(strstr($sst, 'wr_id') || strstr($sst, "wr_datetime")))) {
if (!$sst) {
if ($board['bo_sort_field']) {
$sst = $board['bo_sort_field'];
} else {
$sst = "wr_num, wr_reply";
$sod = "";
}
} 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 : "";
}</p>
<p>if ($sst) {
$sql_order = " order by {$sst} {$sod} ";
}</p>
<p>if ($sca || $stx) {
$sql = " select distinct wr_parent from {$write_table} where {$sql_search} {$sql_order} {$date_search} limit {$from_record}, $page_rows ";
} else {
$sql = " select * from {$write_table} where wr_is_comment = '0' {$date_search}";
$sql .= " "; ///////////////////////////////////////////////////////////////////////////////////////////////////
if(!empty($notice_array))
$sql .= " and wr_id not in (".implode(', ', $notice_array).") ";
$sql .= " {$sql_order} limit {$from_record}, $page_rows ";
}</p>
<p>// 페이지의 공지개수가 목록수 보다 작을 때만 실행
if($page_rows > 0) {
$result = sql_query($sql);</p>
<p> $k = 0;</p>
<p> while ($row = sql_fetch_array($result))
{
// 검색일 경우 wr_id만 얻었으므로 다시 한행을 얻는다
if ($sca || $stx)
$row = sql_fetch(" select * from {$write_table} where wr_id = '{$row['wr_parent']}' ");</p>
<p> $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_num = $total_count - ($page - 1) * $list_page_rows - $notice_count;
$list[$i]['num'] = $list_num - $k;</p>
<p> $i++;
$k++;
}
}
$write_pages = get_paging(G5_IS_MOBILE ? $config['cf_mobile_pages'] : $config['cf_write_pages'], $page, $total_page, './board.php?bo_table='.$bo_table.$qstr.$qgubun.$qdates.'&page=');
'./board.php?bo_table=' 이 부분을 수정하면 될거 같은데,
이리저리 변경해봐도 잘 되질 않습니다.
이거 어떻게 변경을 해야 할까요?
아시는 분 답변 부탁드립니다.
감사합니다.
답변 2개
다음과 같이 수정 하시면 될 것 같습니다.
올려주신 전체 코드에서 일부 변경된 사항입니다.
</p>
<p><?php
if (!defined("_GNUBOARD_")) exit; // 개별 페이지 접근 불가</p>
<p>// 기본값으로 fr_date와 to_date를 설정
if (!isset($_GET['fr_date'])) {
$_GET['fr_date'] = '';
}
if (!isset($_GET['to_date'])) {
$_GET['to_date'] = '';
}</p>
<p>// 분류 사용 여부
$is_category = false;
$category_option = '';
if ($board['bo_use_category']) {
$is_category = true;
$category_href = G5_BBS_URL.'/board.php?bo_table='.$bo_table;
$category_option .= '<li><a href="'.$category_href.'"';
if ($sca=='')
$category_option .= ' id="bo_cate_on"';
$category_option .= '>전체</a></li>';
$categories = explode('|', $board['bo_category_list']); // 구분자가 , 로 되어 있음
for ($i=0; $i<count($categories); $i++) {
$category = trim($categories[$i]);
if ($category=='') continue;
$category_option .= '<li><a href="'.($category_href."&sca=".urlencode($category)).'"';
$category_msg = '';
if ($category==$sca) { // 현재 선택된 카테고리라면
$category_option .= ' id="bo_cate_on"';
$category_msg = '<span class="sound_only">열린 분류 </span>';
}
$category_option .= '>'.$category_msg.$category.'</a></li>';
}
}
if($_GET['fr_date'] && $_GET['to_date']){
$fr_date_a = $_GET['fr_date']." 00:00:00";
$to_date_a = $_GET['to_date']." 23:59:59";
$date_search .= "and (wr_datetime between '{$fr_date_a}' and '{$to_date_a}') ";
$qdates = "&fr_date={$_GET['fr_date']}&to_date={$_GET['to_date']}";
}</p>
<p>$sop = strtolower($sop);
if ($sop != 'and' && $sop != 'or')
$sop = 'and';
// 분류 선택 또는 검색어가 있다면
$stx = trim($stx);
if ($sca || $stx) {
$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 .= " {$text} and wr_is_comment = 0 and ({$spt} + {$config['cf_search_part']})) ";/////////////////////////////////////////
$sql_search .= " {$date_search} and (wr_num between {$spt} and ({$spt} + {$config['cf_search_part']})) ";
// 원글만 얻는다. (코멘트의 내용도 검색하기 위함)
$sql = " select distinct wr_parent from {$write_table} where {$sql_search} ";
$result = sql_query($sql);
} else {
////$sql_search = ""; //원본
////$total_count = $board['bo_count_write'];//원본
// 게시판의 글 수
$sql_search = "";
$sql = " select count(*) as cnt from {$write_table} where wr_is_comment = '0' {$date_search}"; //////////////////////////////////////////////////
$row = sql_fetch($sql);
$total_count = $row['cnt'];
}
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 (!$sca && !$stx) {
$arr_notice = explode(',', trim($board['bo_notice']));
$from_notice_idx = ($page - 1) * $page_rows;
if($from_notice_idx < 0)
$from_notice_idx = 0;
$board_notice_count = count($arr_notice);
for ($k=0; $k<$board_notice_count; $k++) {
if (trim($arr_notice[$k]) == '') continue;
$row = sql_fetch(" select * from {$write_table} where wr_id = '{$arr_notice[$k]}' ");
if (!$row['wr_id']) continue;
$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;
$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) {
if ($board['bo_sort_field']) {
$sst = $board['bo_sort_field'];
} else {
$sst = "wr_num, wr_reply";
$sod = "";
}
} 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) {
$sql_order = " order by {$sst} {$sod} ";
}
if ($sca || $stx) {
$sql = " select distinct wr_parent from {$write_table} where {$sql_search} {$sql_order} {$date_search} limit {$from_record}, $page_rows ";
} else {
$sql = " select * from {$write_table} where wr_is_comment = '0' {$date_search}";
$sql .= " "; ///////////////////////////////////////////////////////////////////////////////////////////////////
if(!empty($notice_array))
$sql .= " and wr_id not in (".implode(', ', $notice_array).") ";
$sql .= " {$sql_order} limit {$from_record}, $page_rows ";
}
// 페이지의 공지개수가 목록수 보다 작을 때만 실행
if($page_rows > 0) {
$result = sql_query($sql);
$k = 0;
while ($row = sql_fetch_array($result))
{
// 검색일 경우 wr_id만 얻었으므로 다시 한행을 얻는다
if ($sca || $stx)
$row = sql_fetch(" select * from {$write_table} where wr_id = '{$row['wr_parent']}' ");
$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_num = $total_count - ($page - 1) * $list_page_rows - $notice_count;
$list[$i]['num'] = $list_num - $k;
$i++;
$k++;
}
}
$write_pages = get_paging(G5_IS_MOBILE ? $config['cf_mobile_pages'] : $config['cf_write_pages'], $page, $total_page, './board.php?bo_table='.$bo_table.$qstr.$qgubun.$qdates.'&page=');
?>
답변에 대한 댓글 2개
./board.php?bo_table=를
http://test01.dothome.co.kr/bbs/board.php?bo_table=이런식으로 풀 주소로 적어주니 정상 작동되네요.
댓글을 작성하려면 로그인이 필요합니다.
쿼리 문자열에 fr_date와 to_date 파라미터가 없어서 페이지가 올바르게 로딩되지 않는 것 같습니다
다음과 같은 방법으로 해 볼 수 있을 것 같습니다.
</p>
<p>if (!defined("_GNUBOARD_")) exit; // 개별 페이지 접근 불가 </p>
<p>// 기본값으로 fr_date와 to_date를 설정
if (!isset($_GET['fr_date'])) {
$_GET['fr_date'] = '';
}
if (!isset($_GET['to_date'])) {
$_GET['to_date'] = '';
}</p>
<p>// 나머지 코드는 그대로 유지
// ...
답변에 대한 댓글 1개
알려주신 내용만 상단에 적으면 되는건가요?
지금 적용한 상태인데, 역시나 경로 제대로 못찾고 있어서요.
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인
그런데, 알려주신대로 넣었지만 여전히 링크가 제대로 먹히지 않습니다.
혹시 몰라서 본문 테스트 페이지에 스킨 전체 파일 압축해서 올렸습니다.
댓글에도 다른 파일도 올리겠습니다.