0
 33   4   1
  View Articles

Name  
   손병목  (2002-11-16 18:45:16, Hit : 39310, Vote : 1919)
Homepage  
   http://www.itmembers.net
Subject  
   게시판 글 목록 보기 기능(3) list.php 설명(上)

지난 시간에 공개한 소스 코드를 하나하나 설명합니다.
어느정도 주석이 있으니 최대한 스스로 이해를 하는 게 중요합니다.

오늘 다룰 1~27행은 mysql DB에 연결하는 부분과, 프로그램에 필요한 변수를 설정하는 부분, 그리고 bbs 테이블에서 목록을 뽑아내기 위해 sql 쿼리를 날리고(?) 그 결과를 변수에 저장하는 부분 등으로 구성되어 있습니다.

  1. <?
  2. //DB에 연결하는 부분입니다. 항상 반복되는 부분이니 꼭 암기!!!
  3. mysql_connect("localhost", "phpbbs", "phpbbs") or die (mysql_error());
  4. mysql_select_db("itmembers");
  5.  
  6. //게시판 목록보기에 필요한 각종 변수 초기값을 설정합니다.
  7. $tablename="bbs"; //테이블 이름
  8. if($page == '') $page = 1; //페이지 번호가 없으면 1
  9. $list_num = 10; //한 페이지에 보여줄 목록 갯수
  10. $page_num = 10; //한 화면에 보여줄 페이지 링크(묶음) 갯수
  11. $offset = $list_num*($page-1); //한 페이지의 시작 글 번호(listnum 수만큼 나누었을 때 시작하는 글의 번호)
  12.  
  13. //전체 글 수를 구합니다. (쿼리문을 사용하여 결과를 배열로 저장하는 일반적인 방법)
  14. $query="select count(*) from $tablename"; // SQL 쿼리문을 문자열 변수에 일단 저장하고
  15. $result=mysql_query($query) or die (mysql_error()); // 위의 쿼리문을 실제로 실행하여 결과를 result에 대입
  16. $row=mysql_fetch_row($result); //위 결과 값을 하나하나 배열로 저장합니다.
  17. $total_no=$row[0]; //배열의 첫번째 요소의 값, 즉 테이블의 전체 글 수를 저장합니다.
  18.  
  19. //전체 페이지 수와 현재 글 번호를 구합니다.
  20. $total_page=ceil($total_no/$list_num); // 전체글수를 페이지당글수로 나눈 값의 올림 값을 구합니다.
  21. $cur_num=$total_no - $list_num*($page-1); //현재 글번호
  22.  
  23. //bbs테이블에서 목록을 가져옵니다. (위의 쿼리문 사용예와 비슷합니다.)
  24. $query="select * from $tablename order by number desc limit $offset, $list_num"; // SQL 쿼리문
  25. $result=mysql_query($query) or die (mysql_error()); // 쿼리문을 실행 결과
  26. //쿼리 결과를 하나씩 불러와 실제 HTML에 나타내는 것은 HTML 문 중간에 삽입합니다.
  27. ?>

설명의 편의상 14행부터 볼까요. 6~11행에서 선언한 변수는 아래에서 실제 사용될 때 자세하게 설명하기로 하죠.

14행을 보면 $tablename 즉 bbs 테이블의 레코드 수를 구하는 쿼리문을 $query 변수에 저장한 것입니다.
15행에서 $query 문을 실행하여 그 결과값을 $result 변수에 저장합니다.(실패하면 에러 메시지를 표시하고...)

24행의 쿼리문은 bbs 테이블에서 모든 것을 불러오되, number 필드(컬럼)를 기준으로 내림차순으로 정렬하여 표시하라는 문장입니다. 단 $offset 행부터 $list_num 개만큼 불러오라는 뜻입니다.
여기서 $offset 변수에는 한 페이지의 시작 글 번호가 저장되어 있고, $list_num에는 한 페이지에 표시할 목록의 개수가 저장되어 있습니다.

