만들면서 배우는 CodeIgniter Q&A

제목 248p AJax 댓글 관련 질문입니다.
글쓴이 프로그래밍좀비 작성시각 2014/12/02 01:04:38
댓글 : 9 추천 : 0 스크랩 : 0 조회수 : 10508   RSS
해당 게시글에 내가 댓글이 다 잘달리는데요,

248페이지의 테이블 내용을 보면 하나의 DB 테이블에 댓글과 글의 내용을 다 넣는거같은데 

그럼 board_id는 계속해서 증가할테구요, board_pid는 내가 댓글을 입력한 해당 게시판의 board_id값을
물고 가는 형식인거 같은데,,

문제가 발생했습니다.

게시판 글쓴 목록을 보면(페이징 처리 하고 글쓴 목록이 쭉 나오는 부분)
DB에 subject칼럼의 내용이 빠진 즉, 댓글의 내용이 같이 출력이 됩니다.

글쓴 목록 + 댓글 목록이 함께 페이징처리 되어서 출력되네요 ㅠ ㅠ이부분은 어떻게 해결해야하나요

제 생각엔 페이징 처리부분 Controller의 board.php에서 lists() 함수를 잘 건드려줘야할것 같은데..

그리고 DB의 경우에도 글목록 테이블과 댓글 테이블을 따로 나누어서 구성하는지 궁금합니다.

나중에 DB를 열어보면 너무 지저분해지지 않나요?

제생각에는 DB 테이블도 글쓰기 테이블과 댓글테이블 두개로 나누어서 작성하면 좋을거같은데

이렇게 구성하는 부분에 대해서도 알고싶습니다  
 다음글 챕터 3 작성 오류 문의 (6)
 이전글 Chapter 8. Ajax에 나오는 쿠키에 대한 질문... (3)

댓글

변종원(웅파) / 2014/12/02 10:57:26 / 추천 0
1. 248p 8번 설명 보시면 어떤 구조인지 나와있습니다. board_pid=0 조건을 주면 원글만 리스트에 나옵니다.

2. 나눠서 하기도 하고 합쳐서 하기도 합니다. 

책을 기준으로 설명을 하면
나누시려면 board_pid가 댓글테이블로 옮겨가면 됩니다. 
원글테이블의 board_id 와 댓글테이블의 board_pid가 연결키이니 위 필드로 join을 하면

select 댓글테이블.* from 
join 댓글테이블 on 원글게시판.board_id=댓글테이블.board_pid
where 원글게시판.board_id='5'

6, 7번 댓글리스트만 나옵니다.

공개된 포럼소스가 나뉘어 있는 구조입니다. 참고하세요.
프로그래밍좀비 / 2014/12/03 03:29:36 / 추천 0
감사합니다 감이 잡히네요 ^^
선덕사스님 / 2017/04/27 19:38:16 / 추천 0

저도 이 부분에서 막히는데요 좀더 자세히 설명해주실 수 있을까요?ㅠ

완전 초보라 어디서 건드려야할 지 막막합니다.

제 생각엔 board_m.php 에서 if ( $board_pid = 0 ) {} 이런식으로 써야할 거 같은 느낌인데 안되더라구요. 설명좀 부탁드리겠습니다.

선덕사스님 / 2017/04/27 19:40:51 / 추천 0

지금 board_m.php에서 

public function get_list($table='', $type='', $offset='', $limit='', $search_word='') {
		$sword = '';

		if ( $search_word != '' ) {
			// 검색어가 있을 경우의 처리
			$sword = ' WHERE subject LIKE "%'.$search_word.'%" OR contents LIKE "%'.$search_word.'%" ';
		}

		$limit_query = '';

		if ( $limit != '' OR $offset != '' ) {
			// 페이징이 있을 경우의 처리
			$limit_query = ' LIMIT '.$offset.', '.$limit;
		}

		$sql = "SELECT * FROM ".$table.$sword." WHERE board_pid = 0 ORDER BY board_id DESC".$limit_query;
		$query = $this->db->query($sql);

		if ( $type == 'count' ) {
			// 리스트를 반환하는 것이 아니라 전체 게시물의 개수를 반환
			$result = $query->num_rows();

			// $this->db->count_all($table);
		} else {
			// 게시물 리스트 반환
			$result = $query->result();
			// $result = $query->result_array();
		}
		
		return $result;
	}

 

