[Normaltic's 취업반 과제] 게시글 수정하기

2024. 5. 12. 17:20정보보안 및 해킹/Normaltic's 취업반 과제

앞서 모든 게시글의 구조를 뜯어고쳤다.. 이전 모습은 전혀 없으니 참고

 

우선 테스트 게시글을 등록

테스트 게시글을 잘 받아오는 것을 볼 수 있다.

수정하기 탭을 클릭

하나도 빠짐 없이 변경해보고

일단 변경된 타이틀로 잘 나오는 것을 확인

내용과 사진도 변경 확인 완료

사진은 제가 다니는 액션스쿨 로고를..

 

index.php

서두에 적어놓은것과 같이 게시판의 구조를 완전히 뜯어 고쳤다.

그래서, 고친 부분은 이 부분이다.

index.php 위에 get_category_list.php를 덮는 형식으로 했었다.

그러니까 종이 두 장을 겹쳐놓는데 index.php에서 출력된 화면이 아래에 깔리고 그 위에 get_category_list.php에서 출력된 화면이 그 위에 깔린다.

그렇게 두개를 겹쳐 놓았던 것을 분리하여 게시판으로써의 역할을 확실히 분담하였다.

[생략]

<?php
        if (isset($_POST['getmusical'])) {
          $category = 'Musical';
          header("location:get_category_list.php?category=" . $category);
          exit;
          // get_lists_of_category('Musical');
        }
        if (isset($_POST['getplay'])) {
          $category = 'Play';
          header("location:get_category_list.php?category=" . $category);
          exit;
          // get_lists_of_category('Play');
        }
        if (isset($_POST['getconcert'])) {
          $category = 'Concert';
          header("location:get_category_list.php?category=" . $category);
          exit;
          // get_lists_of_category('Concert');
        }
    
        ?>
        
        [생략]

get_category_list.php

페이지가 독립적으로 분리되었다.

category를 GET방식으로 받아와서 해당 카테고리의 모든 게시글을 받아오게 되는데, title은 a 태그로 링크를 통해서 이동할 수 있도록 구성되어있고, 아래에는 작성자와 작성된 날짜가 기재되어 있다.

<?php
require_once ('connect_db.php');
?>

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  <link
    href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100..900&family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap"
    rel="stylesheet">

  <link rel="stylesheet" href="/css/style.css" />
  <link rel="stylesheet" href="/css/font.css" />
  <title>Rame's Category</title>
</head>

<body class="header">


  <div class="info">

    <?php
    $category = $_GET['category'];

    // echo 'In Musical Category';
    $table_name = "category_table";
    $watcheddate = 'watched_date';
    // $sql_query = "SELECT * FROM $table_name WHERE `category` = '$category'";
    $sql_query = "SELECT * FROM $table_name WHERE `category` = '$category' ORDER BY $watcheddate DESC";

    $sql_res = mysqli_query(connect_db(), $sql_query);

    if ($sql_res) {
      //  echo "QUERY ACTIVE <br>";
      ?>
      <div class="category_scroll">
        <?php

        if (mysqli_num_rows($sql_res) > 0) {
          for ($i = 0; $i < mysqli_num_rows($sql_res); $i++) {

            $sql_row = mysqli_fetch_array($sql_res);
            $url = "open_cotents.php";
            $writer = urlencode($sql_row['writer']);
            $writed_date = urlencode($sql_row['writed_date']);
            $title = urlencode($sql_row['title']);

            echo "<a href=$url?writer=" . $writer . "&writed_date=" . $writed_date . "&title=" . $title . ">";
            echo "<strong>" . $sql_row['title'] . "</strong><br>";
            echo "</a>";
            echo $sql_row['writer'] . " " . $sql_row['writed_date'] . "<br>";
          }
        } else {
          echo "게시물이 존재하지 않습니다.";
        }
        close_sql();

    } else {
      echo "QUERY FAILED <br>";
    }


    ?>
    </div>

</body>

</html>

open_contents.php

get_categor_list.php에서 a태그를 클릭하면 나오는 페이지.

title과 review, 리뷰를 작성할 때 올린 이미지 파일이 나오게 된다.

<?php
require_once('connect_db.php');
?>

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  <link
    href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100..900&family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap"
    rel="stylesheet">

  <link rel="stylesheet" href="/css/style.css" />
  <link rel="stylesheet" href="/css/font.css" />

  <title>Contents</title>
</head>
<body class="header">
  <div class="info">
  <form action="" method="POST">
<?php

$table_name = "category_table";

$writer = $_GET['writer'];
$writed_date  = $_GET['writed_date'];
$title = $_GET['title'];
echo "<h1>Title : " . $title ."</h1><br>";
$sql_query = "SELECT * FROM $table_name WHERE `writer` = '$writer' and `writed_date` = '$writed_date' and `title` = '$title'";
// echo $sql_query . "<br>";
$sql_res =  mysqli_query(connect_db(), $sql_query);
 $sql_row = mysqli_fetch_array($sql_res);
echo "<h2> review : " . $sql_row['review'] . "</h2><br>";
if($sql_row['review_image'])
    {
    echo "<img src=". $sql_row['review_image'] ."><br>";
    }
    else
    {
      echo "No Image Files <br>";
    }
    close_sql();
?>
<button class="submit-button" name="edit" value="editreview">수정하기</button><br>
<button class="submit-button" name="delete" value="deletereview">삭제하기</button>
<?php
if(isset($_POST["edit"]))
{
  // echo $sql_res;
  header("location: edit_contents.php?sql_query=" . $sql_query);
  exit;

}
if(isset($_POST["delete"]))
{
  
}
?>
</form>
</div>

</body>
</html>

edit_contents.php

게시글에 들어가서 수정하기 버튼을 클릭했을 때 나오는 페이지.

title, watched date, category, name, review, review image가 변경이 가능하고, 작성자와 작성된 날짜는 변경이 불가능하다.

불가능한 두 개의 요소는 코드를 통해 자동으로 들어가게 될 예정

<?php
require_once ('connect_db.php');
require_once ('edit_contents_func.php');
?>

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  <link
    href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100..900&family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap"
    rel="stylesheet">

  <link rel="stylesheet" href="/css/style.css" />
  <link rel="stylesheet" href="/css/font.css" />

  <title>Edit Page</title>
</head>
<body class="header">
  <div class="info">
  <form action="" method="POST" enctype="multipart/form-data">
  <?php
  $sql_query = $_GET['sql_query'];
  // $sql_row = mysqli_fetch_array($sql_res);

   $sql_res =  mysqli_query(connect_db(), $sql_query);
 $sql_row = mysqli_fetch_array($sql_res);
  ?>

<label for="row_title"> Title : </label><br>
  <input type="text" name="row_title"value="<?php echo htmlspecialchars($sql_row['title']); ?>"/><br>

  <label for="row_watched_date"> Watched Date : </label><br>
  <input type="date" name="row_watched_date"value="<?php echo htmlspecialchars($sql_row['watched_date']); ?>"/><br>

  <label for="row_category"> Category : </label><br>
  <select name="category">
  <?php
  $table_name = "category_table";
  $categoryfield = 'Category';
  $result = mysqli_query(connect_db(), 'SHOW COLUMNS FROM ' . $table_name . ' WHERE field="' . $categoryfield . '"');
  while ($row = mysqli_fetch_row($result)) {
    foreach (explode("','", substr($row[1], 6, -2)) as $option) {
      print ("<option>$option</option>");
    }
  }
  close_sql();
  ?>
  </select><br>
  <label for="row_name"> Name : </label><br>
  <input type="text" name="row_name"value="<?php echo htmlspecialchars($sql_row['name']); ?>"/><br>

  <label for="row_review"> Review : </label><br>
  <input type="text" name="row_review"value="<?php echo htmlspecialchars($sql_row['review']); ?>"/><br>

  <label for="row_review_image"> Review Image : </label><br>

  <input type="file" name="row_review_image" value="<?php echo $sql_row['review_image']; ?>"/><br>
  <button class="submit-button" name="complete" value="complete">완료</button>
  <?php
  if(isset($_POST['complete'])) 
  {
    // echo "here";
    $t=time();
    edit_complete($_POST['row_title'], date("Y-m-d",$t), $_POST['row_watched_date'], $_POST['category'], $_POST['row_name'], $_POST['row_review'], $_FILES['row_review_image'], $sql_row['title'], $sql_row['watched_date'], $sql_row['name'], $sql_row['review']);
  }
  ?>
  </form>
  </div>

</body>
</html>

edit_contents_func.php

수정 페이지에서 완료 버튼을 클릭했을 때 불러지는 함수가 있음

이미지의 경로나 이미지 파일의 이름에 공백이 있을 때에 해당 파일을 올려도 제대로 화면에 출력되지 않는 경우가 있어서

  $file_path = preg_replace('/\s/i', '%20', $filename);//space to %20 encode

이 코드를 넣어줬는데, 아무래도 무언가 잘못되어있는 모양이다. 제대로 작동을 하다가 하지 않다가 조금 왔다갔다 해서 수정을 할 예정

<?php
require_once ('connect_db.php');

function edit_complete($title, $writed_date, $watched_date, $category, $name, $review, $review_image, $old_title, $old_watched_date, $old_name, $old_review)
{
  $table_name = "category_table";
  $filename = $review_image["name"];
  $tempname = $review_image["tmp_name"];
  $file_path = preg_replace('/\s/i', '%20', $filename);//space to %20 encode

  $folder = './image/' . basename($file_path);
  if($filename)
  {
    $folder = './image/' . basename($filename);
    
    $sql_query = "UPDATE $table_name SET `title`='$title',`writed_date`='$writed_date',  `watched_date`='$watched_date', `category`='$category', `name`='$name', `review`='$review', `review_image`='$folder' WHERE `title`='$old_title' and `watched_date`='$old_watched_date' and `name`='$old_name' and `review`='$old_review'";
 
  }
  else
  {
    $sql_query = "UPDATE $table_name SET `title`='$title',`writed_date`='$writed_date',  `watched_date`='$watched_date', `category`='$category', `name`='$name', `review`='$review' WHERE `title`='$old_title' and `watched_date`='$old_watched_date' and `name`='$old_name' and `review`='$old_review'";
  
  }
 

  $sql_res = mysqli_query(connect_db(), $sql_query);

  if($filename)
  {
  if (move_uploaded_file($tempname, $folder)) {
    echo "<h3>  Image uploaded successfully!</h3>";
} else {
  //  error_reporting(E_ALL);
  // error_reporting(0);
    echo "<h3>  Failed to upload image!</h3>";
}
  }

  if ($sql_res) {
    echo "등록 완료";
    close_sql();
    refresh_auto_indrement_num();
    
  }
}
?>

write_board_func.php

게시글 등록에도 해당 인코딩 코드 추가 완료. 일단 되는 경우도 있으니 추가는 해두었지만.. 살짝 불안하긴 하다.

[생략]

$file_path = preg_replace('/\s/i', '%20', $filename);//space to %20 encode

[생략]

 

파일 수정하는건 아직 다소 미흡합니다 수정을 거쳐나갈 예정

 

미흡한 점

경로 혹은 파일 이름에 공백이 포함되어 있을 시 이미지가 띄워지지 않을 때가 있음

이미 이미지 파일이 있는 경우에 이미지 파일이 있는지 여부를 알려주지 않음

이미지인지 아닌지 판단하는 부분이 없어서 모든 파일을 다 받음