위 소스 9행을 보면 $list_num10으로 지정되어 있으므로, 한 페이지에 목록의 개수를 10개씩 표시한다는 뜻입니다.
11행에서 $offset에는 $list_num*($page-1) 의 값이 저장되도록 되어 있습니다. 이는 현재 페이지 수에서 1을 뺀 값을 $list_num과 곱하여 구한 값입니다. 무슨 뜻일까요?!#$@!#$!@#$

만약 전체 글의 수가 55개라고 가정해 봅시다. 그리고 $list_num(한 페이지에 보여줄 목록의 수)가 10이라고 하면,
1페이지에는 0~9 행이,
2페이지에는 10~19행,
3페이지에는 20~29행,
4페이지에는 30~39행,
5페이지에는 40~49행,
6페이지에는 50~55행까지 표시될 것입니다. mysql 쿼리를 사용할 때 시작하는 레코드 행 번호는 0부터 시작됩니다. (실제 화면에 표시되는 숫자와는 다르죠...)
이것을 다시 표로 그리면 다음과 같습니다.

페이지번호($page)

글 시작 번호($offset)

글 마지막 번호

1

0

9

2

10

19

3

20

29

4

30

39

5

40

49

6

50

55

16행은 참 중요합니다. 이번에 첨 나오죠?
15행에서 쿼리의 결과값을 $result에 저장하였습니다. 그러나 이렇게 저장된 값을 그대로 사용할 수는 없습니다. php에서는 mysql 쿼리를 통해 얻은 결과를 다시 배열 형태로 저장하여 하나씩 불러내어 사용하게 됩니다.
mysql_fetch_row() 함수는 쿼리 결과를 배열로 저장하는 기능을 합니다. 예를 들어 위에서와 같이
$row=mysql_fetch_row($result); 와 같이 하였다면,
$row[0]에 실행 결과의 처음 값이 들어가겠죠. 15행의 쿼리 결과는 전체 레코드 수를 구하는 것이므로 하나의 값만 리턴하게 되므로 결국 $row[0]의 값만 있으면 되는 겁니다. 만약 24행에서의 같은 쿼리라면 그 결과로 $row[0], $row[1], $row[2]... 와 같이 차례대로 저장이 될 것입니다. 단 이 함수는 하나의 레코드에에만 해당되므로 여러 레코드의 결과 값을 차례대로 얻을려면 레코드 수만큼 반복해야 합니다.63행은 보면 while 문을 사용하여 레코드 수만큼 반복하여 그 결과값을 배열로 저장하는 예가 되겠습니다.

mysql_fetch_row()와 비슷한 역할을 하는 함수로 mysql_fetch_array() 함수가 있습니다. 63행에서는 이 함수가 사용되었습니다. 다음 시간에 그 차이를 설명하죠.

17행에서 전체 레코드 수를 저장하고, 20~21행에서는 전체 페이지 수와 현재 글 번호를 구합니다.
17행은 위에서 이미 설명드렸으니 생략하고, 20행을 보죠.
17행에서 구한 전체 레코드 수(전체 글 수가 되겠죠)를 한 페이지당 출력될 목록 수 - 위에서 10이라고 정했었죠? 그 수로 나눈 값의 올림 값을 구하는 겁니다. 즉 전체 글 수가 55개라면, 55/10 = 5.5 이므로 올림 수이니까 6이 되겠죠.
즉 55개의 글을 모두 표시하려면 6페이지가 필요하다는 겁니다. 왜 6페이지가 필요한 지 그래도 이해가 안되면 위의 도표를 다시 한번 봐주세요.

이번 시간에는 여기까지 설명드리죠.
SQL 문에 대해 자세히 설명드리지 않는 것은, SQL 자체만으로도 많은 설명이 필요하기 때문입니다. SQL 문에 대한 자세한 설명은, '재미로 배우는 오라클(SQL) 입문' 과정을 참조하시기 바랍니다.

이상 동주의 방해에도 불구하고 꿋꿋하게 강좌를 쓰고 있는 동주아빠 손병목이었습니다.


Prev
   게시판 글 목록 보기 기능(4) list.php 설명(中)

손병목
Next
   게시판 글 목록 보기 기능(2) list.php 소스코딩

손병목


Copyright 1999-2022 Zeroboard / skin by Zetyx