하나의 list 화면에 복수의 게시판 테이블 글을 가져오려고 할 때
본문
여러 게시판들을 생성하고, 1개의 게시판 list에서 여러 게시판 게시글들을 불러오려고 해요.
어디를 손 보면 될까요?
list.php를 봐도 테이블 불러오는 코드가 안보이네요.
게시판1, 게시판2, 게시판3 이 있을 경우
게시판 1의 list화면에서 게시판1, 게시판2, 게시판3의 게시글들 목록이 보이게 하고 싶어요.
답변 5
list.php에서 특정 테이블의 게시글만 불러오는 기존 로직을 수정하여
다중 테이블에서 데이터를 가져오도록 변경해야 합니다.
아래는, g5_write_{게시판명} 테이블들을 UNION 또는 UNION ALL로 결합하여
데이터를 가져오는 쿼리를 작성하고, 이를 list.php에 적용하여
한 화면에서 여러 게시판의 게시글을 표시할 수 있도록 한, 최신 그누보드 예시입니다.
*list.php 파일의
$sql = "SELECT * FROM `g5_write_{$bo_table}` ORDER BY wr_datetime DESC LIMIT 10";
이 부분을
$sql = "SELECT wr_id, bo_table, wr_subject, wr_datetime
FROM (
SELECT wr_id, '게시판1' as bo_table, wr_subject, wr_datetime FROM g5_write_게시판1
UNION ALL
SELECT wr_id, '게시판2' as bo_table, wr_subject, wr_datetime FROM g5_write_게시판2
UNION ALL
SELECT wr_id, '게시판3' as bo_table, wr_subject, wr_datetime FROM g5_write_게시판3
) AS merged_boards
ORDER BY wr_datetime DESC
LIMIT 10";
UNION ALL을 사용하여 여러 게시판의 게시글을 합쳐 하나의 결과 세트로 반환.
*템플릿 (list.skin.php) 파일의
<td class="wr_subject"><a href="view.php?wr_id=<?php echo $row['wr_id']; ?>"><?php echo $row['wr_subject']; ?></a></td>
이 소스를
<td class="wr_subject">
[<?php echo $row['bo_table']; ?>]
<a href="view.php?bo_table=<?php echo $row['bo_table']; ?>&wr_id=<?php echo $row['wr_id']; ?>">
<?php echo $row['wr_subject']; ?>
</a>
</td>
이렇게 수정하여,
게시판 이름을 함께 표시하여 어느 게시판의 게시글인지 구분 가능하도록 변경.
- 게시판명을 대괄호 [ ]로 감싸서 표시
- 클릭 시 해당 게시판의 view.php로 이동
. . .
※ 자동화된 게시판 검색, 페이징, 검색 기능 포함 ( 선택 적용 가능 )
*DB에서 자동으로 모든 게시판을 가져오기 (SHOW TABLES LIKE 'g5_write_%' 활용
*페이징 기능 유지 (LIMIT과 OFFSET을 적용하여 기존 페이지네이션 구조 유지
*검색 기능 적용 (WHERE wr_subject LIKE '%검색어%'를 각 SELECT 문에 추가
*게시판명 출력하여 구분 가능하게 처리 (bo_table 값을 활용하여 [게시판명] 표시
*기존 list.php의 구조를 그대로 유지하면서 적용 가능 (완전히 새로 만들 필요 없음
#최적의 list.php 코드
<?php
// 공통 파일 포함
include_once('./_common.php');
// 페이지 값 설정
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$limit = 10; // 한 페이지당 게시글 개수
$offset = ($page - 1) * $limit;
// 검색어 처리
$search = isset($_GET['search']) ? trim($_GET['search']) : '';
$where_clause = $search ? "WHERE wr_subject LIKE '%{$search}%'" : "";
// 데이터베이스에서 존재하는 모든 게시판 테이블을 자동으로 가져오기
$board_list = array();
$result = sql_query("SHOW TABLES LIKE 'g5_write_%'");
while ($row = sql_fetch_array($result)) {
$table_name = $row[0];
$board_list[] = "SELECT wr_id, '{$table_name}' as bo_table, wr_subject, wr_datetime FROM {$table_name} $where_clause";
}
// 전체 게시글 수 가져오기
$count_sql = "SELECT COUNT(*) as cnt FROM (" . implode(" UNION ALL ", $board_list) . ") AS merged_boards";
$count_result = sql_fetch(sql_query($count_sql));
$total_count = $count_result['cnt'];
// 다중 테이블 UNION 적용 (페이징 포함)
$sql = implode(" UNION ALL ", $board_list) . " ORDER BY wr_datetime DESC LIMIT $offset, $limit";
$result = sql_query($sql);
?>
#최적의 list.skin.php 코드
<td class="wr_subject">
[<?php echo str_replace("g5_write_", "", $row['bo_table']); ?>]
<a href="view.php?bo_table=<?php echo $row['bo_table']; ?>&wr_id=<?php echo $row['wr_id']; ?>">
<?php echo $row['wr_subject']; ?>
</a>
</td>
board.php 확인해보세요 보통 여기서 쿼리가 있어요
list.php에 게시물 추출 코드가 들어있긴 하지만 이 화일을 수정해서
게시판 여러개를 불러오도록 만드는 것은 코드를 완전히 바꾸지 않는한 어렵습니다
검색이나 분류들을 사용해야하는 경우 더욱 그러합니다
또한 쓰기버튼 삭제버튼 기능 등을 넣는 것도 문제가 됩니다
여러게시판을 불러오는 링크는 별도의 화일에서 처리하도록 하고
완전히 새로이 만들어야 합니다
게시글 추출뿐이 아니라 수정버튼 선택삭제 등 버튼 기능도 달라져야하기 때문에 별도의 화일과 스킨으로 만드는 것이 쉬울 것입니다
3개의 게시판을 하나로 쓰고 싶으신거면 그누는 다 따로 테이블이 되어 있어서 해당에 적합하지 않습니다. 3개의 게시판에 대한 따로 통합관리할 테이블을 하나 만드시거나 하나의 게시판을 분류를 만들어서 각각의 게시판인거 처럼 사용을 하셔야 할 거 같습니다.
혹시 하시려는 작업이 여러개의 게시판 내용을 하나의 리스트에서 보여주기만 하시려고 하는지요?
글쓰기나 삭제는 각각의 게시판에서 하시고요.
만약 그렇다면 https://xxxxxxxxx.com/bbs/new.php 를 조금 수정 하셔서 이용하시는게 좋을듯 싶습니다.
아니라면 꽤 많은 부분을 수정하셔야 합니다.