CI 묻고 답하기

제목 아마도 마지막 ? 질문이 되지 싶은데, 초보적이거네요 ㅋ
글쓴이 서슬기 작성시각 2015/03/27 10:38:57
댓글 : 18 추천 : 0 스크랩 : 0 조회수 : 16632   RSS
일반 사무직인데 프로그래밍의 프짜도 암것도 모르고 시작했다 웅파님 책과 스택오버플로랑 여기 도움으로 건건히 프로젝트 막바지입니다.  6개월 작업했네요. 내일이 오픈입니다. 
이게 끝나면 다시 원래 업무로 돌아가겠죠...ㅠㅠ
수정사항도 워드 11폰트로 4장씩 나오던게 이제 몇몇개 안남았네요. 
기초가 아무것도 없이 그냥 검색으로만 해버렸네요 ㅎ

마지막 질문? 이자 마지막 수정 사항인데 머리가 나쁜지, 개념이 없는지 잘 안풀리네요. 
원하는 거는 계층형 게시판 혹은 일반 게시판의 게시물번호 정렬입니다. 
ORDER BY 를 어떻게 하던지 

5   제목  내용
4   제목  내용
3   제목  내용
2   제목  내용
1   제목  내용

이런 식으로 나왔으면 좋겠습니다. 

소스를 보여드리면
[ 컨트롤러 ]
	function announcements() {	
		$this -> load -> view('main/top');
		$config = array();
		$config["base_url"] = base_url() . "customer_support/announcements";
		$config["total_rows"] = $this->customer_support_model->gets_announcements_lists_record_count();
		$config["per_page"] = 10;
		$config["uri_segment"] = 3;
		$config['num_links'] = 4;
		$config['full_tag_open'] = "<ul class='pagination pagination-lg'>";
		$config['full_tag_close'] ="</ul>";
		$config['num_tag_open'] = '<li>';
		$config['num_tag_close'] = '</li>';
		$config['cur_tag_open'] = "<li class='disabled'><li class='active'><a href='#'>";
		$config['cur_tag_close'] = "<span class='sr-only'></span></a></li>";
		$config['next_tag_open'] = "<li>";
		$config['next_tagl_close'] = "</li>";
		$config['prev_tag_open'] = "<li>";
		$config['prev_tagl_close'] = "</li>";
		$config['first_link'] = '처음';
		$config['first_tag_open'] = "<li>";
		$config['first_tagl_close'] = "</li>";
		$config['last_link'] = '끝';
		$config['last_tag_open'] = "<li>";
		$config['last_tagl_close'] = "</li>";

		$this->pagination->initialize($config);

		$page = ($this->uri->segment(3)) ? $this->uri->segment(3) : 0;
		$data["results"] = $this->customer_support_model->gets_announcements_lists($config["per_page"], $page);
		$data["links"] = $this->pagination->create_links();		
		$this -> load -> view('/customer_support/announcements' , $data);
		$this -> load -> view('main/tail');
	}
[모델]
	function gets_announcements_lists($limit, $start) {
		$this->db->select("*, @rownum:=@rownum+1 as idx  " , false);
		$this->db->from("board, (SELECT @rownum:=0) R", false);
		$this->db->where_in('BoardTypeID', 'test');
		$this->db->order_by('idx DESC');
		$this->db->limit($limit, $start);
		$query = $this->db->get();

		if ($query->num_rows() > 0 ) {
			foreach ($query->result() as $row) {
				$data[] = $row;
			}
			return $data;
		}
		return false;
	}
이고 

뷰는 
 
<?php foreach($results as $data) : ?>
<tr>
<td align="center"><?= $data->idx ?></td>
<td>
<a href="/customer_support/announcements_view/<?= $data->BoardID?>"><?= $data->Subject?></a>
</td>
<td align="center"><?= $data->date?></td>
</tr>
<?php endforeach ?>

이렇게 구성했습니다. 

mysql 의 rownum? 이라는건 스택오버플로에서 보고 따라 했습니다. 

ORDER BY 를 뭐 시간 순이나 게시판 ID 등 하나로만 DESC 해버리면 
ROWNUM이 정상적으로 나오는데 
계층형 게시판이나 order by 가 여러개 들어가는 경우는 

번호    내용    작성일자
57    test1      2015-03-24
55    댓글 테스트123      2015-03-24
56    [RE] 댓글 테스트1233    2015-03-24

이런식으로 나오네요. 

그래서 생각한게 뷰에서 
$GetCnt = $this->db->query("select * from 게시판");
$Cnt = $GetCnt->row_nums(); 

