สร้างระบบส่งงานนักเรียนสุดล้ำ: คู่มือ PHP + MySQL ฉบับเริ่มต้น

การจัดการงานส่งของนักเรียนแบบดิจิทัลเป็นสิ่งจำเป็นในยุคนี้ การสร้างระบบส่งงาน (Assignment Submission System) ด้วยตัวเองโดยใช้เทคโนโลยีพื้นฐานอย่าง PHP และ MySQL เป็นทางเลือกที่ยืดหยุ่นและคุ้มค่า บทความนี้จะแนะนำโครงสร้างและโค้ดพื้นฐานที่คุณสามารถนำไปใช้พัฒนาต่อยอดได้ทันที

ระบบนี้จะประกอบด้วยส่วนหลัก ๆ คือ หน้าอัปโหลดไฟล์ (PHP) และ ฐานข้อมูลสำหรับเก็บข้อมูลการส่งงาน (MySQL)


1. โครงสร้างฐานข้อมูล (MySQL Setup)

เราจะสร้างตารางเดียวเพื่อเก็บข้อมูลที่สำคัญทั้งหมดของการส่งงาน

ตาราง assignments

ใช้โค้ด SQL ต่อไปนี้เพื่อสร้างตารางในฐานข้อมูล MySQL ของคุณ:

SQL

