Post

[PHP] 기본게시판

[PHP] 기본게시판

기본게시판 제작 요구사항

  • 페이지 번호가 표시된 글 목록 페이지
  • 조회수 표시
  • 글 내용 보기
  • 내용 검색
  • html 쓰기 가능
  • 글 수정
  • 글/수정 글 저장(한 파일에 처리)
  • 작성자와 관리자만 글 수정 및 삭제 가능

alt text 게시판 제작 파일

  • greet.sql: 가입인사 데이터베이스 테이블 생성
  • list.php: 글 목록 피이지
  • write_form.php: 글 쓰기 페이지
  • view.php: 글 내용보기 페이지
  • modify_form.php: 글 수정 페이지
  • insert.php: 글 저장 (수정 포함)
  • delete.php: 글 삭제

alt text 게시판의 페이지와 기능 흐름


데이터베이스 테이블 설계 및 생성

  • num(프라이머리키)
  • id
  • name
  • nick
  • subject(제목)
  • content
  • regist_day(작성일 및 시간)
  • hit(조회수)
  • is_html(html글쓰기)

/greet/greet.sql

1
2
3
4
5
6
7
8
9
10
11
12
create table greet (
  num int not null auto_increment,
  id char(15) not null,
  name  char(10) not null,
  nick  char(10) not null,
  subject char(100) not null,
  content text not null,
  regist_day char(20),
  hit int,
  is_html char(1),
primary key(num)
);

/greet/list.php

  • 세션변수 4개
  • $total_record=35 (총 레코드 수)
  • $scale = 10 (리스트 개수)
  • $page = 1 (페이지 번호)
  • $start = ($page - 1) * $scale; (0 / 시작 레코드 번호)
  • $number = $total_record - $start; (35 / 시작 일련번호)
  • 검색
    • form action = "list.php?mode=search" (get방식)
    • $find = subject, content, nick, name (필드이름) (post방식)
    • $search = (입력 검색어) (post방식)
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
<? 
  session_start();
  @extract($_POST);
  @extract($_GET);
  @extract($_SESSION);
?>
<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>가입인사 게시판</title>
  <link href="../css/common.css" rel="stylesheet" media="all">
  <link href="../css/greet.css" rel="stylesheet" media="all">
