프로그래밍/PHP

[PHP 수업] 17강 - 프로젝트, 블로그 시스템 구축

월횽 2024. 8. 16. 06:30
728x90
반응형
SMALL

안녕하세요! 그레이해커 월횽입니다. 이번 강의에서는 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)

728x90

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>
SMALL

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 인증서 설정
· 실제 사용 환경에서 테스트를 수행합니다.

 

 

- 이전 수업 목록

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형
LIST