5. PHP 게시판 만들기, write 제작 2

2015. 4. 2. 23:51
저자 : Kurien

주의: 본 게시판은 보안을 생각하지 않고 만들어졌으므로 실제로 사용되어서는 안되는 코드입니다.

공부할 때 게시판이 이처럼 동작한다는 정도로만 이해해주세요.


지금까지 write 입력 폼을 만들었으니, 이제부터는 write에 입력한 값을 업데이트 하는 부분을 만들어 보겠습니다.

파일명은 write_update.php라는 이름으로 만들었습니다.


파일명을 만들때는 파일이 어떤 기능을 하는지를 쉽게 알 수 있는 방법이 좋다고 하기도 하고,

직접 경험해본 결과도 직관적인 이름이 편집하기 더 편했네요.


그럼 먼저 아래의 파일을 다운로드 받아봅시다.


20150402_project.zip


이번에도 다른 부분에 수정사항이 있는데요,

dbconfig.php의 맨 윗부분에 header('Content-Type: text/html; charset=utf-8');이라는 코드를 추가했습니다.


이 부분은 PHP에서의 인코딩을 설정해주는데,

html을 사용한다면 head 태그 내부에 <meta charset='utf-8'>이란 태그를 넣어줌으로써 인코딩을 utf-8로 설정할 수 있지만,

만약 html을 사용하지 않는 이번 페이지(write_update.php) 같은 경우는 인코딩을 설정할 수가 없기 때문에 php에서 설정을 해줍니다.


dbconfig.php에 넣어주는 이유는 모든 페이지에 공통으로 들어가는(include) 부분이기 때문이죠.

만약 일반적인 홈페이지라면 common.php와 같은 모든 페이지에 공통으로 들어가기 위해 만드는 파일에 header와 같은 함수를 설정해줍니다.


서론은 여기까지 하고 write_update.php를 보도록 하죠.


<?php

require_once("../dbconfig.php");


$bID = $_POST['bID'];

$bPassword = $_POST['bPassword'];

$bTitle = $_POST['bTitle'];

$bContent = $_POST['bContent'];

$date = date('Y-m-d H:i:s');



$sql = 'insert into board_free (b_no, b_title, b_content, b_date, b_hit, b_id, b_password) values(null, "' . $bTitle . '", "' . $bContent . '", "' . $date . '", 0, "' . $bID . '", password("' . $bPassword . '"))';


$result = $db->query($sql);

if($result) { // query가 정상실행 되었다면,

$msg = "정상적으로 글이 등록되었습니다.";

$bNo = $db->insert_id;

$replaceURL = './view.php?bno=' . $bNo;

} else {

$msg = "글을 등록하지 못했습니다.";

?>

<script>

alert("<?php echo $msg?>");

history.back();

</script>

<?php

}


?>

<script>

alert("<?php echo $msg?>");

location.replace("<?php echo $replaceURL?>");

</script>


전에 만들어놓은 write.php에서 입력 되는 부분은 bID, bPassword, bTitle, bContent 총 네 가지였습니다.

먼저 write_update.php에서도 db를 사용하므로 dbconfig.php를 include 해주시구요,


write.php에서 넘어온 값을 변수에 넣어주는 부분이 있습니다.


write.php의 form 태그에서 method=""속성의 값을 get으로 했다면 $_GET['변수'],

post라고 했다면 $_POST['변수']를 통해서 변수를 얻을 수 있는데요,

만약 $_REQUEST['변수']를 하게되면 get이든, post든 상관없이 모든 값을 받아올 수 있습니다.


그렇다면 $_REQUEST['변수']를 쓰면 편한게 아니냐고 생각하시는 분들이 계실텐데요,

프로그래밍에서는 여러가지의 길이 존재하면 좋은게 아닙니다.

물론 필요할 때 맞춰 쓰는 건 괜찮지만, 될 수 있으면 제작하는 사람이 귀찮은 편이 보안상에는 좋죠.

php의 설정중에는 $_POST['변수']와 같은걸 따로 설정할 필요 없이 $변수로 바로 변경 되게하는 설정이 있는데요,


이렇게 되면 보안적으로는 완전히 떨어지게 되므로 쓰지 않으시는 편이 좋습니다.

물론 현재는 보안적으로는 전혀 신경쓰지 않은 게시판을 만들고 있지만 보안 부분도 다뤄볼 생각입니다.


