티스토리 뷰
안녕하세요, 초짜입니다.
저번 시간에 수정 페이지까지 해서 기본적인 기능은 다 구현한 것 같습니다.
이번에는 저번에 말씀드렸다시피 페이징을 해보겠습니다.
보시는 바와 같이 밑의 [1]처럼 글이 5개 이하면 [1]만 나오고 10개 이하면 [2]까지 나오고... 그렇게 해보겠습니다.
우선 필요한 것을 알아야 합니다.
우선 글의 총 개수를 알아야 할 것이고 한 페이지 당 최대 글의 개수를 알아야 합니다.
저는 한 페이지 당 최대 5개의 글을 올리고 싶습니다.
그렇게 바뀐 코드를 한번 보겠습니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>글 쓰기 페이지</title>
</head>
<body>
<?php
$conn = mysqli_connect("localhost","사용자이름","비밀번호");
$db = mysqli_select_db($conn, "");
$pageNum = 5;
$sql = "SELECT * FROM guestbook ORDER BY id DESC";
$result = $conn->query($sql);
$pageTotal = mysqli_num_rows($result);
$sql = "SELECT * FROM guestbook ORDER BY id DESC limit 0, $pageNum";
$result = $conn->query($sql);
?>
<br />
<center>
<form action="insert.php" method="post">
<table border=1 width=600>
<tr>
<td>이름</td><td><input type="text" name="name"></td>
<td>비밀번호</td><td><input type="password" name="pass"></td>
</tr>
<tr>
<td colspan=4>
<textarea placeholder="내용을 입력하세요" name="content" rows="8" cols="80"></textarea>
</td>
</tr>
<tr>
<td colspan=4 align=right><input type="submit" value="확인"></td>
</tr>
</table>
</form>
<br />
<?php
while($row=$result->fetch_array()){
echo "<table width=600 border=1><tr>";
echo "<td>No. $row[id]</td>";
echo "<td>$row[name]</td>";
echo "<td>$row[wdate]</td>";
echo "<td><a href='modifycheck.php?id=$row[id]'>수정</a></td>";
echo "<td><a href='delete.php?id=$row[id]'>삭제</a></td></tr>";
echo "<tr><td colspan=5>$row[content]</td>";
echo "</tr></table>";
echo "<br />";
}
?>
</center>
</body>
</html>
수정된 list.php입니다. 바뀐 부분은 빨간색으로 표시했습니다.
간략하게 설명해보자면 pageNum 변수는 5가 들어간 것을 봐선 한 페이지 당 최대 글의 개수입니다.
pageTotal은 위의 쿼리문을 이용해서 나온 글의 총 개수입니다.
그 밑의 쿼리에서 처음 보시는 것이 있으실텐데 limit일 겁니다.
limit x, y라고 하면 최신부터 x번째에서 y개를 가져온다는 뜻입니다.
저 코드로 치면 최신 0번째부터 pageNum개, 즉 5개를 가져오므로 최신 5개를 가져온다고 볼 수 있습니다.
이렇게 되면 result가 쓰이는 밑의 while문에도 변화가 생기겠죠.
이젠 while문은 모든 글을 보여주지 않고 최신 5개만을 보여줄 것입니다. 확인해봅시다.
5개의 글이 있는 상태고 여기서 하나를 더 추가해보겠습니다.
보시는 바와 같이 No. 1이 사라졌습니다.
하지만 이렇게 해서는 최신 5개만 보이지 나머지 글은 볼 수가 없습니다.
그래서 이 쿼리문을 수정해야 할 것입니다.
$sql = "SELECT * FROM guestbook ORDER BY id DESC limit 0, $pageNum";
limit x, y일때 x값이 유동적이어야 전부 볼 수 있습니다.
만약에 x값이 0, 5, 10 이렇게 5씩 변화된다면 첫번째부터 다섯번쨰, 여섯번째부터 열번째...
이렇게 할 수가 있습니다.
사실 잘 이해가 안되실 수가 있습니다...제가 설명을 잘 못하는데다가 어려운 개념이라서 말이죠.
한번 무작정 따라해보겠습니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>글 쓰기 페이지</title>
</head>
<body>
<?php
$conn = mysqli_connect("localhost","사용자이름","비밀번호");
$db = mysqli_select_db($conn, "데이터베이스이름");
$pageNum = 5;
$sql = "SELECT * FROM guestbook ORDER BY id DESC";
$result = $conn->query($sql);
$pageTotal = mysqli_num_rows($result);
$start = $_GET['start'];
if(!$start) $start=0;
$sql = "SELECT * FROM guestbook ORDER BY id DESC limit $start, $pageNum";
$result = $conn->query($sql);
?>
<br />
<center>
<form action="insert.php" method="post">
<table border=1 width=600>
<tr>
<td>이름</td><td><input type="text" name="name"></td>
<td>비밀번호</td><td><input type="password" name="pass"></td>
</tr>
<tr>
<td colspan=4>
<textarea placeholder="내용을 입력하세요" name="content" rows="8" cols="80"></textarea>
</td>
</tr>
<tr>
<td colspan=4 align=right><input type="submit" value="확인"></td>
</tr>
</table>
</form>
<br />
<?php
while($row=$result->fetch_array()){
echo "<table width=600 border=1><tr>";
echo "<td>No. $row[id]</td>";
echo "<td>$row[name]</td>";
echo "<td>$row[wdate]</td>";
echo "<td><a href='modifycheck.php?id=$row[id]'>수정</a></td>";
echo "<td><a href='delete.php?id=$row[id]'>삭제</a></td></tr>";
echo "<tr><td colspan=5>$row[content]</td>";
echo "</tr></table>";
echo "<br />";
}
$pages = $pageTotal / $pageNum;
for($i=0; $i<$pages; $i++){
$nextPage = $pageNum * $i;
echo "<a href=$_SERVER[PHP_SELF]?start=$nextPage>[$i]</a>";
}
?>
</center>
</body>
</html>
마찬가지로 바뀐 부분은 빨간색으로 표시했습니다.
쿼리문은 뒷부분에서 설명해드리겠습니다.
우선 위에서 start 변수를 선언해줬습니다.
start의 값이 GET으로 전달받은 start인 것도 밑에서 설명하겠습니다.
그리고 start값이 없을 때에는 0으로 초기화됩니다.
밑의 바뀐 코드를 보자면 pages 변수는 pageTotal / pageNum입니다.
pageNum은 5이므로 넘어가고 pageTotal이 만약에 11이면 11 / 5이므로 pages는 2가 됩니다.
pages는 이런식으로 0부터 1씩 늘어나는 수겠고
밑에 for문을 볼 수 있는데요, i라는 증감 변수가 pages보다 작으면 1씩 늘어납니다.
그리고 밑에서 nextPage 변수는 5 * i네요.
이걸 보아 nextPage는 5씩 늘어나는 5의 배수 혹은 0이 되겠습니다.
잘 보시면 i + 1이 페이지의 개수가 됩니다.
밑을 보시면 이제 echo를 이용하여 [1]과 같이 링크를 만들었습니다.
$_SERVER[PHP_SELF]는 알다시피 자기 자신 페이지라는 뜻이며
뒷부분에 ?start = $nextPage를 봤을 때 $_GET['start']는 nextPage가 되는 것을 알 수 있습니다.
다시 위를 보시면 $start = $_GET['start] 코드가 있죠? 그걸 봤을 때 start는 0, 5, 10처럼 5의 배수 혹은 0입니다.
그리고 맨 위에서 바뀐 쿼리문을 보자면 limit $start, $pageNum입니다.
한번 예를 들어보겠습니다. 전체 글의 개수가 6개라면
pageTotal은 6이고 pageNum은 5이므로 pages는 1입니다.
for문은 두번 돌 것이고 i는 최종적으로 1이 됩니다.
nextPage는 5 * 1이 되어 5일 것입니다.
그리고 a태그를 사용하여 자기 자신에게 GET 방식으로 start값이 5인 것을 전달합니다.
start 변수는 GET 방식으로 전달받은 start를 저장하므로 start 변수는 5가 됩니다.
그리고 쿼리문을 다시 보겠습니다. limit 5, 5이므로 최신에서부터 5번째에서 5개를 검색하지만
총 글의 개수는 6개이므로 1개만 검색하게 되겠습니다.
생각보다 상당히 복잡했습니다. 되는지 한번 실행해보겠습니다.
밑에 페이지 번호가 생겼습니다. [1]을 눌러봅시다.
위의 주소를 봅시다. start가 5가 된 것을 보실 수 있습니다.
그리고 No. 1의 글이 보이네요.
페이지 번호가 시작 번호가 0인데 1로 바꾸고 싶으시면
다른 변수를 선언하고 i+1을 담고 그 변수를 a 태그에 넣으시면 되겠습니다.
이렇게 페이징도 구현했습니다.
다음 시간에는 이제 PHP 방명록 만들기 마무리와 동시에 개선할 점 등을 포스팅할것 같네요.
이번 포스팅은 여기까지입니다, 감사합니다.
댓글 한번씩 달아주시면 감사하겠습니다!
'Web > Project' 카테고리의 다른 글
[Project] PHP 방명록 만들기 7) : 끝 (2) | 2018.01.29 |
---|---|
[Project] PHP 방명록 만들기 5) : 수정 페이지 완성(modifycheck.php, modify.php, update.php) (1) | 2018.01.21 |
[Project] PHP 방명록 만들기 4) : 삭제 페이지 완성(delete.php) (5) | 2018.01.19 |
[Project] PHP 방명록 만들기 3) : 추가 페이지 완성(insert.php, list.php) (0) | 2018.01.14 |
[Project] PHP 방명록 만들기 2) : 메인 페이지 구성(list.php) (1) | 2018.01.13 |