php에서 기본적인 게시판을 mysql과 연동해서 만들어 보도록 하겠다. 글쓰기, 글저장, 글리스트보기, 글수정, 글 삭제의 기능을 가진 게시판을 구현하도록 하겠다.
앞쪽에서 방명록을 만들었다면 큰 어려움없이 게시판도 구현할 수 있으리라 본다.
1. 테이블 만들기
mysql 서버에 접속을 해서 사용자DB가 작성되어 있으므로 CREATE TABLE문을 이용해서 테이블을 만든다.
board 테이블 만들기
CREATE TABLE board(
board_idx int NOT NULL auto_increment,
name varchar(20),
email varchar(35),
home varchar(40),
title varchar(100),
pwd varchar(20),
num int,
writeday int,
readnum int,
content text,
ip varchar(20),
PRIMARY KEY (board_idx)
);
board_idx는 primary key, NOT NULL, auto_increment로 정의 되었다. 이름,이메일,홈페이지,글제목,비밀번호,글번호,글쓴날,조회수,글내용,글쓴사람IP에 각각 해당하게 되며, 대부분이 varchar의 데이터형이고 content는 text, writeday는 time()값을 넣기 위해서정수형으로 정의하였다.
2. 글쓰기폼(write.php)
게시판에서 글쓰기 폼은 클라이언트로부터 값을 받아서 서버로 전달하는 역할을 한다. 전달변수의 값들은 다음페이지(write_ok.php)의 변수로 받게 된다. name은 다음페이지에서 $name의 형태로 받는다는 것이다. 글쓰기 폼은 지금까지 많이 했던 내용이므로 이것으로 생략하겠다.
<html>
2 <body>
3 <center>
4 <form action="write_ok.php" method="post">
5 <h3>글 올리기</h3>
6 <table border=1 cellspacing=0>
7 <tr>
8 <td>글쓴이</td>
9 <td> <input type="text" name="name" size="15"></td></tr>
10 <tr>
11 <td>E-mail</td>
12 <td><input type="text" name="email" size="30"></td></tr>
13 <tr>
14 <td>홈페이지</td>
15 <td><input type="text" name="home" size="30" value="http://"></td></tr>
16 <tr>
17 <td> 글제목</td>
18 <td><input type="text" name="title" size="50" ></td></tr>
19 <tr>
20 <td>글</td>
21 <td><textarea rows="10" name="content" cols="55"></textarea></td></tr>
22 <tr>
23 <td>비밀번호</td>
24 <td><input type="password" name="pwd" size="8"></td></tr>
25 </table>
26 <input type="submit" value="글작성" >
27 <input type="reset" value="취소" >
28 </form>
29 </center>
30 </body>
31 </html>
3. 글저장 (write_ok.php)
DB에 저장을 하기 위해서 "입력체크->DB연결/선택-> num값 설정 ->DB에 저장"의 순서로 작업을 하면 되겠다.
<?
2 if(!$title || !$content || !$name ) //제목, 글내용, 이름 입력체크
3 { echo(" <script>
4 window.alert('이름, 제목, 내용을 입력해 주세요 !')
5 history.go(-1)
6 </script>
7 "); exit;
8 }
9
10 if(!$pwd) //비밀번호 입력체크
11 { echo(" <script>
12 window.alert('\\n이글을 고치거나 지우기 위해서는 \\n반드시 암호가 필요합니다 ')
13 history.go(-1)
14 </script>
15 "); exit;
16 }
17
18 include("../dbconn.php"); //DB연결파일 인클루드
19
20 $sql="select max(num) from board" ;
21 $result=mysql_query($sql,$connect ); //쿼리전송
22
23 $row=mysql_fetch_array($result); //레코드를 배열로 저장
24
25 //글번호 증가
26 if($row[0]) {
27 $number=$row[0]+1;
28 }
29 else{
30 $number=1;
31 }
32
33 /=============저장 ==============================
34 $writeday = time();
35 $sql = "insert into board (name, email, home, title, content, pwd, num, writeday, readnum, ip) values('$name','$email','$home','$title','$content', '$pwd',$number,$writeday,0,'$REMOTE_ADDR')";
36 $result=mysql_query($sql, $connect);
37
38 if($result)
39 {
40 Header("Location:list.php"); // list.php 로 이동
41 }
42 else
43 {
44 echo("<script language=javascript>
45 window.alert('저장중 오류');
46 history.go(-1);
47 </script>");
48 exit;
49 }
50 ?>
2~16번 행은 이전페이지에서 입력한 값이 있는지를 체크하여 없으면 다시 이전페이지로 넘기는 일을 하는 부분이다. PHP에서 거짓(false)는 0 또는 빈문자열("")이기 때문에 여기서 만약에 빈문자열이면 if문에 걸리게 되므로 자바스크립트로 이전페이지로 넘기게 된다. 그런데 echo "~~";로 묶었기 때문에 자바스크립트에서는 작은따옴표를 이용했으며, alert()에서 여러 줄로 보여주기 하기 위해서는 PHP에서는 \를 표현하기 위해 \를 하나더 붙이므로 \\n의 형태로 줄바꿈을 하게 된다.
18번 행은 mysql_connect()함수와 mysql_select_db()로 구성된 파일이다.
25~31번 행은 기존의 글번호(num)값중에 최대값을 추출하는 부분으로 mysql_query()함수로 쿼리를 전송한 후 $result(결과식별자)를 얻을 수 있다. 글이 하나도 없다면 글번호는 1이 되고 글이 있다면 최대값에 +1로 글번호를 설정할 수 있다.
34번행은 현재시간의 timestamp값을 $writeday라는 변수에 넣어서 DB에 저장을 하게 된다.
35~41번 행은 테이블에 각각의 값을 저장하게 되는데 사용자가 입력한 값(name, email, home, title, content, pwd)외에 값들은num과 writeday는 앞쪽에서 설정을 해 주었고 readnum은 0으로 글쓴 사람의 IP는 $REMOTE_ADDR이라는 환경변수를 사용해서 저장을 하게 된다.
38~50번 행은 쿼리 전송이 성공(trur)을 하면 Header()함수를 이용해서 list.php로 이동하게 되고 실패(false)를 하면 저장 중 오류라는 에러 메시지를 나타나게 한다.
4.글목록보기(list.php)
게시판의 메인페이지라 할 수 있을 것이다. DB에 저장된 레코드들을 최근 글부터 가져온 레코드셋(Record Set)을 하나씩 반복적으로 레코드의 포인터를 이동해서 찍는 방법을 배울 수 있을 것이다. 또한 글쓰기나 글내용보기로 링크를 해 두어야 될 것이다. 반복은 레코드의 갯수만큼 하면 된다.
<?
2 include("../dbconn.php"); //DB연결파일 인클루드
3
4 $sql = "SELECT * FROM board ORDER BY num desc";
5 $result = mysql_query($sql, $connect);
6 $total = mysql_affected_rows();
7
8 ///////////////헤드 출력 ///////////////////////////////////
9 echo "<center>
10 <h3>게시판</h3>
11 <table cellspacing=0 width=600>
12 <tr>
13 <td><a href=write.html>글올리기</a></td>
14 <td align=right>게시물수:$total</td>
15 </tr>
16 </table>
17 <table border=1 cellspacing=0 width=600>
18 <tr>
19 <td align=center width=10%>번호</td>
20 <td align=center width=20%>글쓴이</td>
21 <td align=center width=20%>날짜</td>
22 <td align=center width=40%>제목</td>
23 <td align=center width=10%>조회수</td>
24 </tr> ";
25
26 ///////////////리스트출력////////////////////////////////////
27 for($i=0 ; $i < $total; $i++){
28 mysql_data_seek($result, $i); //포인터 이동
29 $row=mysql_fetch_array($result); //레코드를 배열로 저장
30 $writeday = date("Y-m-d",$row[writeday]);
31
32 echo "<tr>
33 <td align=center width=10%>$row[num]</td>
34 <td width=20%><a href=mailto:$row[email]>$row[name]</a></td>
35 <td align=center width=20%>$writeday</td>
36 <td width=40%><a href=content.php?idx=$row[board_idx]>$row[title]</a></td>
37 <td align=center width=10%>$row[readnum]</td>
38 </tr> ";
39 }
40 echo "</table><p>";
41 ?>
DB연결과 선택을 수행한 후에 select문을 사용해서 num 필드가 큰 값(최근글)부터 내림차순으로 레코드셋을 가져오게 된다. 만약 쿼리전송이 성공을 하면 결과식별자($result)에 true값이 반환된다. mysql_affected_rows() 함수는 쿼리에 영향을 받은 레코드의 수를 반환하게 된다. 즉 select해온 레코드의 수를 의미하는 것이다.
for문을 이용해서 가져온 레코드의 수만큼 반복을 하는데, 이때 mysql_data_seek() 함수는 레코드셋의 포인터를 찾아주는 역활을 한다. 결과식별자을 참조해서 레코드셋을 찾게 된다. 레코드셋형태로 가져오면(select) 포인터는 가장먼저 가져온 레코드를 가리키게 된다.
mysql_fetch_array()함수는 포인터가 가리키는 한 레코드를 배열로 저장을 하는 역활을 하는데, 가져온 순서대로 값을 표현하는 방법($row[0], $row[1],$row[2]...)과 필드값을 연관배열의 키값으로 사용해서 표현하는 방법($row[name], $row[email], $row[content]...)이 있다.
즉, mysql_data_seek()함수로 포인터를 하나씩 증가하고 mysql_fetch_array()함수로 레코드를 배열에 저장한 후 화면에 출력하게 된다.
date()함수를 이용해서 timestamp의 값을 '2001-01-01' 형태로 바꾸어서 $writeday변수에 저장을 한 것이다.
36번행은 각 게시물(레코드)의 고유값(idx)을 content.php로 넘겨서 특정한 한 레코드만 불러 올수 있도록 해 주는 역활을 한다.
5.글내용보기(content.php)
List에서 보내준 idx값을 가지고 해당 레코드를 불러와서 화면에 적절하게 출력을 해 주는 부분이다. 수정이나 삭제를 할 수 있도록 링크를 시켜 주면 되겠다.
<?
2 include("../dbconn.php"); //DB연결파일 인클루드
3
4 $UpdateSQL = "Update board Set readnum = readnum+1 where board_idx=$idx";
5 $UpdateResult = mysql_query($UpdateSQL, $connect);
6
7 $sql = "SELECT * FROM board where board_idx=$idx";
8 $result = mysql_query($sql, $connect); //쿼리전송
9
10 $row=mysql_fetch_array($result); //레코드셋을 배열로 저장
11 $writeday = date("Y-m-d H:i:s", $row[writeday]);
12 $content = nl2br($row[content]); //줄바꿈 문자를 <br>태그로 변환
13
14 echo "
15 <html>
16 <head>
17 <title>webboard</title>
18 </head>
19 <body>
20 <center>
21 <h3>글 내용 보기</h3>
22 <TABLE border=1 cellspacing=0 width=600>
23 <TR>
24 <TD width=100>글쓴이</TD>
25 <TD width=200>$row[name]</TD>
26 <TD width=100>날짜</TD>
27 <TD width=200>$writeday</TD>
28 </TR>
29 <TR>
30 <TD>E-mail</TD>
31 <TD><A HREF=mailto:$row[email]>$row[email]</A></TD>
32 <TD>HomePage</TD>
33 <TD><A HREF=$row[home]>$row[home]</A></TD>
34 </TR>
35 </TABLE>
36
37 <TABLE border=0 width=600>
38 <TR><TD align=right>조회수:$row[readnum]</TD></TR>
39 </TABLE >
40
41 <TABLE border=1 cellspacing=0 cellpadding=5 width=600>
42 <TR>
43 <TD align=center>$row[title]</TD>
44 </TR>
45 <TR>
46 <TD >$content<p align=right>from $row[ip]</p></TD>
47 </TR>
48 </TABLE ><p>";
49
50
51 //수정, 삭제, 리스트로 링크
52 echo " <a href=list.php>List</a> |
53 <a href=edit.php?idx=$idx>Edit</a> |
54 <a href=del.php?idx=$idx>Del</a>
55 </center>
56 </body>
57 </html> ";
58 ?>
4~5행은 조회수를 1만큼 증가시켜주는 부분이다. 7~10행은 넘겨준 idx에 해당하는 레코드을 불러 와서 mysqld_fetch_array()를 이용하여 $row라는 배열에 넣는 역할을 한다.
12행은 nl2br() 함수를 이용하여 개행문자(\n)를 <br> 태그로 바꾸어 주는 역활을 한다. 11행은 date()함수를 이용하여 timestamp값을 2001-01-01 13:10:00 의 형태로 바꾸어 준다.
51~55행은 수정이나 삭제 처리를 할 수 있도록 idx값을 넘겨주게 된다.
6.글수정폼(edit.php)
content에서 보내준 idx값을 가지고 해당 레코드를 불러와서 글쓰기 폼에 적절하게 출력한다. 글수정을 처리하는 페이지(edit_ok.php)로 idx값을 넘겨 주는 걸 명심해야 한다
1 <?
2 include("../dbconn.php"); //DB연결파일 인클루드
3
4 $sql = "SELECT * FROM board where board_idx=$idx";
5 $result = mysql_query($sql, $connect);
6
7 $row=mysql_fetch_array($result);
8
9 echo "<html><body><center>
10 <form action='edit_ok.php' method='post'>
11 <h3>글 수정</h3>
12 <table border=1>
13 <tr>
14 <td>글쓴이</td>
15 <td> <input type='text' name='name' size='15' value='$row[name]'></td></tr>
16 <tr>
17 <td>E-mail</td>
18 <td><input type='text' name='email' size='30' value='$row[email]'></td></tr>
19 <tr>
20 <td>홈페이지</td>
21 <td><input type='text' name='home' size='30' value='$row[home]'></td></tr>
22 <tr>
23 <td> 글제목</td>
24 <td><input type='text' name='title' size='50' value='$row[title]'></td></tr>
25 <tr>
26 <td>글</td>
27 <td><textarea rows='10' cols='55' name='content'>$row[content]</textarea></td></tr>
28 <tr>
29 <td>비밀번호</td>
30 <td><input type='password' name='pwd' size='8'></td></tr>
31 </table>
32 <input type='hidden' name='idx' value='$idx'>
33 <input type='submit' value='글수정' >
34 <input type='reset' value='취소' >
35 </form>
36 </center>
37 </body>
38 </html>"
39 ?>
4~7행에서 넘겨준 idx값에 해당하는 레코드를 가져와서 $row변수에 넣는다.
10~35행에서 value속성에 해당 값들을 넣어준다. 이때 주의해야 할 점은 value='$row[title]' 형태로 해야 한다는 것이다. value속성을 따옴표로 묶지 않으면 빈칸이 있게 되면 끝으로 인식을 하기 때문이다.
30행은 비밀번호를 입력받는 부분이다.
32행에서 type=hidden으로 눈에 보이지 않게 받은 idx값을 넘겨 준다(Post방식). Form에 action 부분을 edit_ok.php?idx=$idx로 수정해도 된다(Get방식).
7.글수정처리(edit_ok.php)
사용자가 입력한 패스워드와 DB의 패스워드 값을 비교 하여 일치하면 수정을 하고 그렇지 않으면 경고창을 띄우게 된다.
1 <?
2 include("../dbconn.php"); //DB연결파일 인클루드
3
4 $sql = "select pwd from board where board_idx=$idx";
5 $result = mysql_query($sql, $connect);
6
7 $row=mysql_fetch_array($result);
8
9 if ($row[0] == $pwd) {
10 $sql2 = "Update board set name = '$name',
11 title = '$title',
12 email = '$email',
13 content = '$content',
14 home = '$home'
15 where board_idx = $idx ";
16
17 $result2=mysql_query($sql2, $connect);
18 echo("<meta http-equiv='Refresh' content='0; URL=./list.php'>");
19 exit;
20 }
21 else {
22 echo "<script>
23 alert('비밀번호가 일치하지 않습니다');
24 history.back();
25 </script>";
26 }
27 ?>
4~7행은 edit.php에서 넘어온 $idx값과 같은 레코드의 패스워드(pwd)를 가져와서 $row 배열에 넣는 부분이다. $row[0]이라고 한 건첫번째 필드라는 말이 된다. mysql_result()함수를 사용하여 $row_pwd = mysql_result($result, 0 , 0)로 표현을 할 수도 있다.
9행은 사용자 입력 비밀번호($pwd)와 DB의 비밀번호($row[0])을 비교하게 된다.
10~17행은 DB의 board_idx필드와 edit.php에서 넘어온 $idx값과 같은 레코드를 사용자가 수정한 값들($name, $title, $email, $home)로 update하는 구문이 된다.
18행은 페이지를 meta태그의 refresh를 이용하여 list.php로 이동하게 된다.
21~26행은 비밀번호가 일치하지 않을 경우 자바스크립트를 이용해서 경고창을 띄우고 이전페이지로 되돌려 보내게 된다.
8.글삭제폼(del.php)
글을 삭제하기 위해서는 패스워드를 입력하여 맞으면 삭제를 하고 그렇지 않으면 패스워드 재입력을 요구하게 된다.
1 <html><head><title>삭제</title></head>
2 <body>
3 <center><h3>삭제</h3>
4 <form method='POST' action='del_ok.php'>
5 <input type=hidden name=idx value='<?=$idx?>'>
6 <table border=1 cellspacing=0>
7 <tr><td>비밀번호를 입력하세요!!</td></tr>
8 <tr><td>비밀번호 : <input type='password' name='pwd'></td></tr>
9 </table>
10 <center><input type='submit' value=' 삭 제 '> |<a href='list.php'>list</a>
11 </form>
12 </center>
13 </body>
14 </html>
list에서 넘겨준 $idx값과 패스워드를 del_ok.php로 넘겨주게 된다.
1 <?
2 include("../dbconn.php"); //DB연결파일 인클루드
3
4 $sql = "select pwd from board where board_idx = $idx";
5
6 $result=mysql_query($sql,$connect);
7 $row=mysql_fetch_array($result);
8
9 if ($row[0]==$pwd){
10 $sql = "Delete from board
11 where board_idx = $idx";
12 $result=mysql_query($sql,$connect);
13
14 echo("<meta http-equiv='Refresh' content='0; URL=./list.php'>");
15 exit;
16 }
17 else{
18 echo "
19 <script language='javascript'>
20 alert('비밀번호가 일치하지 않습니다');
21 history.back();
22 </script> ";
23 }
24 ?>
del.php에서 넘겨준 $idx와 $pwd을 이용하여 삭제를 하는 부분이다. 아마도 수정처리 부분과 거의 같은 형태이다.
'DB > MySQL' 카테고리의 다른 글
Mysql 백업하기 (0) | 2012.03.06 |
---|---|
Mysql 접속하기 (0) | 2012.03.06 |
WHERE 절 (0) | 2012.03.05 |
FROM 절 (0) | 2012.03.05 |
7장 SELECT 명령문의 절 (0) | 2012.03.05 |
댓글