안녕하세요! 그레이해커 월횽입니다. 이번 강의에서는 PHP와 MySQL을 사용하여 블로그 시스템을 구축하는 프로젝트를 진행합니다. 프로젝트는 단계별로 진행되며, 요구사항 분석부터 데이터베이스 설계, 기능 구현, 최종 배포까지를 포함합니다.
1. 프로젝트 개요 및 요구사항 분석
1-1. 프로젝트 개요
· 목표: 기본적인 블로그 시스템을 구축하여 사용자 인증, 게시글 관리, 댓글 기능을 포함한 웹 애플리케이션을 개발합니다.
· 기능: 사용자 등록 및 로그인, 게시글 작성/수정/삭제, 댓글 작성 및 관리, 사용자 인터페이스.
1-2. 요구사항 분석
사용자 기능
· 사용자 등록 및 로그인/로그아웃
· 사용자 프로필 관리
게시글 관리
· 게시글 작성
· 게시글 수정
· 게시글 삭제
· 게시글 목록 보기
댓글 관리
· 댓글 작성
· 댓글 삭제
· 댓글 수정
기타
· 데이터베이스 연동
· 보안 고려 (SQL 인젝션 방지, 비밀번호 해시화 등)
· 기본적인 UI/UX 디자인
2. 데이터베이스 설계
2-1. 데이터베이스 구조
다음은 블로그 시스템을 위한 기본적인 데이터베이스 구조입니다.
1. 사용자 테이블 (users)
· id (INT, PK, AUTO_INCREMENT)
· username (VARCHAR, UNIQUE)
· password (VARCHAR)
· email (VARCHAR, UNIQUE)
· created_at (TIMESTAMP)
· updated_at (TIMESTAMP)
2. 게시글 테이블 (posts)
· id (INT, PK, AUTO_INCREMENT)
· user_id (INT, FK -> users.id)
· title (VARCHAR)
· content (TEXT)
· created_at (TIMESTAMP)
· updated_at (TIMESTAMP)
3. 댓글 테이블 (comments)
· id (INT, PK, AUTO_INCREMENT)
· post_id (INT, FK -> posts.id)
· user_id (INT, FK -> users.id)
· content (TEXT)
· created_at (TIMESTAMP)
· updated_at (TIMESTAMP)
2-2. 데이터베이스 생성 및 테이블 생성 SQL
CREATE DATABASE blog_system;
USE blog_system;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE posts (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
CREATE TABLE comments (
id INT AUTO_INCREMENT PRIMARY KEY,
post_id INT,
user_id INT,
content TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
3. 사용자 인증 시스템 구현
3-1. 사용자 등록 및 로그인
1. 사용자 등록 (register.php)
<?php
require 'database.php';
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$username = $_POST['username'];
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
$email = $_POST['email'];
$stmt = $pdo->prepare("INSERT INTO users (username, password, email) VALUES (?, ?, ?)");
$stmt->execute([$username, $password, $email]);
echo "User registered successfully!";
}
?>
<form method="POST">
Username: <input type="text" name="username" required>
Password: <input type="password" name="password" required>
Email: <input type="email" name="email" required>
<button type="submit">Register</button>
</form>
2. 사용자 로그인 (login.php)
<?php
require 'database.php';
session_start();
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$username = $_POST['username'];
$password = $_POST['password'];
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$username]);
$user = $stmt->fetch();
if ($user && password_verify($password, $user['password'])) {
$_SESSION['user_id'] = $user['id'];
$_SESSION['username'] = $user['username'];
header('Location: index.php');
} else {
echo "Invalid credentials!";
}
}
?>
<form method="POST">
Username: <input type="text" name="username" required>
Password: <input type="password" name="password" required>
<button type="submit">Login</button>
</form>
4. 게시글 작성, 수정, 삭제 기능 구현
4-1. 게시글 작성 (create_post.php)
<?php
require 'database.php';
session_start();
if (!isset($_SESSION['user_id'])) {
header('Location: login.php');
exit;
}
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$title = $_POST['title'];
$content = $_POST['content'];
$user_id = $_SESSION['user_id'];
$stmt = $pdo->prepare("INSERT INTO posts (user_id, title, content) VALUES (?, ?, ?)");
$stmt->execute([$user_id, $title, $content]);
echo "Post created successfully!";
}
?>
<form method="POST">
Title: <input type="text" name="title" required>
Content: <textarea name="content" required></textarea>
<button type="submit">Create Post</button>
</form>
4-2. 게시글 수정 (edit_post.php)
<?php
require 'database.php';
session_start();
if (!isset($_SESSION['user_id'])) {
header('Location: login.php');
exit;
}
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$id = $_POST['id'];
$title = $_POST['title'];
$content = $_POST['content'];
$stmt = $pdo->prepare("UPDATE posts SET title = ?, content = ? WHERE id = ?");
$stmt->execute([$title, $content, $id]);
echo "Post updated successfully!";
}
$id = $_GET['id'];
$stmt = $pdo->prepare("SELECT * FROM posts WHERE id = ?");
$stmt->execute([$id]);
$post = $stmt->fetch();
?>
<form method="POST">
<input type="hidden" name="id" value="<?php echo $post['id']; ?>">
Title: <input type="text" name="title" value="<?php echo $post['title']; ?>" required>
Content: <textarea name="content" required><?php echo $post['content']; ?></textarea>
<button type="submit">Update Post</button>
</form>
4-3. 게시글 삭제 (delete_post.php)
<?php
require 'database.php';
session_start();
if (!isset($_SESSION['user_id'])) {
header('Location: login.php');
exit;
}
$id = $_GET['id'];
$stmt = $pdo->prepare("DELETE FROM posts WHERE id = ?");
$stmt->execute([$id]);
echo "Post deleted successfully!";
?>
5. 댓글 기능 구현
5-1. 댓글 작성 (add_comment.php)
<?php
require 'database.php';
session_start();
if (!isset($_SESSION['user_id'])) {
header('Location: login.php');
exit;
}
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$post_id = $_POST['post_id'];
$content = $_POST['content'];
$user_id = $_SESSION['user_id'];
$stmt = $pdo->prepare("INSERT INTO comments (post_id, user_id, content) VALUES (?, ?, ?)");
$stmt->execute([$post_id, $user_id, $content]);
echo "Comment added successfully!";
}
?>
<form method="POST">
<input type="hidden" name="post_id" value="<?php echo $_GET['post_id']; ?>">
Content: <textarea name="content" required></textarea>
<button type="submit">Add Comment</button>
</form>
5-2. 댓글 삭제 (delete_comment.php)
<?php
require 'database.php';
session_start();
if (!isset($_SESSION['user_id'])) {
header('Location: login.php');
exit;
}
$id = $_GET['id'];
$stmt = $pdo->prepare("DELETE FROM comments WHERE id = ?");
$stmt->execute([$id]);
echo "Comment deleted successfully!";
?>
6. 프로젝트 완성 및 배포
6-1. 프로젝트 테스트
· 기능별로 테스트하여 버그를 수정합니다.
· 다양한 사용자 시나리오를 통해 기능이 잘 동작하는지 확인합니다.
6-2. 배포 준비
· 웹 서버 환경 설정 (예: Apache, Nginx)
· 데이터베이스 설정 및 데이터 이관
· 최종 배포 및 사용자 피드백 수집
6-3. 배포
· 프로덕션 서버에 파일을 업로드합니다.
· 도메인 및 SSL 인증서 설정
· 실제 사용 환경에서 테스트를 수행합니다.
- 이전 수업 목록
'프로그래밍 > PHP' 카테고리의 다른 글
[PHP 수업] 16강 - PHP 프레임워크 소개 (0) | 2024.08.15 |
---|---|
[PHP 수업] 15강 - PHP와 AJAX (0) | 2024.08.14 |
[PHP 수업] 14강 - 객체 지향 프로그래밍 (OOP) (0) | 2024.08.13 |
[PHP 수업] 13강 - 데이터베이스 연동 (MySQL) (0) | 2024.08.12 |
[PHP 수업] 12강 - 파일 처리 (0) | 2024.08.09 |