으로 전체 목록을 구한 다음
뷰에 foreach 문 밑 혹은 위에다가 
							<?php for ($i=0; $i <$cnt ; $i++) { 
								$c = $cnt-$i;
							} ?>

으로 하니 전체 갯수가 td안에 생겨버리더군요 

번호                      내용    작성일자
567 566 565 564...   test1      2015/03/24
567 566 565 564...    문자 테스트3      2015/03/24
567 566 565 564...    [RE] 문자 테스트3    2015/03/24

아니면 글 내용이 반복이 되버리던지..

내용이 길었네요. 제 상황을 자세하게 묘사를 해야 도움을 받을 수 있을거 같아서 ^^;
아무튼 도움 부탁 드립니다. 
빨리 홈페이지 오픈시키고 제가 하던 원래 업무로 가고 싶어요 ㅠㅠ 
 
 다음글 An Error Was Encountered 에러가 발... (2)
 이전글 어느순간부터 에러출력이 안되는 것 같습니다. (4)

댓글

한대승(불의회상) / 2015/03/27 11:00:11 / 추천 0
ㅎㅎ 뭘 도와 드리면 될까요?
서슬기 / 2015/03/27 11:50:34 / 추천 0
ORDER BY 결과가 어떻게 되든 게시판 게시물의 번호를 전체 갯수에서 -1씩 내려가게? DESC?로 보이게 하고 싶어요.
 
서슬기 / 2015/03/27 11:51:21 / 추천 0
N 제목 내용
....
5   제목  내용

4   제목  내용
3   제목  내용
2   제목  내용
1   제목  내용

이런식으로요 ^^;
샤오란 / 2015/03/27 13:07:07 / 추천 0
제가 질문하신분의 의도를 정확히 파악했는지 모르겠지만,,,
총 rows를 구해서
반복문에서 출력할때마다 rows를 -- 하면 되실거 같습니다.

총 글의 갯수가 $total_rows 라면
foreach 문으로 출력시 $total_rows-- 하면 되실거 같습니다.

 
한대승(불의회상) / 2015/03/27 13:17:00 / 추천 0
@서슬기 프로그램의 프 자도 모른다고 하시고 6개월만에 프로젝트를 목전에 두고 계시다니 정말 대단하십니다.
아래 처럼 바꿔 보세요.
 
function gets_announcements_lists($limit, $start) {
 $this->db->select("*, @rownum:=@rownum+1 as idx  " , false);
 $this->db->from("board, (SELECT @rownum:=0) R", false);
 $this->db->where_in('BoardTypeID', 'test');
 $this->db->order_by('idx DESC');
 $this->db->limit($limit, $start);
 $query = $this->db->get();


 if ($query->num_rows() > 0 ) {
/*
  foreach ($query->result() as $row) {
   $data[] = $row;
  }
  return $data;
*/

// 바꿀 부분 시작
  $idx = NULL;
  foreach ($query->result() as $row) {
   $idx = $idx == NULL ? $row->idx : $idx - 1;
   $row->idx = $idx;
   $data[] = $row;
  }

  return $data;
// 바꿀 부분 끝
 }
 return false;
}
서슬기 / 2015/03/27 13:30:00 / 추천 0
답변 감사합니다. 
우선 알려주신 코드를 적용시키니 잘 동작을 하는데요 
$this->db->order_by('idx DESC');
여기에 
$this->db->order_by('공지사항인지아닌지? DESC');
$this->db->order_by('글쓴날짜 DESC');
를 붙이고 

$this->db->order_by('idx DESC');
$this->db->order_by('공지사항인지아닌지? DESC');
$this->db->order_by('글쓴날짜 DESC');

이렇게 혹은 반대로 
$this->db->order_by('공지사항인지아닌지? DESC');
$this->db->order_by('글쓴날짜 DESC');
$this->db->order_by('idx DESC');
으로 하니까 글 번호가 뒤죽 박죽이거나 전체 글 목록이 다 나오지 않네요 
^^;;
 
서슬기 / 2015/03/27 13:31:53 / 추천 0
샤로안님 전체 갯수를 구하는건 메뉴얼에서 num_rows()를 해서 구할 수 있었습니다. 
전체 갯수가 150개라고 가정을 하면
foreach문에서 <?= $row->idx ?> 대신 <?= $totalcnt-- ?> 이렇게 하라는 건가요? 
서슬기 / 2015/03/27 13:33:40 / 추천 0
  $this->DB1->order_by('idx', 'desc');
  $this->DB1->order_by('IsNotice', 'desc');
  $this->DB1->order_by('date', 'desc');
  $this->DB1->limit($limit, $start);
  $query = $this->DB1->get();

  if ($query->num_rows() > 0 ) {
   $idx = NULL;
   foreach ($query->result() as $row) {
    $idx = $idx == NULL ? $row->idx : $idx - 1;
    $row->idx = $idx;
    $data[] = $row;
   }
   return $data;
  }
  return false;

