본문 바로가기

[게시판] 게시글 목록

DB에서 읽어와서 띄우는 게 다라서 폼 페이지와 기능 페이지를 나눌 필요가 없다고 생각했다.

말로 하면 간단하지만 고려할 게 생각보다 많았다..

 

 

 

1. 게시글 목록

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
<!DOCTYPE html>
<?php
    include "./session.php";
    include "./connectDB.php";
 
    $conn = connectDB();
    $query = "SELECT name FROM users WHERE id=\"$id\"";
    $result = mysqli_query($conn$query);
    $arr = mysqli_fetch_array($result, MYSQLI_ASSOC);
    $name = $arr["name"];
?>
 
<html>
    <head>
        <meta charset="utf-8" />
        <title> 글 목록 </title>
    </head>
 
    <body>
        <table align="center" border="1" width="1000">
            <tr> 
                <td align="right" colspan="4">
                    현재 사용자: <?=$name?>
                </td>
            </tr>
                <tr align="center">
                <td width="80"> 번호 </td>
                <td width="500"> 제목 </td>
                <td> 작성자 </td>
                <td width="160"> 작성 시각 </td>
            </tr>    
    <?php
        if(isset($_GET["idx"])) { 
            $idx = $_GET["idx"]; 
        } else { 
            $idx = 1
        }
        
        //숫자가 아니라면
        if(preg_match("/[^0-9]+/"$_GET["idx"])) {
    ?>
            <script>
                alert("No hack");
                history.back();
            </script>
    <?php
        }
        
        $query = "SELECT * FROM posts";
        $result = mysqli_query($conn$query);
        $postsNum = mysqli_num_rows($result); //총 게시글 수
        $listSize = 10//한 페이지 당 목록에 담기는 게시글 수
        $oneSecSize = 10//한 페이지에서 보여줄 페이지 수 (1~10, 11~20)
        $pageSize = ceil($postsNum / $listSize); //총 페이지 수. ceil()은 소수점 아래를 무조건 올린다.            
         
        /* idx는 1보다 작을 수 없고, 총 페이지 수보다 클 수 없다. */
        if($idx < 1) { 
            $idx = 1
        } else if($idx > $pageSize) { 
            $idx = $pageSize;
        }
        
        $curSection = ceil($idx / $oneSecSize); //현재 구역
        $secSize = ceil($pageSize / $oneSecSize); //총 구역 수
 
        /*현재 구역의 시작 페이지와 마지막 페이지*/
        $startPage = ($curSection - 1)*$oneSecSize + 1;
        $endPage = $curSection * $oneSecSize;
 
        if($endPage > $pageSize) { $endPage = $pageSize; }
 
        $start = ($idx - 1* 10 + 1;
        $end = $start + 9;
 
        /*글 10개 읽어옴*/
        $offset = $listSize * ($idx - 1);
        $query = "SELECT * FROM posts ORDER BY seq DESC LIMIT $offset, $listSize";
        $result = mysqli_query($conn$query); 
 
        while($arr = mysqli_fetch_array($result)) {
            $seq = $arr['seq'];
            $subject = $arr['subject'];
            $writer = $arr['writer'];
            $posted = $arr['posted'];
    ?>  
              <tr align="center">
                  <td width="80"> <?=$seq?> </td>
                  <td width="500"> <a href="./view.php?postNum=<?=$seq?>"> <?=$subject?> </a> </td>
                  <td> <?=$writer?> </td>
                <td width="160"> <?=$posted?> </td>
              </tr>
     <?php
        } //while
    ?>
            <tr>
                <td colspan="4" align="right">
                    <form method="GET" action="./search.php">
                        <select name="searchType">
                            <option value="1">제목</option>
                            <option value="2">내용</option>
                            <option value="3">제목+내용</option>
                        </select>
                        <input type="text" name="searchValue"/>
                        <input type="submit" value="검색"/>
                        <input type="button" value="로그아웃" onclick="location.href='./logout.php'" />
                        <input type="button" value="게시글 작성" onclick="location.href='./write_form.php'" />
                    </form>
                </td>
            </tr>
        </table>
        <div name="list" align="center">
    <?php
        /*[이전]: 10만큼 앞으로*/
        if($curSection > 1) {
            $prevPage = $startPage - 1;
    ?>
            <a href="./list.php?idx=<?=$prevPage?>">[이전]</a>
    <?php
           } //if
 
           /*[1][2][3][4] ... [9][10]*/
           for($idxes = $startPage$idxes <= $endPage$idxes++) {
              if($idxes == $idx) {
       ?>
                <a href="./list.php?idx=<?=$idxes?>"><b>[<?=$idxes?>]</b></a>            
    <?php
              } else {
    ?>
                   <a href="./list.php?idx=<?=$idxes?>">[<?=$idxes?>]</a>        
       <?php
               }
         }
           /*[다음]: 10만큼 뒤로*/
           if($curSection < $secSize) {
               $nextPage = $endPage + 1;
        ?>
                <a align="center" href="./list.php?idx=<?=$nextPage?>">[다음]</a>
      <?php
          }
       ?>
        </div>
    </body>
</html>
 
cs

 

 

10행: 현재 로그인 된 사용자의 이름을 얻어와서

23행: 게시판 위에 표시한다.

 

27행 ~ 30행: 전체 폭이 1000이므로 29행의 폭은 자동으로 260(1000 - (80 + 500 + 160))이 된다.

                         지금 보니 굉장히 단위가 없다. 다시 한다면 px같은 단위를 명시할 듯.

 

33행 ~ 37행: 현재 위치를 GET 방식으로 읽어온다. 이 값이 어떻게 쓰이는 지는 아래에서 설명한다.

 

51행: DB에 저장된 게시글 수를 읽어온다.

 

52행: 한 페이지에서 보여줄 글의 수를 10으로 지정하고

53행: 한 페이지에서 보여줄 페이지 수(한 구역의 크기)를 10으로 지정한다.

           따라서 페이지 아래에 다음과 같이 표시된다.

 [이전]    1    2    3    4    5    6    7    8    9    10    [다음]

 

54행: 총 페이지 수. 그러니까 글을 10개 단위로 보여주려면 총 몇 페이지가 필요한 지를 나타낸다.

            ceil 함수를 사용한 이유는 버려지는 글이 없게 하기 위함이다.

           예를 들어 글이 146개 저장되어 있다고 하자. 만약 ceil 함수를 사용하지 않는다면 총 페이지 수는 14가 되며,

           이렇게 되면 6개의 글은 게시판에서 보이지 않게 된다. 따라서 소수점 아래를 버리는 floor 함수가 아니라,

           소수점 아래를 올리는 ceil 함수를 사용하는 것이 적절하다.

 

57행 ~ 60행: idx 값을 검사한다.

 

63행: idx는 페이지 번호를 나타낸다. 따라서 이 값을 oneSecSize로 나누면 몇 번째 구역인지 알 수 있다.

           idx가 1~10이면 첫 번째 구역, idx 11~20이면 두 번째 구역, ... 과 같은 규칙으로 정해진다.

 

64행: 전체 구역의 수. 앞에서 든 예시대로 글이 146개 있고, 이를 통해 총 페이지 수가 15로 정해졌다고 하자.

           15를 10으로 나눈 값은 1.5가 되고, 페이지 수는 15개이므로 필요한 구역의 수는 2다.

           이 때문에 ceil 함수를 사용한 것이다. 게시판에서 볼 수 없는 페이지를 없게 하기 위함이라는 것이다.

           만약 소수점 아래를 버리게 된다면 구역의 수는 1이 되고, 5개의 페이지는 볼 수 없게 된다.

 

67행: 현재 구역이 1이면 시작 페이지는 1이다.

           현재 구역이 2이면 시작 페이지는 11이다.

           현재 구역이 3이면 시작 페이지는 21이다.

           따라서 {(현재 구역 - 1) * (한 구역의 크기) + 1}이라는 식이 성립한다.

 

68행: 현재 구역이 1이면 시작 페이지는 1이다.

           현재 구역이 2이면 끝 페이지는 20이다.

           현재 구역이 3이면 끝 페이지는 30이다.

           따라서 {(현재 구역) * 한 구역의 크기)}라는 식이 성립한다.

           근데 지금보니까 startPage + 9로 해도 될 것 같다. 

 

