강좌
클라우드/리눅스에 관한 강좌입니다.
프로그램 분류

쉬. 기능붙이기 -3 글 내용 읽기

작성자 정보

  • 웹관리자 작성
  • 작성일

컨텐츠 정보

본문

[강좌] php+mysql 게시판 만들기 #쉬-3

안녕하세요. 디망쉬입니다.

자~ 자~ 이번엔 입력한 글을 읽어볼까요?

앗. 2000년 7월 4일자로 '쉬'편이 모두 다시 올라왔습니다. 그 이전에 갈무리 하신 분은 새로 갈무리하세요.



------------------------------------------------------------------------------------------------
'쉬'편은 모든 편이 서로 약간씩 관련이 되어 있으므로 모두를 한꺼번에 받으셔서 이 편 저 편 이동하시며 같이
읽는것이 좋습니다.^^;

이유가 각 부분마다 사용하는 변수가 많기 때문에 하나 하나 보시면 이 변수가 뭐에 쓰이는건지 헷갈릴 수
있거든요. 그래서 '쉬-짠1'편에서는 각 부분마다 사용되는 변수를 설명해놓고 있지만, 역시나 더 좋은 방법은 다른 편들을 이동하시며 보는 것입니다. :) '쉬'편의 짠들은 다음과 같으니 별도로 준비하셔서 참조하세요. ^^;


쉬-짠1 : 게시판 만들면서 사용되는 변수 정리 문서
쉬-짠2 : 게시판 만드는데 필요한 약간의 html tag
쉬-짠3 : 게시판 만들면서 만든 사용자 정의 함수
쉬-짠4 : 게시판 만드는데 사용된 php 함수 정리
쉬-짠5 : 게시판 만들면서 필요한 SQL 명령어 정리
------------------------------------------------------------------------------------------------

쉬. 기능 붙이기

a. 글 내용 보기

매우 쉬운 부분이군요. 에헤헤. 다만 주의할 점만 잘 쓰면 될 듯. ^^;

글을 읽을 때 게시판은 어떠한 정보를 알아야만 사용자가 읽기를 희망하는 글을 찾아내서 출력할
수 있을까요? 단지 두 가지입니다.
바로 해당 게시판의 이름과 절대 글 번호, 즉 테이블 이름과 no attribute 입니다.

해당 글을 찾으려면 해당 글이 들어가있는 테이블을 알아야하고 그 글을 찾으려면 같은 숫자란 존재하지
않고 해당 숫자는 유일하게 존재하는 절대 글 번호인 no attribute 가 필요하죠.

그래서 list.php3 에서 글 제목을 <a> tag 로 링크를 걸 때 board=$board&no=$no 식이던가로 했습니다.

자 그럼 SQL 쿼리로는 어떻게 되나 볼까요?
testboard 에서 13번 글을 읽으려 합니다.
그렇다면

SELECT * FROM testboard WHERE no=13

이라고 하면 끝납니다. ^^; 매우 간단하군요.
게시물 읽기 파일은 view.php3 소스를 미리 한 번 볼까요?

