기본게시판

2022. 2. 21. 10:38Study/PHP&MySQL

기본게시판 제작 요구사항

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

 

게시판 제작 파일

 

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

 

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

 

 


 

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

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

 

/greet/greet.sql

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방식)

<? 
	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><!-- end of page_button -->

				</div><!-- end of list content -->

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

			</div><!-- end of col2 -->
		</div><!-- end of content -->
	</div><!-- end of wrap -->

</body>
</html>

 

 

 

/greet/write_form.php

세션변수 4개

form

name = "board_form"

method = "post"

action = "insert.php"

<? 
	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> <!-- end of col2 -->
		</div> <!-- end of content -->
	</div> <!-- end of wrap -->

</body>
</html>

 

 

 

/greet/insert.php

*새 글 쓰기

$html_ok = y (체크 시) (post)

$subject = 글제목 (post)

$content = 글내용 (post)

 

*수정 글 쓰기

$mode = modify (get)

$num = db 해당 게시글 번호 (get)

$page = 페이지번호 (get)

 

*글 저장/수정 시 유의사항

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

$subject = htmlspecialchars($subject);
$content = htmlspecialchars($content);
$subject = str_replace("'", "&#039;", $subject);
$content = str_replace("'", "&#039;", $content);

 

<? 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 = 페이지 번호

 

*삭제버튼 클릭 시

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

 

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

<? 
	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><!-- end of col2 -->
		</div><!-- end of content -->
	</div><!-- end of wrap -->

</body>
</html>

 

 

 

 

/greet/modify_form.php

세션변수 4개

$num = db 해당 게시글 번호

$page = 페이지번호

<? 
	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><!-- end of col2 -->
		</div><!-- end of content -->
	</div><!-- end of wrap -->

</body>
</html>

 

 

 

/greet/delete.php

세션변수 4개

$num = db 해당 게시글 번호 (get)

 

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

<?
    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>
    ";
?>

 

 

 

 

greet.zip
0.01MB

 

 

 

'Study > PHP&MySQL' 카테고리의 다른 글

다운로드 게시판  (0) 2022.02.24
이미지 첨부 게시판  (0) 2022.02.22
회원정보수정  (0) 2022.02.18
아이디 비밀번호 찾기 AJAX  (0) 2022.02.18
로그인 및 로그아웃  (0) 2022.02.17