70행: 만약 글이 146개가 있고, 마지막 구역이라고 하자. 그러면 다음과 같이 표시해야 한다.

 [이전]    141    142    143    144    145    146 

           마지막 구역은 15 번째 구역이므로 curSection의 값은 15가 된다. 따라서 endPage의 값은 150이 된다.

           그런데 글은 146개가 있으므로 endPage의 값은 146이어야 한다.

           이런 경우, 다시 말해 endPage의 값이 pageSize(전체 글 수)보다 클 경우 endPage에 pageSize를 대입한다.

 

72행: 현재 페이지 수를 67행의 식에 대입해 현재 페이지에 해당하는 구역의 시작 페이지를 알아내고

73행: 그 값에 9를 더해 현재 페이지에 해당하는 구역의 끝 페이지를 알아낸다.

 

76행: MySQL 쿼리에서 LIMIT 구문을 사용하기 위한 값이다. (idx - 1)*10이므로 offset의 값은 0, 10, 20, ...이 된다.

77행: post 테이블에서 seq 번호에 의해 내림차순 정렬해서 offset번째 레코드부터 listSize개만 읽어온다는 의미다.

           이 때 레코드는 0번째부터 시작이므로 offset의 값은 0, 10, 20이 되어야 한다.

           offset의 값이 0이면 0번째 글부터 9번째 글까지(seq로 따지면 1 ~ 10) 읽어오고,

           offset의 값이 1이면 10번째 글부터 19번째 글까지(seq로 따지면 11 ~ 20) 읽어오고, ...

 

80행: 더이상 읽어올 레코드가 없으면 반복문을 탈출한다.

88행: GET 방식으로 글 번호를 게시글 조회 페이지(view.php)에 전달한다.

 

 

 

95행  ~ 109행: 검색을 위한 옵션. 제목 검색은 1, 내용 검색은 2, 제목+내용 검색은 3에 대응되며, GET 방식으로 전송된다.

                            검색 버튼을 누르면 검색 페이지(search.php)로 이동한다.

 

114행: curSection이 1보다 클 때만 (현재 페이지 번호가 11 이상일 때만) [이전] 버튼을 나타낸다.

 

122행: 현재 구역의 시작 페이지부터 끝 페이지까지 반복한다.

125행: 현재 페이지는 대괄호와 굵은 글씨로 강조한다.

 

134행: curSection이 secSize보다 작을 때만 (현재 페이지 번호가 전체 페이지 수보다 작을 때만) [다음] 버튼을 나타낸다.

'Programming > Web' 카테고리의 다른 글

[게시판] 게시글 검색  (0) 2019.07.18
[게시판] 게시글 조회  (0) 2019.07.18
[게시판] 게시글 삭제  (0) 2019.07.18
[게시판] 게시글 수정  (0) 2019.07.17
[게시판] 게시글 작성  (0) 2019.07.16