본문 바로가기
Project/project 1 - JH community

[php] 문의 게시판 페이지 3 - 문의게시판 수정 페이지 만들기

by 끊임없는정진 2023. 1. 2.

※ 보안적 요소는 거의 고려하지 않고 php명령어 숙달용으로 혼자서 만드는 로그인 페이지 입니다.

 

▶게시판 페이지를 위해 만들어야 할 파일 (※이번 시간에 만들파일은 굵은 글씨로 표기)

 

inquiry.php : 문의게시판 메인화면

inquiry_read.php : 문의게시판 읽기 페이지

inquiry_modify.php : 문의게시판 수정페이지

inquiry_delete.php : 문의게시판 삭제 처리 페이지

inqmodi_check.php : 문의게시판 수정 처리 페이지

inquiry_search.php : 문의게시판 검색 페이지

pwcheck.php : 문의게시판 게시글 읽기 전 비밀번호 확인 페이지

pwcheck2.php : 문의게시판 삭제 전 비밀번호 확인 페이지

pwcheck3.php : 문의게시판 글 수정 전 비밀번호 확인 페이지

 

▶문의게시판 수정 과정 구상

 

 일전에 작성했던 문의게시판 읽기 페이지와 똑같이 구상했다. 우선적으로 수정페이지에 접속하고자 하면, 비밀번호를 체크하고, POST 형식으로 전송해서 단순히 URL로 공격할 수 없도록 구성했다.  아래는 게시판 읽기 페이지에서 쓴 구상도인데, 문의게시판에 있어서도 크게 다르지 않아 갖고 왔다. '해당 글 접속'은 '해당 글 수정' , 'POST 데이터 검증, 게시판 읽기'는 'POST 데이터 검증, 게시글 수정'으로 읽는다면 크게 다르지 않을듯하다. 어쨋든, 자세한 내용은 전에 포스팅한 '문의게시판 읽기 페이지'를 참고하자.

'문의게시판 읽기 페이지'에서 쓴 구상도, '문의게시판 수정'도 크게 다르지 않다.

 

▶게시글 수정 전 비밀번호 확인 페이지 (pwcheck3.php)

 

 게시글을 읽는 페이지는 해당 게시글에서 idx파라미터를 get으로 받은 뒤 비밀번호 입력란을 만든다. 동시에 db를 호출해서 해당 게시글의 비밀번호도 불러온다. 그리고 게시글 수정페이지로 (inquiry_modify.php) 해당 정보들을 넘겨준다. 비교는 수정페이지에서 할 예정이다. 코드 구성은 다음과 같이 했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
include ("./db.php");
 
$id = $_GET['idx'];
$sql = "SELECT * FROM inquiry WHERE idx='$id'";
$res = mysqli_query($conn2, $sql);
$inquiry = mysqli_fetch_array($res);
$password = $inquiry['pw'];
?>
 
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" type="text/css" href="./css/bootstrap.css">
    <link rel="stylesheet" type="text/css" href="./css/bootstrap.min.css">
        <link rel="stylesheet" href="./style.css">
        <title>EnterPw</title>
    </head>
    <body class="text-center">
        <main>
        <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3" crossorigin="anonymous"></script>
 
 
        <div class="container">
            <h4 class="display-4 text-center">비밀번호</h4>
            <form action="./inquiry_modify.php?idx=<?=$id?>" method="post">
                <div class="mb-3">
                    <label for="password"></label>
                    <input type="password" id="pw_wr" name="pw_wr" class="form-control" required>
                </div>
                <button type ="submit" class="btn btn-primary">확인</button>
            </form>
        </div>
    </main>
    </body>
</html>
cs

 

이러한 php코드로 구성된 비밀번호 입력란은 다음과 같이 나타난다.

pwcheck3.php

 

▶게시글 수정 페이지 (inquiry_modify.php)

 

 제일 먼저 받은 변수들을 비교해준다. GET 변수를 받는지 우선 확인하고 안받으면 작성모드, 받으면 수정모드로 바꾼다. 작성모드는 문의게시판인 관계로 별도의 검증을 거치지 않는다. 누구나 문의할 수 있게 비회원게시판으로 만드는 것이 취지이기 때문이다. 다만, 수정모드임에도 비밀번호 검증을 거치지 않았다면 연결을 끊게끔 만든다. php코드로 구성하면 다음과 같이 구성할 수 있겠다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