다시 본론으로 돌아와서 $bID, $bPassword, $bTitle, $bContent라는 변수를 선언했으니 다음 부분을 보겠습니다.

$date라는 변수를 선언 했는데, 여기에는 date('Y-m-d H:i:s')라는 값이 저장됩니다.

이 값은 현재 시간을 나타내주는 함수니까, $date에는 글을 등록한 시간이 저장됩니다.


이제 $sql 변수에 sql문을 작성합니다.

write_update는 글 쓰기를 의미하니 db에는 insert문을 사용해야겠죠?

insert문은 insert into 테이블명 (column 명) values(값);이나, insert into 테이블명 values(값);과 같이 사용되는데요.

저는 더 길게 표현하는 전자를 사용했습니다.


만약 column명을 함께 표현하게 되면 나중에 수정하게 될 때 어떤 부분에 어떤 값이 들어가는지 쉽게 알 수 있거든요.

sql 구문을 만드는 방식은 개인 취향이므로 알아서 하시면 될 것 같네요.


db에서 테이블을 만들 때 primary auto_increment 값을 줬던 column은 값을 입력할 때 null만을 입력해도 자동으로 입력됩니다.

숫자(int) 형식은 0, 10, 23 이런식으로 주변에 감싸는 부분이 없어야 하구요.

문자(char, varchar, date 등) 형식은 ""(큰따옴표)나 ''(작은따옴표)가 있어야합니다.


그리고 또 다른 형식인 password('비밀번호')가 있습니다.

password는 mysql의 자체 함수로 입력받은 문자열을 해시화 해주는데요.


해시라는 것은 원래 불필요한 정보를 모은다는 뜻이 있지만, 암호화에서는 다시 풀어낼 수 없는 암호를 만든다고 생각하시면 됩니다.

만약 kurien이라는 암호를 입력했을 경우에 password() 함수는 *19BA5733867E9DB038840C6FE88CF1007D61E97B라는 해시를 출력합니다.


저 정보를 가지고 다시 풀어낼 방법은 없습니다.

그럼 절대 안뚫리는게 아닌가?라는 생각을 하신 분들에게 말씀 드리자면 저 암호를 다시 kurien이라는 단어로 바꿀 수 있는 방법 자체는 없지만,

password()라는 함수를 누구나 쓸 수 있는 만큼 그 기능을 가지고 각 값을 해시화 해서 데이터베이스에 저장해두고 확인 하는 방법이 존재합니다.

자세한 부분은 나중에 다루도록 하고, 일단은 password() 함수만을 사용해서 하도록 하겠습니다.


이제 insert문을 완성 했으니, $db->query를 통해서 쿼리를 보냅니다.

만약 정상적으로 쿼리가 전달 되었다면 $result에 TRUE가 들어가고, 실패하면 FALSE 값이 들어갑니다.


if문을 이용해서 $result가 정상적으로 동작했다면 $msg에 정상적으로 등록되었다고 적고, $db->insert_id;를 $bNo 변수에 넣어줍니다.

$db->insert_id;는 이번에 insert 된 자료의 auto_increment 값을 다시 반환해주게 되는데,

이 값을 가지고 게시글이 나오는 화면으로 이동 시켜야 하기 때문이죠.


$bNo을 얻었다면, $replaceURL 변수에 './view.php?bno=' . $bNo; 값을 저장합니다.

이 부분은 $bNo(기본 키)를 가지고 게시글을 보여주는 페이지로 이동하기 위한 URL을 저장하는 부분이구요.

view.php는 다음 포스팅에서 다룰 부분입니다.


그 다음 if문을 빠져 나오게 되고 최하단에 있는 <script>alert($msg); location.replace($replaceURL);</script>이 실행됩니다.

성공했다는 메시지와 게시글을 보여줄 페이지로 이동하는 스크립트죠.



만약 위에서 $result에 FALSE가 입력 되었다면 DB 전송이 실패했다는 말이므로 등록에 실패했다는 메시지를 $msg에 저장합니다.

그 다음 <script>alert($msg); history.back();</script>을 통해 $msg를 출력하고, 이전 화면으로 돌아가줍니다.


여기까지 write_update.php 부분이였습니다.

사이사이 주제가 딴대로 새버려서 글이 조금 길어졌지만, 배우면서 필요한 부분이라고 생각되어서 적었던 부분입니다.

어려운 부분이 있다면 질문 부탁드리구요!

잘못된 부분은 거리낌 없이 지적 부탁드립니다!