CREATE TABLE assignments (
    id INT(11) AUTO_INCREMENT PRIMARY KEY,
    student_name VARCHAR(255) NOT NULL,
    student_id VARCHAR(50) NOT NULL,
    assignment_name VARCHAR(255) NOT NULL,
    file_path VARCHAR(255) NOT NULL, -- เก็บที่อยู่ของไฟล์บนเซิร์ฟเวอร์
    submission_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
FieldTypeDescription
idINTPrimary Key, Auto-increment
student_nameVARCHARชื่อ-นามสกุล นักเรียน
student_idVARCHARรหัสนักเรียน (ไม่ซ้ำกัน)
assignment_nameVARCHARชื่องานที่ส่ง
file_pathVARCHARสำคัญ: ที่อยู่ไฟล์จริงบนเซิร์ฟเวอร์
submission_dateTIMESTAMPวันที่และเวลาที่ส่งงาน

2. โค้ด PHP: หน้าฟอร์มอัปโหลด (upload_form.html หรือ .php)

สร้างไฟล์ HTML/PHP สำหรับแสดงฟอร์มให้นักเรียนกรอกข้อมูลและเลือกไฟล์

HTML

<!DOCTYPE html>
<html lang="th">
<head>
    <meta charset="UTF-8">
    <title>ระบบส่งงานออนไลน์</title>
</head>
<body>

    <h2>ส่งงานวิชา [ระบุวิชา]</h2>
    
    <form action="submit_assignment.php" method="POST" enctype="multipart/form-data">
        
        <label for="name">ชื่อ-นามสกุล:</label><br>
        <input type="text" id="name" name="student_name" required><br><br>

        <label for="std_id">รหัสนักเรียน:</label><br>
        <input type="text" id="std_id" name="student_id" required><br><br>
        
        <label for="assign_name">ชื่องาน:</label><br>
        <select id="assign_name" name="assignment_name" required>
            <option value="">-- เลือกชื่องาน --</option>
            <option value="รายงานบทที่ 1">รายงานบทที่ 1</option>
            <option value="โครงงานกลุ่ม">โครงงานกลุ่ม</option>
            </select><br><br>

        <label for="file">เลือกไฟล์งาน (PDF/Word/ZIP):</label><br>
        <input type="file" id="file" name="assignment_file" required><br><br>
        
        <input type="submit" value="ส่งงาน">
    </form>

</body>
</html>

3. โค้ด PHP: สคริปต์ประมวลผลและบันทึกข้อมูล (submit_assignment.php)

ไฟล์นี้เป็นหัวใจสำคัญ ทำหน้าที่เชื่อมต่อฐานข้อมูล จัดการอัปโหลดไฟล์ และบันทึกข้อมูลลงใน MySQL

A. โค้ดเชื่อมต่อฐานข้อมูล

PHP

<?php
// กำหนดค่าการเชื่อมต่อฐานข้อมูล
$servername = "localhost";
$username = "root"; // เปลี่ยนเป็นชื่อผู้ใช้ MySQL ของคุณ
$password = ""; // เปลี่ยนเป็นรหัสผ่าน MySQL ของคุณ
$dbname = "assignment_db"; // เปลี่ยนเป็นชื่อฐานข้อมูลของคุณ

// สร้างการเชื่อมต่อ
$conn = new mysqli($servername, $username, $password, $dbname);

// ตรวจสอบการเชื่อมต่อ
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
?>

B. โค้ดประมวลผลการอัปโหลด

PHP

<?php
// (โค้ดเชื่อมต่อฐานข้อมูล จาก 3.A อยู่ที่นี่)

// ตรวจสอบว่ามีการส่งข้อมูลแบบ POST มาหรือไม่
if ($_SERVER["REQUEST_METHOD"] == "POST") {

    // 1. รับค่าจากฟอร์ม
    $student_name = $conn->real_escape_string($_POST['student_name']);
    $student_id = $conn->real_escape_string($_POST['student_id']);
    $assignment_name = $conn->real_escape_string($_POST['assignment_name']);

    // 2. จัดการการอัปโหลดไฟล์
    $target_dir = "uploads/"; // โฟลเดอร์ที่จะเก็บไฟล์งาน
    // ตรวจสอบและสร้างโฟลเดอร์ uploads หากไม่มี
    if (!is_dir($target_dir)) {
        mkdir($target_dir, 0777, true);
    }
    
    $original_file_name = basename($_FILES["assignment_file"]["name"]);
    // สร้างชื่อไฟล์ใหม่เพื่อป้องกันชื่อซ้ำและง่ายต่อการจัดระเบียบ
    $file_extension = pathinfo($original_file_name, PATHINFO_EXTENSION);
    $new_file_name = $student_id . "_" . time() . "." . $file_extension;
    $target_file = $target_dir . $new_file_name;
    $uploadOk = 1;
    
    // ตรวจสอบขนาดไฟล์ (เช่น ไม่เกิน 5MB)
    if ($_FILES["assignment_file"]["size"] > 5000000) {
        echo "ขออภัย, ไฟล์ของคุณใหญ่เกินไป (จำกัด 5MB).";
        $uploadOk = 0;
    }
    
    // หากไม่มีปัญหาในการอัปโหลด
    if ($uploadOk == 1) {
        if (move_uploaded_file($_FILES["assignment_file"]["tmp_name"], $target_file)) {
            // 3. บันทึกข้อมูลลงฐานข้อมูล
            $sql = "INSERT INTO assignments (student_name, student_id, assignment_name, file_path) 
                    VALUES ('$student_name', '$student_id', '$assignment_name', '$target_file')";

            if ($conn->query($sql) === TRUE) {
                echo "<h1>การส่งงานสำเร็จ!</h1>";
                echo "ชื่อไฟล์: " . $original_file_name . "<br>";
                echo "วันที่ส่ง: " . date("Y-m-d H:i:s");
            } else {
                echo "Error: " . $sql . "<br>" . $conn->error;
            }
        } else {
            echo "ขออภัย, มีข้อผิดพลาดในการย้ายไฟล์.";
        }
    }

}
$conn->close();
?>

4. ข้อควรจำเพื่อความปลอดภัยและการพัฒนาต่อยอด

  1. ความปลอดภัย (SQL Injection): ในโค้ดตัวอย่าง มีการใช้ real_escape_string() ซึ่งเป็นมาตรการพื้นฐาน แต่ ควรเปลี่ยนไปใช้ Prepared Statements ($conn->prepare()) เสมอเมื่อใช้งานจริง เพื่อป้องกันการโจมตี SQL Injection อย่างสมบูรณ์
  2. การจัดการไฟล์: ควรจำกัดประเภทของไฟล์ที่อนุญาตให้อัปโหลด (เช่น PDF, DOCX, ZIP เท่านั้น) เพื่อป้องกันการอัปโหลดไฟล์อันตราย (เช่น .php หรือ .exe)
  3. การแสดงผลสำหรับครู: เพื่อให้ระบบสมบูรณ์ คุณควรสร้างหน้า teacher_view.php ที่ดึงข้อมูลจากตาราง assignments มาแสดงผลในรูปแบบตาราง เพื่อให้ครูสามารถดูว่าใครส่งงานแล้วบ้างและมีลิงก์สำหรับดาวน์โหลดไฟล์งานนั้น ๆ
  4. การยืนยันตัวตน: ระบบนี้ไม่มีการล็อกอิน หากต้องการให้ปลอดภัย ควรเพิ่มระบบล็อกอินสำหรับนักเรียนและครู โดยใช้ตาราง users แยกต่างหาก
Scroll to Top