include ("./db.php");
 
// GET 변수를 받는지 확인
if(isset($_GET["idx"])) {
 
  // GET변수 불러오기
  $id = $_GET["idx"];
  $pw_wr = $_POST['pw_wr'];
  $sql = "SELECT * FROM inquiry WHERE idx='$id'";
  $res = mysqli_query($conn2$sql);
  $inquiry = mysqli_fetch_array($res);
 
// 패스워드 검증을 거쳤는지 확인
  if($pw_wr===$inquiry['pw']) {
  } else {
    echo "<script>alert('비밀번호가 틀렸습니다.');</script>";
    echo "<script>history.go(-1);</script>";
    exit;
  }
 
// 수정 모드 부여
$mode = "modify";
$head = "문의글 수정";
$sql = "SELECT * FROM inquiry WHERE idx = '$id'";
$res = mysqli_query($conn2,$sql);
$inquiry = mysqli_fetch_array($res);
else {
 
// 작성 모드 부여
$mode = "insert";
$head = "문의글 작성";
$mod_cer = "";
}
 ?>
cs

 

먼저, GET으로 idx값을 받는지 확인한다. 받지 않으면 바로 '작성모드'를 부여해서 작성하게끔하고, idx값을 받으면 '수정모드'를 부여하기 전, pw검증을 거친다. 그리고나서 아래에 html코드를 작성해서 검증을 거치지 않으면 html 페이지를 불러오지 못하게 만들어준다. 

html 코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" type="text/css" href="./css/bootstrap.css">
    <link rel="stylesheet" type="text/css" href="./css/bootstrap.min.css">
    <title><?=$head?></title>
  </head>
<!-- 내용 시작 -->
  <body>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3" crossorigin="anonymous"></script>
 
    <nav class="navbar navbar-expand-lg navbar-light bg-light">
      <div class="container-fluid">
        <a class="navbar-brand" href="#">문의게시판</a>
        <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarColor03" aria-controls="navbarColor03" aria-expanded="false" aria-label="Toggle navigation">
          <span class="navbar-toggler-icon"></span>
        </button>
        <div class="collapse navbar-collapse" id="navbarColor03">
          <ul class="navbar-nav me-auto">
            <li class="nav-item">
              <a class="nav-link" href="./inquiry.php">문의목록
              </a>
            </li>
            <li class="nav-item">
              <a class="nav-link active" href="./inquiry_modify.php">문의하러가기
              </a>
            </li>
            <li class="nav-item">
              <a class="nav-link" href="./index1.php">로그인/자유게시판
                <span class="visually-hidden">(current)</span>
              </a>
            </li>
          </ul>
        </div>
      </div>
    </nav>
 
    <form class="mt-3" action="./inqmodi_check.php" method="post" enctype="multipart/form-data">
      <input type="hidden" name="mode" value="<?php echo $mode ?>">
      <input type="hidden" name="id" value="<?php echo $id ?>">
      <div class="container">
        <div class="row g-5">
          <div class="form-group">
            <label for="title" class="form-label mt-5">제목</label>
            <textarea name="title" id="title" type="title" class="form-control" placeholder="제목을 입력하세요." rows="1"><?php echo $mod_cer ?? $inquiry['title'] ?></textarea>
          </div>
          <div class="form-group">
            <label for="Textarea" class="form-label mt-4">내용</label>
            <textarea class="form-control" name="content" id="content" placeholder="내용을 입력하세요" rows="4" style="height: 154px;" required><?php echo $mod_cer ?? $inquiry['content'] ?></textarea>
          </div>
          <div class="form-group">
            <label class="col-form-label mt-4" for="name">성함</label>
            <input type="text" class="form-control" placeholder="성함" name="name" id="name" value="<?php echo $inquiry['name'] ?? '' ?>" required />
          </div>
          <div class="form-group">
            <label class="col-form-label mt-4" for="name">비밀번호</label>
            <input type="password" class="form-control" placeholder="비밀번호" name="password" id="password" required/>
          </div>
          <div class="form-group">
            <label class="col-form-label mt-4" for="phone">연락처</label>
            <input type="text" class="form-control" placeholder="연락처" name="phone" id="phone" value="<?php echo $inquiry['phone'] ?? '' ?>"/>
          </div>
          <div class="form-group mb-5">
            <label for="formFile" class="form-label mt-4">파일첨부</label>
            <input class="form-control" type="file" id="formFile" name="j_file"/>
          </div>
 
          <button type="submit" class="btn btn-primary mb-5"><?=$head?></button>
 
        </div>
      </div>
    </form>
    </body>
</html>
cs

 

해당 html코드로 만들어진 html 페이지는 다음과 같이 구성된다. 

 

 

 

▶게시글 수정처리 페이지 (inqmodi_check.php)

 

 말 그대로 수정처리를 하는 페이지이다. html적 요소는 필요없고, db를 불러오고나서 INSERT를 하든 UPDATE를 하든 만들어주면 된다. 게시판 페이지를 만들어봤으면, 게시글 작성페이지와 별 다를게 없다는 것을 생각할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<?php
include ("db.php");
if(isset($_POST['mode'])) {
 
}else {
    exit ("<script>alert('비정상적인 접근입니다.');location.replace('./inquiry.php');</script>");
}
 
// 받아온 데이터들 정리
$mode = $_POST['mode'];
$title = $_POST['title'];
$content = $_POST['content'];
$name = $_POST['name'];
$password = $_POST['password'];
$phone = $_POST['phone'];
$id = $_POST['id'];
 
// 파일관련 변수
$file_tmp = $_FILES['j_file']['tmp_name'];
$file_name = $_FILES['j_file']['name'];
$file_dir = "./upload_file/".$file_name;
$file_error = $_FILES['j_file']['error'];
move_uploaded_file($file_tmp,$file_dir);
 
// 파일 오류코드에 따른 경고 코드 저장
/*$error_result = match ($file_error) {
  UPLOAD_ERR_OK => "업로드 정상 완료 ($file_error)",
  UPLOAD_ERR_INI_SIZE => "php.ini에 설정된 최대 파일크기 초과 ($file_error)",
  UPLOAD_ERR_FORM_SIZE => "HTML폼에 설정된 최대 파일크기 초과 ($file_error)",
  UPLOAD_ERR_PARTIAL => "파일의 일부만 업로드 됨 ($file_error)",
  UPLOAD_ERR_NO_FILE => "업로드할 파일이 없음 ($file_error)",
  UPLOAD_ERR_NO_TMP_DIR => "웹서버에 임시폴더가 없음 ($file_error)",
  UPLOAD_ERR_CANT_WRITE => "웹서버에 파일을 쓸 수 없음 ($file_error)",
  UPLOAD_ERR_EXTENSION => "PHP 확장기능에 의한 업로드 중단 ($file_error)",
};*/
 
// 파일 오류코드 에러발생시
switch ($file_error) {
  case 1:
  echo "<script>alert('파일의 용량이 큽니다.');</script>";
  echo "<script>history.go(-1);</script>";
  exit;
  case 2:
  echo "<script>alert('파일의 용량이 큽니다.');</script>";
  echo "<script>history.go(-1);</script>";
  exit;
  case 3:
  echo "<script>alert('파일이 일부만 업로드 됐습니다.');</script>";
  echo "<script>history.go(-1);</script>";
  exit;
  case 5:
  echo "<script>alert('웹서버에 임시폴더가 없습니다.');</script>";
  echo "<script>history.go(-1);</script>";
  exit;
  case 7:
  echo "<script>alert('PHP 확장기능을 확인해주세요.');</script>";
  echo "<script>history.go(-1);</script>";
  exit;
}
 
// 모드에 따른 SQL 처리
if($mode == "insert"){
  $sql = "INSERT INTO inquiry SET title ='$title', content ='$content', file = '$file_name', name='$name', pw='$password', phone='$phone'";
  $result = mysqli_query($conn2$sql);
else if($mode == "modify"){
  $sql = "UPDATE inquiry
  SET title ='$title', content ='$content', file = '$file_name', name='$name', pw='$password', phone='$phone' WHERE idx = '$id'";
  $result = mysqli_query($conn2$sql);
else {
  echo "<script>alert('mode set error!');</script>";
  echo "<script>history.go(-1);</script>";
}
 
//업로드 결과
if ($result) {
  echo "<script>alert('완료되었습니다.');</script>";
  echo "<script>location.replace('./inquiry.php');</script>";
else {
  echo "error, please check again.";
  mysqli_error($conn1);
  mysqli_close($conn1);
}
cs

 

댓글