</head>
<?
  include "../lib/dbconn.php";

  if (!$scale) {
    $scale = 10;	// 한 화면에 표시되는 글 수
  }

  if ($mode=="search") {  // 검색 버튼을 통한 리스트 출력

    if (!$search) { // input입력값 없이 검색버튼 클릭 시  
      echo("
        <script>
          window.alert('검색할 단어를 입력해 주세요!');
          history.go(-1);
        </script>
      ");
      exit;
    }

    $sql = "select * from greet where $find like '%$search%' order by num desc";	// 검색내용 표시

  } else {	// 일반 리스트 출력(페이지번호)
    $sql = "select * from greet order by num desc";
  }

	$result = mysql_query($sql, $connect);
	$total_record = mysql_num_rows($result); // 전체 글 수

  // 전체 페이지 수($total_page) 계산 
  if ($total_record % $scale == 0) {
    $total_page = floor($total_record/$scale);

  } else {
    $total_page = floor($total_record/$scale) + 1;
  }

  if (!$page) {                 // 페이지번호($page)가 0 일 때
    $page = 1;	// 페이지 번호를 1로 초기화
  }
 
  // 표시할 페이지($page)에 따라 $start 계산
  $start = ($page - 1) * $scale;
  $number = $total_record - $start;
?>
<body>
  <div id="wrap">
    <div id="header"><? include "../lib/top_login2.php"; ?></div>
    <div id="menu"><? include "../lib/top_menu2.php"; ?></div>

    <div id="content">
      <div id="col1">
        <div id="left_menu"><? include "../lib/left_menu.php"; ?></div>
      </div>
      <div id="col2">

        <div id="title"><img src="../img/title_greet.gif"></div>

        <form  name="board_form" method="post" action="list.php?mode=search"> 
          <div id="list_search">
            <div id="list_search1">▷ 총 <?= $total_record ?> 개의 게시물이 있습니다.</div>
            <div id="list_search2"><img src="../img/select_search.gif"></div>
            <div id="list_search3">
              <select name="find">
                <option value='subject'>제목</option>
                <option value='content'>내용</option>
                <option value='nick'>별명</option>
                <option value='name'>이름</option>
              </select>
            </div>
            <div id="list_search4"><input type="text" name="search"></div>
            <div id="list_search5"><input type="image" src="../img/list_search_button.gif"></div>
          </div>
        </form>

        <select name="scale" onchange="location.href='list.php?scale='+this.value">
          <option value=''>보기</option>
          <option value='1'>1</option>
          <option value='2'>2</option>
          <option value='3'>3</option>
          <option value='4'>4</option>
        </select>

        <div class="clear"></div>

        <div id="list_top_title">
          <ul>
            <li id="list_title1"><img src="../img/list_title1.gif"></li>
            <li id="list_title2"><img src="../img/list_title2.gif"></li>
            <li id="list_title3"><img src="../img/list_title3.gif"></li>
            <li id="list_title4"><img src="../img/list_title4.gif"></li>
            <li id="list_title5"><img src="../img/list_title5.gif"></li>
          </ul>
        </div>

        <div id="list_content">
          <?		
          for ($i=$start; $i<$start+$scale && $i < $total_record; $i++) {
            mysql_data_seek($result, $i);
            // 가져올 레코드로 위치(포인터) 이동
            $row = mysql_fetch_array($result);
            // 하나의 레코드 가져오기

            $item_num     = $row[num];	// 실제 해당 레코드의 num필드에 있는 게시번호, 프라이머리 키
            $item_id      = $row[id];
            $item_name    = $row[name];
            $item_nick    = $row[nick];
            $item_hit     = $row[hit];

            $item_date    = $row[regist_day];	// 2022-02-21 (11:10)
            $item_date = substr($item_date, 0, 10);	// 2022-02-21

            $item_subject = str_replace(" ", "&nbsp;", $row[subject]);
            // srt_replace 문자를 교체함. " "공백문자가 들어있으면 &nbsp; 로 변경해서 찍는다.

          ?>
          <div id="list_item">
            <div id="list_item1"><?= $number ?></div>
            <div id="list_item2">
              <a href="view.php?num=<?=$item_num?>&page=<?=$page?>"><?= $item_subject ?></a>
            </div>
            <div id="list_item3"><?= $item_nick ?></div>
            <div id="list_item4"><?= $item_date ?></div>
            <div id="list_item5"><?= $item_hit ?></div>
          </div>
          <?
              $number--;
            }
          ?>
          <div id="page_button">
            <div id="page_num">
              ◀ 이전 &nbsp;&nbsp;&nbsp;&nbsp; 
              <?
              // 게시판 목록 하단에 페이지 링크 번호 출력
                for ($i=1; $i<=$total_page; $i++) {
                  if ($page == $i) {  // 현재 페이지 번호 링크 안함               
                    echo "<b> $i </b>";
                  } else {
                    if ($mode=="search") {  // 검색리스트일 때 (page, scale, mode, find, search)          
                      echo "<a href='list.php?page=$i&scale=$scale&mode=search&find=$find&search=$search'> $i </a>";
                    } else {  // 일반 리스트일 때
                      echo "<a href='list.php?page=$i&scale=$scale'> $i </a>";
                    }
                  }
                }
              ?>
              &nbsp;&nbsp;&nbsp;&nbsp;다음 ▶
            </div>
            <div id="button">
              <a href="list.php?page=<?=$page?>"><img src="../img/list.png"></a>&nbsp;
              <? if ($userid) {	// 로그인 했을 경우 ?>
              <a href="write_form.php"><img src="../img/write.png"></a>
              <? } ?>
            </div>
          </div>
				</div>
				<div class="clear"></div>

			</div>
		</div>
	</div>
</body>
</html>

/greet/write_form.php

  • 세션변수 4개
  • form
  • name = “board_form”
  • method = “post”
  • action = “insert.php”
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
<? 
  session_start();
  @extract($_POST);
  @extract($_GET);
  @extract($_SESSION);
?>
<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link href="../css/common.css" rel="stylesheet" media="all">
  <link href="../css/greet.css" rel="stylesheet" media="all">
</head>
<body>
  <div id="wrap">
    <div id="header"><? include "../lib/top_login2.php"; ?></div>
    <div id="menu"><? include "../lib/top_menu2.php"; ?></div>

    <div id="content">
      <div id="col1">
        <div id="left_menu"><? include "../lib/left_menu.php"; ?></div>
      </div>

      <div id="col2">        
        <div id="title"><img src="../img/title_greet.gif"></div>
        <div class="clear"></div>

        <div id="write_form_title"><img src="../img/write_form_title.gif"></div>
        <div class="clear"></div>

        <form  name="board_form" method="post" action="insert.php"> 
          <div id="write_form">
            <div class="write_line"></div>
            <div id="write_row1">
              <div class="col1">닉네임</div>
              <div class="col2"><?=$usernick?></div>
              <div class="col3">
                <input type="checkbox" name="html_ok" id="html_ok" value="y">
                <label for="html_ok">HTML 쓰기</label>
              </div>
            </div>
            <div class="write_line"></div>
            <div id="write_row2">
              <div class="col1">제목</div>
              <div class="col2"><input type="text" name="subject"></div>
            </div>
            <div class="write_line"></div>
            <div id="write_row3">
              <div class="col1">내용</div>
              <div class="col2"><textarea rows="15" cols="79" name="content"></textarea></div>
            </div>
            <div class="write_line"></div>
          </div>

          <div id="write_button">
            <input type="image" src="../img/ok.png">&nbsp;
            <a href="list.php?page=<?=$page?>"><img src="../img/list.png"></a>
          </div>
        </form>

      </div>
    </div>
  </div>
</body>
</html>

/greet/insert.php

  • 새 글 쓰기
    • $html_ok = y (체크 시) (post)
    • $subject = 글제목 (post)
    • $content = 글내용 (post)
  • 수정 글 쓰기
    • $mode = modify (get)
    • $num = db 해당 게시글 번호 (get)
    • $page = 페이지번호 (get)

글 저장/수정 시 유의사항
"" , '' , & , < , > 의 특수문자는 에러를 일으킬 수 있기 때문에 아래 함수를 사용하여 방지한다.

1
2
3
4
$subject = htmlspecialchars($subject);
$content = htmlspecialchars($content);
$subject = str_replace("'", "&#039;", $subject);
$content = str_replace("'", "&#039;", $content);
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
<? session_start(); ?>
<meta charset="utf-8">
<?
  @extract($_POST);
  @extract($_GET);
  @extract($_SESSION);
  //수정=>mode=modify&num=7&page=1
  
  if (!$userid) {
    echo("
      <script>
        window.alert('로그인 후 이용해 주세요.')
        history.go(-1)
      </script>
    ");
    exit;
  }

  if (!$subject) {
    echo("
      <script>
        window.alert('제목을 입력하세요.')
        history.go(-1)
      </script>
    ");
    exit;
  }

  if (!$content) {
    echo("
      <script>
        window.alert('내용을 입력하세요.')
        history.go(-1)
      </script>
    ");
    exit;
  }

  $regist_day = date("Y-m-d (H:i)");  // 현재의 '년-월-일-시-분'을 저장
  include "../lib/dbconn.php";       // dconn.php 파일을 불러옴

  if ($mode=="modify") {  // 수정일 때
    $subject = htmlspecialchars($subject);
    $content = htmlspecialchars($content);
    $subject = str_replace("'", "&#039;", $subject);
    $content = str_replace("'", "&#039;", $content);

    $sql = "update greet set subject='$subject', content='$content' where num=$num"; // sql 업데이트문

  } else {  //새글쓰기
	
    if ($html_ok=="y") {
      $is_html = "y";
    } else {
      $is_html = "";
    }
		
    $subject = htmlspecialchars($subject);
    $content = htmlspecialchars($content);
    $subject = str_replace("'", "&#039;", $subject);
    $content = str_replace("'", "&#039;", $content);
    //  "(&quot;) '(&#039;) &(&amp;) <(&lt;) >(&gt;)

    $sql = "insert into greet (id, name, nick, subject, content, regist_day, hit, is_html) ";
    $sql .= "values('$userid', '$username', '$usernick', '$subject', '$content', '$regist_day', 0, '$is_html')";
  }

  mysql_query($sql, $connect);  // $sql 에 저장된 명령 실행
  mysql_close();                // DB 연결 끊기

  echo "
    <script>
      location.href = 'list.php?page=$page';
    </script>
  ";
?>

/greet/view.php

  • 세션변수 4개
  • $num = db 해당 게시글 번호
  • $page = 페이지 번호

삭제버튼 클릭 시

1
if (confirm("문구")) { //실행문 }

html모드로 글을 쓰지 않은 경우 공백문자와 내려쓰기를 체크하여 변환해준다.

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
<? 
  session_start(); 
  @extract($_POST);
  @extract($_GET);
  @extract($_SESSION);

  //세션변수
  //view.php?num=7&page=1

  include "../lib/dbconn.php";

  $sql = "select * from greet where num=$num";
  $result = mysql_query($sql, $connect);

  $row = mysql_fetch_array($result);       
  // 하나의 레코드 가져오기

  $item_num     = $row[num];
  $item_id      = $row[id];
  $item_name    = $row[name];
  $item_nick    = $row[nick];
  $item_hit     = $row[hit];

  $item_date    = $row[regist_day];

  $item_subject = str_replace(" ", "&nbsp;", $row[subject]); 	// 공백문자 대체

  $item_content = $row[content];
  $is_html      = $row[is_html];

  if ($is_html!="y") {
    $item_content = str_replace(" ", "&nbsp;", $item_content);	// 공백문자 대체
    $item_content = str_replace("\n", "<br>", $item_content);	// 내려쓰기 대체
  }

  $new_hit = $item_hit + 1;

  $sql = "update greet set hit=$new_hit where num=$num";   // 글 조회수 증가시킴
  mysql_query($sql, $connect);
?>
<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link href="../css/common.css" rel="stylesheet" media="all">
  <link href="../css/greet.css" rel="stylesheet" media="all">
  <script>
    function del(href)  {
      if (confirm("한번 삭제한 자료는 복구할 방법이 없습니다.\n\n정말 삭제하시겠습니까?")) {
      document.location.href = href;
      }
    }
  </script>
</head>
<body>
  <div id="wrap">
    <div id="header"><? include "../lib/top_login2.php"; ?></div>
    <div id="menu"><? include "../lib/top_menu2.php"; ?></div>

    <div id="content">
      <div id="col1">
        <div id="left_menu"><? include "../lib/left_menu.php"; ?></div>
      </div>

      <div id="col2">

        <div id="title"><img src="../img/title_greet.gif"></div>

        <div id="view_comment">&nbsp;</div>

        <div id="view_title">
         <div id="view_title1"><?= $item_subject ?></div>
          <div id="view_title2"><?= $item_nick ?> | 조회 : <?= $item_hit ?> | <?= $item_date ?> </div>	
        </div>

        <div id="view_content"><?= $item_content ?></div>

        <div id="view_button">
          <a href="list.php?page=<?=$page?>"><img src="../img/list.png"></a>
          <? if ($userid==$item_id || $userlevel==1 || $userid=="admin") { ?> // 로그인된 아이디 == 글쓴이 이거나 최고 관리자면 참
          <a href="modify_form.php?num=<?=$num?>&page=<?=$page?>"><img src="../img/modify.png"></a>
          <a href="javascript:del('delete.php?num=<?=$num?>')"><img src="../img/delete.png"></a>
          <? } ?>
          <? if ($userid) { ?>  //로그인이 되면 글쓰기
          <a href="write_form.php"><img src="../img/write.png"></a>
          <? } ?>
        </div>

        <div class="clear"></div>

      </div>
    </div>
  </div>

</body>
</html>

/greet/modify_form.php

  • 세션변수 4개
  • $num = db 해당 게시글 번호
  • $page = 페이지번호
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
<? 
  session_start(); 
  @extract($_POST);
  @extract($_GET);
  @extract($_SESSION);
  //세션변수 4
  //num=7&page=1

  include "../lib/dbconn.php";

  $sql = "select * from greet where num=$num";
  $result = mysql_query($sql, $connect);

  $row = mysql_fetch_array($result);       	
  $item_subject = $row[subject];
  $item_content = $row[content];
?>
<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link href="../css/common.css" rel="stylesheet" media="all">
  <link href="../css/greet.css" rel="stylesheet" media="all">
</head>
<body>
  <div id="wrap">
    <div id="header"><? include "../lib/top_login2.php"; ?></div>

    <div id="menu"><? include "../lib/top_menu2.php"; ?></div>

    <div id="content">
      <div id="col1">
        <div id="left_menu"><? include "../lib/left_menu.php"; ?></div>
      </div>

      <div id="col2">
      <div id="title"><img src="../img/title_greet.gif"></div>

      <div class="clear"></div>

      <div id="write_form_title"><img src="../img/write_form_title.gif"></div>

      <div class="clear"></div>
        <form  name="board_form" method="post" action="insert.php?mode=modify&num=<?=$num?>&page=<?=$page?>"> 
          <div id="write_form">
            <div class="write_line"></div>
            <div id="write_row1">
              <div class="col1">닉네임</div>
              <div class="col2"><?=$usernick?></div>
            </div>
            <div class="write_line"></div>
            <div id="write_row2">
              <div class="col1">제목</div>
              <div class="col2"><input type="text" name="subject" value="<?=$item_subject?>" ></div>
            </div>
            <div class="write_line"></div>
            <div id="write_row3">
              <div class="col1">내용</div>
              <div class="col2">
              <textarea rows="15" cols="79" name="content"><?=$item_content?></textarea>
            </div>
            </div>
            <div class="write_line"></div>
          </div>

          <div id="write_button">
            <input type="image" src="../img/ok.png">&nbsp;
            <a href="list.php?page=<?=$page?>"><img src="../img/list.png"></a>
          </div>
        </form>

      </div>
    </div>
  </div>
</body>
</html>

/greet/delete.php

  • 세션변수 4개
  • $num = db 해당 게시글 번호 (get)

view.php 페이지에서 삭제 버튼 클릭 시 자바스크립트로 alert 창 안내 후(진짜삭제??) delete.php 실행

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?
  session_start();
  @extract($_POST);
  @extract($_GET);
  @extract($_SESSION);

  include "../lib/dbconn.php";

  $sql = "delete from greet where num = $num";
  mysql_query($sql, $connect);

  mysql_close();

  echo "
    <script>
      location.href = 'list.php';
    </script>
  ";
?>

bbs.zip download

This post is licensed under CC BY 4.0 by the author.