<?
/*--------------------------
filename : view.php3
--------------------------*/
$connect = mysql_connect("localhost","아이디","비번");
mysql_select_db("사용DB?quot;,$connect);

$result = mysql_query("SELECT * FROM $board
WHERE no=$no", $connect);

$view = mysql_fetch_array($result);

echo "
작성자명 : $view[usrname]<br>
E-mail : $view[usremail]<br>
글 번호 : $view[num]<br>
글 제목 : $view[usrtitle]<br>
조회수 : $view[hit]<br>
본문 : <p>
$view[contents]
";
?>

에게? 벌써 끝? 네 맞습니다. 사실상 구현과 관련된 것은 이게 끝이지요. 하지만 이걸로 끝낼 순 없죠.
일단 글을 읽을 때마다 조회수가 증가해야합니다.

조회수를 증가한다는 것은 곧 현재의 조회수 숫자에 1을 더한 값으로 값을 '고친다'는 의미입니다.
SQL 명령어로 고치는게 뭘까요?
그건 바로 UPDATE 문입니다. 글 읽을 때마다 조회수를 1씩 증가해서 조회수 기능을 넣어볼까요?

UPDATE $board SET hit = hit + 1 WHERE no=$no

바로 이겁니다. 이걸로 끝나버리죠. ^^;
소스에도 적용시켜보겠습니다.


<?
/*--------------------------
filename : view.php3
--------------------------*/
$connect = mysql_connect("localhost","아이디","비번");
mysql_select_db("사용DB명",$connect);

$updok = mysql_query("UPDATE $board SET
hit = hit + 1 WHERE no=$no", $connect);

$result = mysql_query("SELECT * FROM $board
WHERE no=$no", $connect);

$view = mysql_fetch_array($result);

echo "
작성자명 : $view[usrname]<br>
E-mail : $view[usremail]<br>
글 번호 : $view[num]<br>
글 제목 : $view[usrtitle]<br>
조회수 : $view[hit]<br>
본문 : <p>
$view[contents]
";
?>


이걸로 게시물 읽기는 끝!


이제 중요한 걸 다뤄보겠습니다. 게시판, 특히 php 를 지원하는 웹 서버는 조심해줘야할 사항이
있습니다. 바로 본문이나 게시물 제목등 문자열이 들어가는데에 php 코드가 들어가는 것이지요.

누군가 악의를 품고 서버의 중요한 내용을 빼내기 위해 게시물 본문에 php 코드를 심어놓고 게시물
읽을 때 자동으로 데이터가 넘어오도록 할 수도 있습니다.

예를 들어 게시물 본문에

<?
require "db.php3";
echo "$passwd";
?>

이런 코드를 심어놨다고 하죠. 그리고 db.php3 에는 db 관련 비밀 번호가 있고 이 비밀 번호가 저장된
변수가 $passwd 일 경우 게시물 읽는 것만으로 비밀 번호를 유출해서 알아올 수 있죠.

어때요. 위험하죠?

물론 php 에는 html tag 자체를 막아버리는 기능이 있습니다.
< 로 시작하는 문자는 몽조리 없애버리죠.
하지만 html tag 를 지원하지 않으면 게시판이 너무 경직된 느낌이 들겠죠? 빈대 잡자고 에프킬라를 공기삼아
살 수도 없구.

기존의 여러 게시판들이 이러한 점으로 골머리를 앓곤 합니다. 제가 참여하고 있는 jsboard 나
이곳 저곳에서 쓰이는 zero board 등등 php 로 작성된 게시판들이 골머리를 앓고 있죠. 몇 몇
대안이 있지만 만족스러운 건 아니구요.

하지만 php 는 정말 멋지게도 대안 함수를 제공해줍니다. 그것은 바로 htmlspecialchars() !!
이 함수는 해당 변수내의 문자열 중 모든 < 나 > 를 &lt; 나 &gt; 로 바꿔줍니다. < 을 출력하는 코드가
바로 &lt; 거든요. 즉 html 소스에서

&lt;font size="2"&gt;

라고 해주면 화면에는

<font size="2">

라고 직접 출력됩니다. 이게 가장 무난한 방법입니다.

에. 참고로 말씀드리면 strip_tags() 라는 함수도 있는데 이건 앞서 말씀드린 것처럼 tag 를 모두
없애버리는 함수입니다.

자. 그럼 htmlspecialchars() 함수를 적용한 게시물 읽기로 해볼까요?

<?
/*--------------------------
filename : view.php3
--------------------------*/
$connect = mysql_connect("localhost","아이디","비번");
mysql_select_db("사용DB명",$connect);

$updok = mysql_query("UPDATE $board SET
hit = hit + 1 WHERE no=$no", $connect);

$result = mysql_query("SELECT * FROM $board
WHERE no=$no", $connect);

$view = mysql_fetch_array($result);

$view[usrname] = htmlspecialchars($view[usrname]);
$view[usremail] = htmlspecialchars($view[usremail]);
$view[usrtitle] = htmlspecialchars($view[usrtitle]);
$view[contents] = htmlspecialchars($view[contents]);

echo "
작성자명 : $view[usrname]<br>
E-mail : $view[usremail]<br>
글 번호 : $view[num]<br>
글 제목 : $view[usrtitle]<br>
조회수 : $view[hit]<br>
본문 : <p>
$view[contents]
";
?>

이걸로 게시물 읽기는 끝! ^^; 뭐 해당 글 읽는 도중 글을 수정하거나 삭제할 수 있게 글 수정과
글 삭제를 넣죠 뭐. 이렇게.

<?
/*--------------------------
filename : view.php3
--------------------------*/
$connect = mysql_connect("localhost","아이디","비번");
mysql_select_db("사용DB명",$connect);

$updok = mysql_query("UPDATE $board SET
hit = hit + 1 WHERE no=$no", $connect);

$result = mysql_query("SELECT * FROM $board
WHERE no=$no", $connect);

$view = mysql_fetch_array($result);

$view[usrname] = htmlspecialchars($view[usrname]);
$view[usremail] = htmlspecialchars($view[usremail]);
$view[usrtitle] = htmlspecialchars($view[usrtitle]);
$view[contents] = htmlspecialchars($view[contents]);

echo "
작성자명 : $view[usrname]<br>
E-mail : $view[usremail]<br>
글 번호 : $view[num]<br>
글 제목 : $view[usrtitle]<br>
조회수 : $view[hit]<br>
본문 : <p>
$view[contents]

<hr width="90%">
| <a href="edit.php3?board=$board&no=$no">글 수정</a> |
<a href="delete.php3?board=$board&no=$no">글 삭제</a>
";
?>

 

이번 회는 여기서 끄읕! ^^;


날씨가 여름처럼 덥군요. 감기 조심하세요~! :)
(에. 무슨 말이지)


다음 강좌에서 뵈요.

----------------------------
함께하면 즐거운 사이트들 (-_-; 광고임 -_-;)
http://game.creple.com/delthia
http://creple.com
http://coco.st
----------------------------


관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,056 명
  • 현재 강좌수 :  35,910 개
  • 현재 접속자 :  198 명