web hacking(Knockon Bootcamp)

[3주차 TIL] KnockOn Bootcamp 게시판(게시글)

king-neo 2024. 12. 23. 23:04

먼저 게시판의 글을 보이려면 글쓰는 것을 만들었다.(wirte.php, write_ok.php)

<!-- write.php -->

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title> 글쓰기 </title>
	<style>
		button{
			background-color: black;
			color: white;
		}	
		table {
			border-collapse: collapse;
			border-spacing: 1px;
			border: 1px solid #fff;
		}
		th {
    			border-top: solid 3px #7c7c7c;
    			border-bottom: solid 1px #a0a0a0;
   			font-weight: bolder;
    			padding: 10px;
		}
		td {
			padding: 10px;
			border-bottom: solid 2px #a0a0a0;
		}
		
	</style>
</head>
<body>
	<h1 align=center> 글쓰기 </h1>
	<hr/>
	<form method = "POST" action="write_ok.php">	
	<table>
		<tr>
		<td>제목 : </td>
		<td><input type = text name = title size =90 placeholder="제목을 입력하시오"required></td>
		</tr>
		<tr>
		<td>내용 : </td>
		<td><textarea name = content cols=85 row=15 plcaeholder="내용을 입력하시오"required></textarea></td>
		</tr>
		<tr>
		<td>파일업로드 : </td>
		<td><input type= file name=file> </td>
		</tr>
	</table>
	<br>
	<button type="submit" align=center> 작성 </button>
	</form>
</body>
</html>

 

<!-- write_ok -->

<?php
session_start();
include('db.php');

if (!isset($_SESSION['username'])) {
    echo "<script>alert('로그인 후 이용해주세요.'); location.href='login.php';</script>";
    exit();
}

$useranme = $_SESSION['username'];
$title = $_POST['title'];
$content = $_POST['content'];
$file_name = null;

if (empty($title) || empty($content)) {
    echo "<script>alert('제목과 내용을 모두 입력해주세요.'); history.back();</script>";
    exit();
}


if (isset($_FILES['file']) && $_FILES['file']['error'] === UPLOAD_ERR_OK) {
    $upload_dir = 'uploads/';
    if (!is_dir($upload_dir)) {
        mkdir($upload_dir, 0777, true);
    }

    $file_tmp = $_FILES['file']['tmp_name'];
    $file_name = basename($_FILES['file']['name']);
    $file_path = $upload_dir . $file_name;

    if (!move_uploaded_file($file_tmp, $file_path)) {
        echo "<script>alert('파일 업로드 중 오류가 발생했습니다.'); history.back();</script>";
        exit();
    }
}

$stmt = $db->prepare("INSERT INTO posts (username, title, content, file_name, created) VALUES (?, ?, ?, ?, NOW())");
if ($stmt->execute([$username, $title, $content, $file_name,])) {
    echo "<script>alert('글 작성이 완료되었습니다.'); location.href='index.php';</script>";
} else {
    echo "<script>alert('글 작성 중 오류가 발생했습니다. 다시 시도해주세요.'); history.back();</script>";
}
?>

wirte.php는 로그인과 메인화면에 썻던 코드를 비슷하게 만들었으며 write_ok.php도 또한 파일 업로드에 관한 코드는 뺴고는 ok.php와 비슷한 원리로 생각하면서 작성하였다.

파일업로드는 따로 파일을 넣는 디렉토리를 만들어서 보관하는 형식으로 했다.

 

글을 쓰면 다음과 같이 생성된 것을 확인할 수 있다.

 

이제 글은 쓴것을 보는 파일을 만들어보자(view.php)

<?php
session_start();
include('db.php');

$post_id = $_GET['id'];

if (!$post_id) {
    echo "<script>alert('잘못된 접근입니다.'); location.href='index.php';</script>";
    exit();
}

$stmt = $db->prepare("SELECT * FROM posts WHERE id = ?");
$stmt->execute([$post_id]);
$post = $stmt->fetch();

