[포폴] php로 게시판 만들기

전예원·2022년 1월 14일
1

PHP, APACHE

목록 보기
12/14

php로 게시판 만들기 해봤다.
페이징 부분을 구현하는데 많이 애를 먹었다.
나중에 되면 기억에서 사라질 것 같아 자세히 기록해놔야겠다.

🍎 내가 구현하고 싶은것

  1. 페이지 클릭하면 색상 변경
  2. <, > : 페이지 하나씩 이동하기
  3. <<, >> : 블록 단위로 이동하기
  4. << : 1번 페이지에서는 이 모양 없어지고, 첫번째 블럭에서는 누르면 1번페이지로 이동
    < : 1페이지에서는 이 모양은 비활성화
  5. >> : 마지막 페이지에서는 이 모양 사라지고, 마지막 블럭에서는 누르면 마지막 페이지로 이동
    > : 마지막 페이지에서는 이 모양 비활성화
  6. 페이지 내용 보는 곳에서 목록보기 누르면 해당 목록으로 이동
  7. 페이지 내용 보는 곳에서 이전글, 다음글로 이동하는 링크

이렇게 페이징 부분을 구현하고 싶었다.
하다가 너무 힘들어서 블록 넘어가는건 빼고 싶었는데 오기가 생겨서 마침내 해냈다.

🤡 게시판에 글 데이터 출력하기


1. 페이지 클릭하면 해당 페이지 숫자 색상 변경

  • 이건 알고 보니 매우 간단했다.

    이렇게 마지막에 스크립트문을 적어주니까 새로고침될 때마다 저 문장이 실행되어서 적용되었다.
  • 페이지 부분에 클래스를 주었다.

2. 나머지 다 설명

  • 다들 유기적으로 연결되어있어서 딱하나만 설명하기 어려울꺼같다.

  • 변수 설정하는게 매우 중요했다.

    변수명을 2개씩 적는건 자기한테 직관적으로 더 잘 다가오는 변수명을 쓰면된다.

1. 전체 데이터 개수

: $num / $total_count 이렇게 변수를 줄 수 있는데 $total_count 변수명을 썼다.

$t_sql = 'select count(*) from boards';
$t_result = mysqli_query($dbcon, $t_sql);
$row = mysqli_fetch_row($t_result);
$total_count = $row[0];
  • 전체 데이터 개수는 쿼리문으로 구했다. (현재 80개 글이 있다)

2. 한 페이지당 데이터 개수, 한 블럭 당 페이지 수

$list_num = 10; // 한 페이지당 데이터 개수
$page_num = 5; // 한 블럭 당 페이지 수
  • 이 두개 변수가 젤 중요한 것 같다.
  • 나는 한페이지 당 10개에 데이터가 보일 수 있게 했고, 한 블럭은 5개씩 보이게 했다.

3. 현재 페이지는?

: $page 지금 내가 있는 페이지의 위치를 알려주는 변수다.
대신 처음 내가 공지사항을 눌러서 들어가면 무조건 1페이지를 보여줘야한다. 그래서 삼항 연산자를 이용해서

$page = isset($_GET['page']) ? $_GET['page'] : 1;
// get으로 값을 가져오는데 
// 페이지가 있으면 그 페이지를 보여주고 
// 페이지가 없으면 무조건 1페이지를 보여주게 했다.

4. 전체 페이지 수와 전체 블럭 수

$total_page = ceil($total_count / $list_num);
$total_block = ceil($total_page / $page_num);
  • $total_page : 전체 데이터 수 / 한 페이지 당 데이터 개수 => 80개의 글 / 10개 글 = 8 하고 나온 값에서 무조건 올림을 해줘야한다.
  • 81개의 글이 있다고 치면 81/10 = 8.1 이다. 8.1 페이지는 이세상에 절대 없다. 그렇다고 8페이지만 보여주면 나머지 1개의 게시글은 어디로 가는걸까? 그래서 무조건 올림을 해서 1개의 글이라도 9페이지 한페이지에 존재할 수있게 해줘야하는 것이다.
  • 내 현재 공지사항 페이지는 8페이지짜리의 공지사항 게시판이다. (아마 글의 전체 데이터 수는 계속 증가할테니까 페이지 수는 언제든지 바뀔 수있다.)
  • $total_block : 전체 페이지 / 한 블록당 페이지 수
  • 위에 구한 전체 페이지는 8 / 5 = 1.6 -> 올림해서 2이다.
  • 1~5까지 1블럭 / 6~8까지 2블럭 -> 글의 수가 늘어나면 2블럭도 5개로 꽉 찰 것이다.

5. 현재 블럭 번호

$now_block = ceil($page / $page_num);

: 현재 페이지 / 한 페이지 당 데이터 개수
내가 만약 1,2,3,4,5 페이지 중에 위치해 있으면 -> 1
내가 만약 6,7,8,9,10 페이지 중에 위치해 있으면 -> 2

6. 블럭 당 시작페이지 번호

$s_pageNum = ($now_block - 1) * $page_num + 1;
if ($s_pageNum <= 0) {
  $s_pageNum = 1;
}
  • 1번 블럭에선 1번 페이지가 시작페이지 번호이고
  • 2번 블럭에선 6번 페이지가 시작페이지 이다.
  • 또한 시작 페이지는 절대로 0보다 작을 수 없다. 그래서 0보다 작으면 1이라고 if문을 써서 설정해준다.

7. 블럭 당 마지막 페이지 번호

$e_pageNum = $now_block * $page_num;
if ($e_pageNum > $total_page) {
  $e_pageNum = $total_page;
}
  • 난 현재 2번 블럭까지 있다. 2*5 = 10 즉, 2번 블럭은 10번 페이지까지 가질 수 있다는 것이다. 근데 2번 블럭은 8번 페이지 밖에 없다. 그래서 $e_pageNum은 절대로 전체 페이지 수인 8페이지를 넘을 수 없는 것이다.

8. 시작 번호

  • 시작번호는 쿼리문 작성할 때 필요해서 구해야한다. 쿼리문에서는 1번이 0번이다.
$start = ($page-1) * $list_num;
$sql = "select * from boards order by idx desc limit $start, $list_num";
$result = mysqli_query($dbcon, $sql);
  • 1페이지에서는 0이 시작 / 2페이지에선 10이 시작
  • 쿼리문에 게시판은 최신글 순으로 보여주니까 옵션을 desc를 주고, 0번 부터 10개 글, 10번 부터 10개의 글 이런식으로 쿼리문을 작성해줬다.

9. 글번호

  • 글 번호는 저 부분을 말하는 것이다. 글 번호는 idx를 따르면 안된다.
    이유는

    나의 데이터베이스에서 첫번째 글 idx는 165이다. 그렇다고 해서 글 개수가 165개가 있는 것이 아니기 때문이다. 글은 언제든지 삭제될 수 있다.
$print_num = $total_count - $list_num*($page-1);

10. 응용해보기

  • while 반복문을 이용해서 1페이지에서는 10 -> 9 -> 8 -> ... 배열의 값이 있을 때까지 출력한다.
  • get으로 값을 넘겨준다.
  • 내용보기 페이지에서 필요한 값들이다.
  • idx는 현재글의 고유한 번호이고, no는 현재 글 번호이다.
profile
앞으로 나아가는 중~

0개의 댓글