한대승님 코드를 올려봤습니다. 

그리고 정말 간단하게 게시판이랑 회원 가입이랑 관리자 페이지라서 아주 많이 걸리진 않았어요
 
한대승(불의회상) / 2015/03/27 13:37:59 / 추천 0
@서슬기 샤오란님 방법대로 하고 싶다면
제가 작성한 코드에서 아래처럼 수정 하시면 됩니다.
// $idx = $idx == NULL ? $row->idx : $idx - 1; 

$idx = $idx == NULL ? $totalcnt : $idx - 1;
서슬기 / 2015/03/27 13:56:45 / 추천 0
#불의 회상

상황을 적어드리겠습니다.  
먼저 총 게시물은 25개입니다.
그리고 페이지네이트? 네이션? 이 구현되어있고 한 페이지에 10개씩 보여줍니다.
공지사항인지 아닌지 구분해서 Isnotice가 1이면 공지인걸로 했습니다.
$this->DB1->order_by('IsNotice', 'desc');
$this->DB1->order_by('idx', 'desc');
$this->DB1->limit($limit, $start);
$query = $this->DB1->get();

if ($query->num_rows() > 0 ) {
 $idx = NULL;
 foreach ($query->result() as $row) {
  $idx = $idx == NULL ? $row->idx : $idx - 1;
  $row->idx = $idx;
  $data[] = $row;
 }
 return $data;
}
return false;

이런식으로 하니 번호가 
17
16
15
14
13
12
11
10
9
8
이런식으로 첫 번째 페이지에서 번호가 나오고
두번째 페이지는
18
17
16
15
14
13
12
11
10
9

이런식으로 나오네요.

그래서 마지막댓글에 $idx = $idx == NULL ? $totalcnt : $idx - 1;

여기를 $idx = $idx == NULL ? '25' : $idx - 1;
이렇게 강제로? 전체 갯수를 넣어보니까 

첫 번째 페이지에
25
......
16 

두번째 페이지도 
25
.....
16

마지막 페이지는
25
.........
21

이런식으로 보여집니다.

$idx = $idx == NULL ? $totalcnt : $idx - 1; 이 방법으로 하니까 페이지네이션?의 영향을 받는거 같네요 ㅠㅠ


샤오란 / 2015/03/27 14:01:19 / 추천 0
ㅎㅎ 제가 답변을 달면서 왠지 이 질문이 또 나올거 같다는 생각을 했는데
 총 글목록수에서 페이지번호에 페이지당표시할수를 곱해서 뺍니다 다음 페이지당 표시할수를 더하면 됩니다.
샤오란 / 2015/03/27 14:03:45 / 추천 0
총 글목록수 - (페이지번호 * 페이지당표시할수 )  + 페이지당 표시할수
서슬기 / 2015/03/27 14:04:07 / 추천 0
 총 글목록수에서 페이지번호에 페이지당표시할수를 곱해서 뺍니다 다음 페이지당 표시할수를 더하면 됩니다.
 이 부분을 아까처럼 코드?로 설명 해주시면 안될까요 ? ^^;
처음부터 끝까지 카피앤페이스트로만 하다가 이제 감을 잡을까 말까 한 상태라 글로 본걸 
구현하려고 하니 어려움이 있네요 ^^
한대승(불의회상) / 2015/03/27 14:08:22 / 추천 0
ㅎㅎ 처음엔 다 어렵습니다.
// $idx = $idx == NULL ? $totalcnt : $idx - 1;
$idx = $idx == NULL ? $totalcnt - $start : $idx - 1;
윗줄에서 limit로 이미 계산 다 하셨으니 이렇게 하시면 될 듯 싶네요.
서슬기 / 2015/03/27 14:12:23 / 추천 0
와 신기하네요 감사합니다.!!
 
                $qry = $this->DB1->query("SELECT * FROM bbs WHERE 게시판아이디 = '1';");
                $totalcnt = $qry->num_rows();
                $idx = $idx == NULL ? $totalcnt - $start : $idx - 1;


이렇게 하니까 정상적으로 나옵니다. ㅠㅠ 
어렵긴해도 재미지긴 하네요 ㅎㅎ 
이러다가 부서 바꾸는거 아닌가 모르겠네요!!!!!!!!!
감사합니다. 꾸벅꾸벅