if (!$post) {
    echo "<script>alert('존재하지 않는 게시글입니다.'); location.href='index.php';</script>";
    exit();
}
?>

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>게시글 보기</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 20px;
        }
        .container {
            width: 80%;
            margin: auto;
            border: 1px solid #ddd;
            padding: 20px;
            border-radius: 5px;
            box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
        }
        .title {
            font-size: 24px;
            font-weight: bold;
            margin-bottom: 20px;
        }
        .meta {
            font-size: 14px;
            color: #888;
            margin-bottom: 20px;
        }
        .content {
            font-size: 16px;
            line-height: 1.6;
        }
        .file {
            margin-top: 20px;
        }
        a {
			color: black;
            text-decoration: none;
        }
        a:hover {
            text-decoration: underline;
        }
		button {
			color: white;
			background: black;
		}
    </style>
</head>
<body>
    <div class="container">
        <div class="title"><?php echo ($post['title']) ?></div>
        <div class="meta">
            작성자: <?php echo ($post['username']) ?> 
            작성일: <?php echo ($post['created']) ?>
        </div>
        <div class="content"><?php echo nl2br($post['content']) ?></div>
        <div style="margin-top: 20px;">
        	<a href="index.php">목록으로</a>
			<?php
				if($post['username'] == $_SESSION['username']) { ?>
			<button onclick="location.href='modify.php?id=<?php echo $post['id']; ?>'"> 수정</button></li>
			<button onclick="location.href='delete.php?id=<?php echo $post['id']; ?>'"> 삭제</button></li>
			<?php } ?>
		</div>
		
    </div>
</body>
</html>

글 보는 것은 결국 앞에 배워가면서 썼던 것을 재활용하는 느낌으로 작성하였다.

 

이제 글을 보면서 수정, 삭제하는 파일도 만들어보겠다.(modify.php, update.php, delete.php)

< !-- modify.php -->

<?php
include 'db.php';
$post_id = $_GET['id'];

if (!$post_id) {
    echo "<script>alert('잘못된 접근입니다.'); location.href='index.php';</script>";
}

$stmt = $db->prepare("SELECT * FROM posts WHERE id = ?");
$stmt->execute([$post_id]);
$post = $stmt->fetch();
?>

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title> 게시판 수정 </title>
</head>
<body>
<h1>게시글 수정</h1>
    <form method="POST" action="update.php">
        <input type="hidden" name="id" value="<?= $post['id'] ?>">
        <p>
            제목: <input type="text" name="title" value="<?php echo ($post['title']) ?>" required>
        </p>
        <p>
            내용: <textarea name="content" cols="80" rows="10" required><?php echo ($post['content']) ?></textarea>
        </p>
        <p>
            파일 변경: <input type="file" name="file">
        </p>
        <button type="submit">수정</button>
    </form>
</body>
</html>
<!-- update.php -->

<?php
include('db.php');

$post_id = $_POST['id'];
$title = $_POST['title'];
$content = $_POST['content'];

if (!$post_id || empty($title) || empty($content)) {
    echo "<script>alert('빈칸을 채워주세요.'); location.href='modify.php?id=$post_id';</script>";
    exit();
}

$stmt = $db->prepare("UPDATE posts SET title = ?, content = ? WHERE id = ?");
$stmt->execute([$title, $content, $post_id]);

echo "<script>alert('수정되었습니다.'); location.href='view.php?id=$post_id';</script>";
?>
<!-- delete.php -->

<?php
include('db.php');

$post_id = $_GET['id'];

if (!$post_id) {
    echo "<script>alert('잘못된 접근입니다.'); location.href='index.php';</script>";
}

$stmt = $db->prepare("DELETE FROM posts WHERE id = ?");
$stmt->execute([$post_id]);

echo "<script>alert('삭제되었습니다.'); location.href='index.php';</script>";
?>