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 부분이였습니다.

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

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

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

TAG ,
  1. 이전 댓글 더보기
  2. 컴공 2016.11.11 17:41  댓글주소  수정/삭제  댓글쓰기

    아니 이렇게 좋고 쉬운글 보고 어렵다느니 외계어라느니..!! 말도안됩니다.

    Kurien 님 정말 감사합니다.

    책 출판하셔도 이것보다 더 쉽게 설명하는 책은 없을 듯 합니다. 진짜 짱..

  3. 감사해요 2017.02.03 15:16  댓글주소  수정/삭제  댓글쓰기

    정말이해가 잘되요.... 짱짱!!!

  4. Hust 2017.02.24 15:26  댓글주소  수정/삭제  댓글쓰기

    처음 공부중이라 필요한부분을 최소한으로 할려고 글 6번까지만 제가 코딩을 했는데요 우선 write.php는 화면에 출력이 잘되고 write_update.php 여기로 넘어가는데 빈화면만뜨네요 그러고 view.php도 마찬가지로 빈화면이떠요 그러고 원래 update되고 view로바로넘어가는거아닌가요? 아직초보여서 힘드네요 답변부탁드립니다

  5. kakoku13 2017.03.17 15:54  댓글주소  수정/삭제  댓글쓰기

    PHP 게시판 만들기, write 제작 1까지 잘 되고 있다가 여기서 막혔답니다ㅠㅠ
    아이디, 비빌번호, 제목,내용을 쓰고 작성을 누르면
    글을 등록하지 못했습니다 라고 팝업창이 뜬답니다. 어디서 부터 잘못됬을까요?

    • Kurien 2017.03.23 09:30 신고  댓글주소  수정/삭제

      제가 올린 코드로는 정상적으로 올라갑니다.
      단순히 안된다고만 말씀하시면 저도 뭐라고 답변해드릴 수가 없어요.
      코드를 올려주신다던지, DB 구조를 살펴보셔야 할 듯 하네요.

  6. TyphoonHacker 2017.04.02 09:12  댓글주소  수정/삭제  댓글쓰기

    아무리 예제 소스라고 하지만 이걸 그대로 사용하시는 사람들이 있을거같은데
    소스가 너무 취약한거같습니다 조금이나마 보안에 관해 언급해주셨으면 하는 ...

    • Kurien 2017.04.03 15:31 신고  댓글주소  수정/삭제

      이 글을 작성할 때 보안에 대한 걱정이 없었어서 그 점을 간과했네요. 빠른 시일 내에 주의하라는 내용 추가하도록 하겠습니다.

  7. Sakura 2017.05.12 02:10  댓글주소  수정/삭제  댓글쓰기

    글 업데이트 소스

    <html>
    <head>
    <meta charset="utf-8">
    </head>
    </html>
    <?
    $connect=mysql_connect("localhost", "root", "apmsetup")or
    die("SQL서버에 연결할 수 없습니다!");
    mysql_select_db("php_db", $connect);

    $b_id = $_POST['b_id'];
    $b_pw = $_POST['b_pw'];
    $b_title = $_POST['b_title'];
    $b_content = $_POST['b_content'];

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


    $sql = 'insert into free_board (b_num, b_title, b_content, b_date, b_eye, b_id, b_pw)
    values(null, "' . $b_title . '", "' . $b_content . '", "' . $date . '", 0, "' . $b_id . '", "' . $b_pw . '"';

    $result = mysql_query($sql, $connect);
    if($result) { // query가 정상실행 되었다면,
    $$msg = "정상적으로 글이 등록되었습니다.";
    $b_num = $connect->insert_id;
    $replaceURL = './board_view.php?b_num=' . $b_num;
    // $replaceURL = './view.php?bno=' . $b_num;
    }else{
    $msg = "글을 등록하지 못했습니다.";
    ?>
    <script>
    alert("<? echo $msg ?>");
    history.back();
    </script>
    <?
    }

    ?>
    <script>
    alert("<?php echo $msg?>");
    location.replace("<? echo $replaceURL ?>");
    </script>



    글쓰기 소스에서도 input태그 name들 전부다 b_id, b_pw, b_title, b_content로 줬는데도 불구하고 자꾸 글이 안올라가져요 ㅠㅠ

  8. 한지민 2019.05.13 15:00  댓글주소  수정/삭제  댓글쓰기

    잘 보고있어요

  9. 또또 2019.10.18 20:16  댓글주소  수정/삭제  댓글쓰기

    실습따라하는 중입니다. 혹시 write_update에서 post값은 잘 넘어오는데, mysql로 안넘어가서 고생하는 분 있으시면, 비밀번호를 어렵게 설정해보면 될 수도 있습니다. 최신버전 mysql은 password()함수에도 패스워드생성규칙을 적용하는지 검사하는군요. 세부사항은 https://heartbleed.tistory.com/86링크의 4번항목 참고하세요. 정보남기는 김에 원작자님께 감사하는 말씀도 드리고 싶네요. 덕분에 많이 배우고 있습니다.

  10. 예진 2020.10.07 15:49  댓글주소  수정/삭제  댓글쓰기

    지금까지 좋은 설명 덕분에 잘 따라왔는데 실습따라하는 중 오류가 생겨 댓글 남깁니다. 모든 코드를 같게 했는데도 "글을 등록하지 못했습니다." 가 뜨면서 글 등록이 되지 않습니다. 데이터베이스로 직접 등록시에는 잘 올라가는데 글 수정이나 글쓰기가 안됩니다ㅠㅠ 어느부분이 문제일까요?

  11. 밤이슬 2021.12.19 13:07  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  12. 시우스 2021.12.30 05:40  댓글주소  수정/삭제  댓글쓰기

    느그셀로나♬♬♩♪ ♬♪~♩두 있는 맨유가 바르사 보다 100만배 매력있지 메시빠지고 뭐볼품있다고 ♬♪♪
    패배도 전설을 막을 수는 없다! 금요일 저녁 FC 아우크스부르크와의 경기에서 토마스 뮐러는 FC 바이에른에서 600번째 경기를 마쳤다. 그는 최근 몇 년 동안 다른 어떤 선수와도 비교할 수 없는 뮌헨을 형성했다. 뮐러는 12년 넘게 기록 챔피언의 상징과도 같은 존재다. 그리고 이제 그는 1군에 합류한 뒤 600경기라는 믿을 수 없는 기록을 달성한 최초의 선수가 되었다. 지금까지 레전드 제프 마이어와 올리버 칸만이 이 기록을 달성했었다.

    TSV 팰에서 FC 바이에른으로
    21년 전 바일하임에서 태어난 뮐러는 TSV 펠에서 FC 바이에른의 [ http://xooxd.xyz ] 유소년 팀으로 이적한 후 독일 레코드 챔피언의 주니어 팀을 거쳤다. 2008년 8월 15일, 그는 함부르크 SV와의 홈 경기에서 1군 데뷔를 축하했다. 이후 주로 3부 리그 아마추어 선수로 활약했다.

    피엘견 ♩♬♩들은 지들이 16강에서 ♩♪♪ 떨어지던 시절 생각안나나보네 ㅋㅋ 이 ♬♪~♬들아~ 맨시티한테 돈♩♬♬하네 이♩♬♬ 하는데 Epl 전체가 ♩♩♩ 돈♩♬♬ 구단 아닌게 더 적잖아 ㅋㅋ

    반 할의 혁신

    뮐러도 언젠가 제 값에 맞는 평가를 받길 바람.. 스타일 때문인지 활약 대비 개인 수상이 아쉬운 선수..

    뮐러는 다음 시즌에 돌파구를 찾았다. 새로운 감독인 루이 반 할은 "뮐러는 [ http://xooxe.xyz ] 항상 플레이한다"라는 말을 하며 인상적으로 훈련시켰다. 53경기 중 52경기에서 마른 공격수 선수가 필드에 있었고 뮐러는 반 할의 신뢰에 그 이상으로 보답했다. 19골 16어시스트. 뮐러는 분데스리가와 포칼에서 더블을 축하할 수 있었지만 인터밀란과의 챔피언스리그에서는 패배하며 트레블에는 실패했다.

    국대에서 씹어 먹고,
    챔스에서 미쳐 날뛰어도
    피엘에서 안 뛰었으니 양학이라는 피엘충들 이제는 역겹다

    챔스 통산 득점 8위도 양학이지~~
    마르셀로 폭 떨어지고 그런게 보여도 걔는 진짜 해준게 얼만데 라는생각들어서 욕도 몬하겠음


    대관식
    베일을 레알 레전드라 생각하는게 이상한 건 아닌데 유독 [ http://xooxf.xyz ] 그걸 타 팀 팬들이 강요하는 비율이 높은 듯


    사회성이 부족해서 저렇게 얘기해놓고 난 그런적 없는데 라는식으로 발뺌하는건가

    그러나 뮐러는 계속해서 트레블 승리를 꿈꾸며 보상을 받았다. 2012/13 시즌에는 클럽 역사상 첫 트레블이라는 센세이셔널한 승리로 성공했다. 수 많은 다른 타이틀, 골, 어시스트 이후 뮐러와 바이에른은 2020년과 2021년에 한 단계 더 나아졌다. 1년 만에 6개의 타이틀로 팀은 역사책에 다음 페이지를 장식했다.

    킹준게 갓만데 하는 사람들은 잘 생각해보셈. 베일이 아무리 중요한 순간에 트로피 가져다 줬어도 매 순간 그렇게 하는지. 저 새기한테 고연봉을 맞춰주는건 그만한 가치를 해내길 기대하기 때문임. 근데 맨날 부상에 골프 ♩♪♪ 치러 다님;;;; 그래놓고 지단한테 자기 선발 안시켜준다고 보이콧 한거임. 저새기 개♬두보다 비싼 돈 주고 데려왔음. 근데 개♬두만큼 했냐고.


    1920 프리시즌때 아센시오가 시즌아웃만 안됐어도 없앨수 [ http://xooxg.xyz ] 있었는데 3년이 걸리네 이게 ♬♪♪

    고점 생각해봐도 경기력은 지금 비니시우스한테 발림 킥력하고 피지컬로 우긴거지 라리가 개빡센 압박에서

    타이틀 컬렉터, 득점 및 어시스트 킹

    뮐러 까 내리는듯한 뉘앙스로 뻔히 쳐써놓고 아니라고 아득바득 우기는 새끼들은 밖에서 지인들하고 말할때도 말뽄새 그따구로 하나 ㅋㅋㅋ


    현재 600경기 동안 FC 바이에른에서 토마스 뮐러는 220개의 득점을 기록했고, 230개의 어시스트를 기록했다. 뮐러의 타이틀 컬렉션은 더 인상적이다. 독일 챔피언 10번, DFB 우승 6번, 챔피언스리그 우승 2번, FIFA 월드컵 챔피언 2번, UEFA 슈퍼컵 우승 7번, 독일 슈퍼컵 우승 7번 - 끝이 보이지 않는다!

    크리스탈 팰리스는 파트리크 비에이라 감독을 선임하는 도박을 감행했다.

  13. 밤이슬 2022.01.04 20:24  댓글주소  수정/삭제  댓글쓰기

    분당오피 정자오피 서현오피 밤이슬 https://www.bam-is.com

    파워볼사이트 https://powerballgaming.com/

    풀싸롱 강남유흥 선릉풀싸롱 정자오피 분당오피 서현오피

    분당휴게텔 서현휴게텔 선릉오피 강남오피 일산오피

    일산휴게텔 정자휴게텔 안마방 분당안마 출장안마

  14. 밤이슬 2022.01.05 22:42  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  15. 밤이슬 2022.01.11 04:07  댓글주소  수정/삭제  댓글쓰기

    강남오피 강남S바디 출장안마 분당오피 출장마사지 가격위치 밤이슬

    https://www.bam-is.com

    @ 파워볼사이트 파워볼배팅 https://powerballgaming.com @

    전국 @휴게텔 안마방 서울경기 출장안마 마사지 위치 정보 할인이벤트

    풀싸롱 . 강남유흥 선릉풀싸롱 정자오피 분당오피 서현오피

    분당휴게텔` . @서현휴게텔1 선릉오피 풀싸롱 강남오피 일산오피

    일산휴게텔 @ 정자휴게텔 안마방 @ 분당안마 출장안마 0

  16. 밤이슬 2022.01.16 12:24  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  17. 밤이슬 2022.01.16 15:11  댓글주소  수정/삭제  댓글쓰기

    강남오피 일산오피 서울출장 분당오피 출장마사지 가격위치 밤이슬

    https://www.bam-is.com

    @ 파워볼사이트 파워볼배팅 https://powerballgaming.com @

    전국 @휴게텔 안마방 서울경기 출장안마 마사지 위치 정보 할인이벤트

    풀싸롱 . 강남유흥 선릉풀싸롱 정자오피 분당오피 서현오피

    분당휴게텔` . @서현휴게텔1 선릉오피 풀싸롱 강남오피 일산오피

    일산휴게텔 @ 정자휴게텔 안마방 @ 분당안마 출장안마 0

  18. 밤이슬 2022.01.19 07:01  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  19. 밤이슬 2022.01.21 23:19  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  20. 밤이슬 2022.01.23 02:32  댓글주소  수정/삭제  댓글쓰기

    구미오피 구미안마 출장 생활어백마 밤이슬 bam-is.com

    !! 파워볼사이트 파워볼배팅 https://powerballgaming.com !!

    구미오피 구미유흥업속정보 구미마사지업체 구미2030안마소

    강남오피 백마오피 강남백마

    전국 @휴게텔 안마방 서울경기 출장안마 마사지 위치 정보 할인이벤트

    풀싸롱 . 강남유흥 선릉풀싸롱 정자오피 분당오피 서현오피

    분당휴게텔` . @서현휴게텔1 선릉오피 풀싸롱 강남오피 일산오피

    일산휴게텔 @ 정자휴게텔 안마방 @ 분당안마 출장안마 @

  21. 밤이슬 2022.01.24 19:33  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.