웹사이트 게시판에서 글을 작성하는 과정은 기본적인 게시판 기능 중 하나입니다. 이번 글에서는 사용자가 게시글을 작성할 때, 파일 업로드 기능을 추가하고, 이를 MySQL 데이터베이스에 저장하는 방법을 소개하겠습니다. 사용자가 게시글과 함께 이미지를 업로드할 수 있는 기능은 많은 게시판에서 중요한 요소입니다. PHP와 MySQL을 활용하여 게시글과 파일을 안전하게 처리하는 방법을 단계별로 알아보겠습니다.
1. 게시글 작성 폼 만들기
게시글을 작성하는 폼은 HTML로 만들 수 있습니다. 이 폼에는 제목, 내용, 파일 업로드 필드를 추가하여 사용자가 게시글과 파일을 동시에 제출할 수 있게 합니다. 기본적인 게시글 작성 폼의 구조는 다음과 같습니다.
<form action="submit_post.php" method="POST" enctype="multipart/form-data">
<label for="title">제목</label>
<input type="text" name="title" id="title" required><br>
<label for="content">내용</label>
<textarea name="content" id="content" rows="4" required></textarea><br>
<label for="file">첨부파일</label>
<input type="file" name="file" id="file"><br>
<button type="submit">게시글 작성</button>
</form>
이 폼은 사용자가 제목과 내용을 입력하고, 파일을 업로드할 수 있도록 합니다. `enctype="multipart/form-data"` 속성은 파일 업로드를 처리하는 데 필요합니다.
2. PHP로 파일 업로드 처리하기
파일 업로드를 처리하려면 PHP에서 `$_FILES` 배열을 사용하여 사용자가 업로드한 파일 정보를 받을 수 있습니다. 업로드한 파일은 서버의 특정 폴더에 저장되고, 파일 이름을 데이터베이스에 저장할 수 있습니다.
다음은 `submit_post.php` 파일에 작성할 코드입니다. 이 코드는 사용자가 제출한 글과 파일을 처리하고, 파일을 서버에 저장한 후 MySQL에 게시글 정보를 삽입하는 코드입니다.
<?php
include('config.php');
// 폼에서 받은 데이터
$title = $_POST['title'];
$content = $_POST['content'];
// 파일 업로드 처리
if ($_FILES['file']['error'] == 0) {
$upload_dir = 'uploads/'; // 업로드할 폴더
$file_name = $_FILES['file']['name'];
$file_tmp = $_FILES['file']['tmp_name'];
$file_path = $upload_dir . basename($file_name);
// 파일 이동
if (move_uploaded_file($file_tmp, $file_path)) {
echo "파일 업로드 성공!";
} else {
echo "파일 업로드 실패.";
}
} else {
$file_path = null; // 파일 업로드가 없을 경우 null로 설정
}
// MySQL 데이터베이스에 게시글 삽입
$sql = "INSERT INTO posts (title, content, file_path, created_at)
VALUES ('$title', '$content', '$file_path', NOW())";
if ($conn->query($sql) === TRUE) {
echo "게시글이 성공적으로 작성되었습니다.";
} else {
echo "오류: " . $conn->error;
}
// 연결 종료
$conn->close();
?>
위 코드는 게시글 제목과 내용, 파일 정보를 받아 MySQL에 저장하는 과정입니다. 업로드된 파일은 `uploads/` 폴더에 저장되고, 파일 경로는 MySQL 데이터베이스에 삽입됩니다. 파일 업로드가 실패하면 오류 메시지가 출력되고, 성공적으로 업로드되면 게시글이 데이터베이스에 삽입됩니다.
3. MySQL 데이터베이스 설계
파일을 포함한 게시글 정보를 저장하려면, MySQL 데이터베이스에 적절한 테이블 구조를 만들어야 합니다. 게시글 테이블에는 제목, 내용, 파일 경로, 작성일 등을 저장할 수 있는 필드가 필요합니다.
다음은 게시글을 저장할 `posts` 테이블을 만드는 SQL 코드입니다.
-- 게시글 테이블 생성
CREATE TABLE posts (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
file_path VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
이 테이블에는 게시글의 제목, 내용, 파일 경로, 작성일이 저장됩니다. `file_path` 필드는 파일이 업로드되었을 때 해당 파일의 경로를 저장하고, 업로드되지 않았을 경우에는 `NULL` 값을 저장합니다.
4. 보안 고려사항: 파일 업로드 시 주의사항
파일 업로드는 보안상 취약할 수 있습니다. 악성 파일을 업로드하는 것을 방지하기 위해 다음과 같은 보안 조치를 고려해야 합니다:
- 파일 확장자 제한: 업로드할 수 있는 파일 형식을 제한합니다. 예를 들어, 이미지 파일만 허용하려면 `.jpg`, `.png`, `.gif` 등의 확장자만 허용할 수 있습니다.
- 파일 크기 제한: 업로드 가능한 파일 크기를 제한합니다. 너무 큰 파일이 업로드되면 서버에 부하를 줄 수 있습니다.
- 파일 이름 안전성 확인: 파일 이름에 특수 문자가 포함될 경우 시스템에 악영향을 미칠 수 있습니다. 파일 이름을 안전하게 변경하거나 확인하는 절차가 필요합니다.
- 업로드된 파일 저장 위치 보호: 업로드된 파일을 서버의 공개되지 않는 디렉토리에 저장하고, 서버에서 직접 실행되지 않도록 합니다.
이와 같은 보안 조치를 통해 파일 업로드 기능을 안전하게 사용할 수 있습니다.
5. 게시글 작성 후 화면 출력
사용자가 게시글을 작성한 후, 작성한 게시글과 첨부된 파일을 화면에 출력할 수 있습니다. 게시글 목록을 보여주는 페이지에서 각 게시글에 첨부된 파일을 함께 표시하는 방법은 다음과 같습니다.
<?php
$sql = "SELECT * FROM posts ORDER BY created_at DESC";
$result = $conn->query($sql);
while ($row = $result->fetch_assoc()) {
echo "<h3>" . $row['title'] . "</h3>";
echo "<p>" . $row['content'] . "</p>";
if ($row['file_path']) {
echo "<a href='" . $row['file_path'] . "' target='_blank'>첨부파일 보기</a>";
}
echo "<hr>";
}
?>
위 코드는 게시글을 출력할 때, 첨부된 파일이 있을 경우 해당 파일을 링크로 표시합니다. 사용자가 파일을 클릭하면 해당 파일을 열 수 있습니다.
6. 마무리
이번 글에서는 게시판에서 글을 작성하면서 파일을 업로드하고, 이를 MySQL에 저장하는 방법을 알아보았습니다. 게시글 작성 기능에 파일 업로드를 추가하면, 사용자가 이미지나 문서 파일을 첨부하여 게시글을 더욱 풍부하게 만들 수 있습니다. 파일 업로드 기능을 안전하게 구현하기 위해 보안 사항을 신경 써야 하며, 이를 통해 보다 안전하고 효율적인 게시판을 구축할 수 있습니다.
'PHP로 웹사이트 만들기' 카테고리의 다른 글
게시판에 댓글 기능 추가하기: MySQL 관계형 데이터 설계 (0) | 2025.02.10 |
---|---|
게시판 글 수정 및 삭제 기능을 PHP로 구현하기 (0) | 2025.02.09 |
9. PHP와 MySQL로 게시판 만들기: 로그인 및 회원가입 구현하기 (0) | 2025.01.30 |
8. PHP와 MySQL로 게시판 만들기: 게시판에 사용자 등록 기능 추가하기 (0) | 2025.01.29 |
7. PHP와 MySQL로 게시판 만들기: 게시글 저장 및 조회 기능 구현하기 (0) | 2025.01.28 |