그냥 강제로 where board_pid = 0 을 넣어주면 작동은 되는데 이렇게 하면 검색어 처리시 문제 생기지 않나요?

 

선덕사스님 / 2017/04/27 19:50:13 / 추천 0
아 원소스에서 확인해보니 
function get_list($table='ci_board', $type='', $offset='', $limit='', $search_word='')
    {
		$sword= ' WHERE 1=1 ';

		if ( $search_word != '' )
     	{
     		//검색어가 있을 경우의 처리
     		$sword = ' WHERE subject like "%'.$search_word.'%" or contents like "%'.$search_word.'%" ';
     	}

    	$limit_query = '';

    	if ( $limit != '' OR $offset != '' )
     	{
     		//페이징이 있을 경우의 처리
     		$limit_query = ' LIMIT '.$offset.', '.$limit;
     	}

    	$sql = "SELECT * FROM ".$table.$sword." AND board_pid = '0' ORDER BY board_id DESC".$limit_query;
   		$query = $this->db->query($sql);

		if ( $type == 'count' )
     	{
     		//리스트를 반환하는 것이 아니라 전체 게시물의 갯수를 반환
	    	$result = $query->num_rows();

	    	//$this->db->count_all($table);
     	}
     	else
     	{
     		//게시물 리스트 반환
	    	$result = $query->result();
     	}

    	return $result;
    }

AND board_pid = '0' 으로 해결하셨군요.

한가지 궁금한 것이 그럼 $sword = ' WHERE 1=1 '; 이 문장은 무엇을 의미하는 건가요? 이거를 제외하고 원래 $sword = ''; 로 처리하면 에러가 나더라구요.

개락 / 2017/04/28 08:21:16 / 추천 0
function get_list($table='ci_board', $type='', $offset='', $limit='', $search_word='')
    {
      if ( $search_word != '' )
        {
            //검색어가 있을 경우의 처리
            $sword = ' and subject like "%'.$search_word.'%" or contents like "%'.$search_word.'%" ';
        }
 
        $limit_query = '';
 
        if ( $limit != '' OR $offset != '' )
        {
            //페이징이 있을 경우의 처리
            $limit_query = ' LIMIT '.$offset.', '.$limit;
        }
 
        $sql = "SELECT * FROM ".$table."where board_pid = '0'".$sword."  ORDER BY board_id DESC".$limit_query;
        $query = $this->db->query($sql);
 
        if ( $type == 'count' )
        {
            //리스트를 반환하는 것이 아니라 전체 게시물의 갯수를 반환
            $result = $query->num_rows();
 
            //$this->db->count_all($table);
        }
        else
        {
            //게시물 리스트 반환
            $result = $query->result();
        }
 
        return $result;
    }

이렇게 바꾸심 되는거 아닌가요? where 1 = 1 은 검색부분에 검색이 걸리경우가 있고 안걸릴경우도 있는데 where절로 시작하기가 어려운경우 검색부분 쿼리문을 연결하기 전에 선처리하는 부분이라고 생각하시면 됩니다. 1 = 1은 언제나 true라서 and문 붙혀서 쓰기에 좋거든요 하지만 페이징처리가 안되는쿼리거나 조건값이 하나도 안거릴수도있는 쿼리거나 할 경우에는 사용 안하시는게 좋습니다 테이블정보 한방에 다 오픈되요..

개락 / 2017/04/28 08:25:39 / 추천 0

쿼리문이 select * from table where search=1 and search2=2 order by board_id desc limit 이렇게 가야하는데

저위값에서 $sword 값이 없으면 where search=1 부분이 사라지는거니까 당연히 에러가 나겠죠..

선덕사스님 / 2017/05/01 09:49:30 / 추천 0
개락 감사합니다! 완전초보라 완벽히 이해하지는 못했지만 쿼리문이 저렇게 처리된다는 것은 이해했습니다.! 
개락 / 2017/05/01 11:19:27 / 추천 0
선덕사스님  저도초보라 ㅎㅎ 도움이 되셨다니 다행이네요..ㅎㅎ;