ผมจะพัฒนาระบบ POS สำหรับร้านอาหาร ด้วย PHP, Bootstrap และ MySQL พร้อมฟีเจอร์หลักดังนี้:

ฟีเจอร์หลักของระบบ POS

  • ระบบ ล็อกอิน และ จัดการผู้ใช้ (แอดมิน/พนักงาน)
  • จัดการเมนูอาหาร (เพิ่ม/แก้ไข/ลบ)
  • จัดการโต๊ะอาหาร
  • สั่งอาหาร และ ออกใบเสร็จ
  • พิมพ์ใบเสร็จ (ใช้ JavaScript Window Print)
  • รายงานยอดขายรายวัน/รายเดือน
  • ระบบจัดการสต๊อกสินค้า (เสริม)

📌 1. สร้างฐานข้อมูล MySQL

CREATE DATABASE restaurant_pos;
USE restaurant_pos;

-- ผู้ใช้ระบบ (Admin/Staff)
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    role ENUM('admin', 'staff') NOT NULL
);

-- เมนูอาหาร
CREATE TABLE menu (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    price DECIMAL(10,2) NOT NULL
);

-- โต๊ะอาหาร
CREATE TABLE tables (
    id INT AUTO_INCREMENT PRIMARY KEY,
    table_number INT NOT NULL UNIQUE,
    status ENUM('available', 'occupied') DEFAULT 'available'
);

-- รายการสั่งอาหาร
CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    table_id INT NOT NULL,
    order_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    status ENUM('pending', 'completed') DEFAULT 'pending',
    total DECIMAL(10,2) NOT NULL DEFAULT 0,
    FOREIGN KEY (table_id) REFERENCES tables(id)
);

-- รายการอาหารที่สั่ง
CREATE TABLE order_items (
    id INT AUTO_INCREMENT PRIMARY KEY,
    order_id INT NOT NULL,
    menu_id INT NOT NULL,
    quantity INT NOT NULL,
    subtotal DECIMAL(10,2) NOT NULL,
    FOREIGN KEY (order_id) REFERENCES orders(id),
    FOREIGN KEY (menu_id) REFERENCES menu(id)
);

📌 2. เชื่อมต่อฐานข้อมูล (db.php)

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "restaurant_pos";

$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
    die("เชื่อมต่อฐานข้อมูลล้มเหลว: " . $conn->connect_error);
}
?>

📌 3. ระบบล็อกอิน (login.php)

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

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = $_POST['username'];
    $password = $_POST['password'];

    $stmt = $conn->prepare("SELECT id, password, role FROM users WHERE username = ?");
    $stmt->bind_param("s", $username);
    $stmt->execute();
    $stmt->store_result();
    $stmt->bind_result($id, $hashed_password, $role);
    $stmt->fetch();

    if (password_verify($password, $hashed_password)) {
        $_SESSION['user_id'] = $id;
        $_SESSION['role'] = $role;
        header("Location: dashboard.php");
        exit();
    } else {
        echo "ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง!";
    }
}
?>

<form method="post">
    ชื่อผู้ใช้: <input type="text" name="username" required><br>
    รหัสผ่าน: <input type="password" name="password" required><br>
    <button type="submit">เข้าสู่ระบบ</button>
</form>

📌 4. หน้าแดชบอร์ด (dashboard.php)

<?php
session_start();
if (!isset($_SESSION['user_id'])) {
    header("Location: login.php");
    exit();
}

echo "ยินดีต้อนรับ!";
?>
<ul>
    <li><a href="menu.php">จัดการเมนู</a></li>
    <li><a href="tables.php">จัดการโต๊ะ</a></li>
    <li><a href="orders.php">สั่งอาหาร</a></li>
    <li><a href="sales_report.php">รายงานยอดขาย</a></li>
    <li><a href="logout.php">ออกจากระบบ</a></li>
</ul>

📌 5. ฟังก์ชันสั่งอาหาร (orders.php)

<?php
include 'db.php';

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $table_id = $_POST['table_id'];
    $menu_id = $_POST['menu_id'];
    $quantity = $_POST['quantity'];

    $menu = $conn->query("SELECT price FROM menu WHERE id = $menu_id")->fetch_assoc();
    $subtotal = $menu['price'] * $quantity;

    $conn->query("INSERT INTO orders (table_id, total) VALUES ($table_id, $subtotal)");
    $order_id = $conn->insert_id;

    $conn->query("INSERT INTO order_items (order_id, menu_id, quantity, subtotal) VALUES ($order_id, $menu_id, $quantity, $subtotal)");
}
?>

<form method="post">
    หมายเลขโต๊ะ: <input type="number" name="table_id" required>
    เมนู: <select name="menu_id">
        <?php
        $menu_items = $conn->query("SELECT * FROM menu");
        while ($menu = $menu_items->fetch_assoc()) {
            echo "<option value='{$menu['id']}'>{$menu['name']} ({$menu['price']} บาท)</option>";
        }
        ?>
    </select>
    จำนวน: <input type="number" name="quantity" required>
    <button type="submit">สั่งอาหาร</button>
</form>

📌 6. พิมพ์ใบเสร็จ (receipt.php)

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

$order = $conn->query("SELECT * FROM orders WHERE id = $order_id")->fetch_assoc();
$order_items = $conn->query("SELECT menu.name, order_items.quantity, order_items.subtotal FROM order_items JOIN menu ON order_items.menu_id = menu.id WHERE order_id = $order_id");

echo "<h2>ใบเสร็จ</h2>";
echo "หมายเลขโต๊ะ: " . $order['table_id'] . "<br>";
echo "<hr>";

while ($item = $order_items->fetch_assoc()) {
    echo "{$item['name']} x{$item['quantity']} - {$item['subtotal']} บาท<br>";
}
echo "<hr>";
echo "<strong>ยอดรวม: {$order['total']} บาท</strong>";

?>

<button onclick="window.print()">พิมพ์ใบเสร็จ</button>

📌 7. รายงานยอดขาย (sales_report.php)

<?php
include 'db.php';

$sales = $conn->query("SELECT DATE(order_time) as date, SUM(total) as revenue FROM orders WHERE status = 'completed' GROUP BY DATE(order_time)");

echo "<h2>รายงานยอดขาย</h2>";
echo "<table border='1'>";
echo "<tr><th>วันที่</th><th>ยอดขายรวม (บาท)</th></tr>";

while ($row = $sales->fetch_assoc()) {
    echo "<tr><td>{$row['date']}</td><td>{$row['revenue']}</td></tr>";
}
echo "</table>";
?>

สรุป

  • ใช้ PHP + MySQL + Bootstrap สำหรับพัฒนา
  • พิมพ์ใบเสร็จได้ (JavaScript window.print())
  • มีรายงานยอดขายรายวัน/เดือน
  • สามารถขยายเพิ่ม API, จัดการสต๊อกสินค้า, ระบบชำระเงิน ฯลฯ

🔒 ระบบล็อกอิน และจัดการผู้ใช้ (แอดมิน/พนักงาน) สำหรับร้านอาหาร POS


1. สร้างตารางผู้ใช้ในฐานข้อมูล

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    role ENUM('admin', 'staff') NOT NULL
);

2. ระบบสมัครสมาชิก (เฉพาะแอดมินเพิ่มผู้ใช้)

📄 register.php

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

// ตรวจสอบสิทธิ์แอดมินก่อนเพิ่มผู้ใช้
if (!isset($_SESSION['role']) || $_SESSION['role'] !== 'admin') {
    die("เฉพาะแอดมินเท่านั้นที่สามารถเพิ่มผู้ใช้");
}

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = $_POST['username'];
    $password = password_hash($_POST['password'], PASSWORD_DEFAULT);
    $role = $_POST['role'];

    $stmt = $conn->prepare("INSERT INTO users (username, password, role) VALUES (?, ?, ?)");
    $stmt->bind_param("sss", $username, $password, $role);

    if ($stmt->execute()) {
        echo "เพิ่มผู้ใช้สำเร็จ!";
    } else {
        echo "เกิดข้อผิดพลาด: " . $stmt->error;
    }
}
?>

<h2>เพิ่มผู้ใช้ใหม่</h2>
<form method="post">
    ชื่อผู้ใช้: <input type="text" name="username" required><br>
    รหัสผ่าน: <input type="password" name="password" required><br>
    บทบาท: 
    <select name="role">
        <option value="admin">Admin</option>
        <option value="staff">พนักงาน</option>
    </select><br>
    <button type="submit">เพิ่มผู้ใช้</button>
</form>
<a href="dashboard.php">กลับสู่หน้าหลัก</a>

3. ระบบล็อกอิน

📄 login.php

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

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = $_POST['username'];
    $password = $_POST['password'];

    $stmt = $conn->prepare("SELECT id, password, role FROM users WHERE username = ?");
    $stmt->bind_param("s", $username);
    $stmt->execute();
    $stmt->store_result();
    $stmt->bind_result($id, $hashed_password, $role);
    $stmt->fetch();

    if (password_verify($password, $hashed_password)) {
        $_SESSION['user_id'] = $id;
        $_SESSION['role'] = $role;
        header("Location: dashboard.php");
        exit();
    } else {
        echo "ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง!";
    }
}
?>

<h2>เข้าสู่ระบบ</h2>
<form method="post">
    ชื่อผู้ใช้: <input type="text" name="username" required><br>
    รหัสผ่าน: <input type="password" name="password" required><br>
    <button type="submit">เข้าสู่ระบบ</button>
</form>

4. หน้าหลักแดชบอร์ด (แสดงเมนูแยกตามสิทธิ์)

📄 dashboard.php

<?php
session_start();
if (!isset($_SESSION['user_id'])) {
    header("Location: login.php");
    exit();
}

echo "ยินดีต้อนรับ! บทบาท: " . $_SESSION['role'];
?>

<ul>
    <?php if ($_SESSION['role'] === 'admin'): ?>
        <li><a href="register.php">เพิ่มผู้ใช้ใหม่</a></li>
        <li><a href="manage_users.php">จัดการผู้ใช้</a></li>
    <?php endif; ?>
    <li><a href="menu.php">จัดการเมนู</a></li>
    <li><a href="tables.php">จัดการโต๊ะ</a></li>
    <li><a href="orders.php">สั่งอาหาร</a></li>
    <li><a href="sales_report.php">รายงานยอดขาย</a></li>
    <li><a href="logout.php">ออกจากระบบ</a></li>
</ul>

5. ระบบจัดการผู้ใช้ (เฉพาะแอดมิน)

📄 manage_users.php

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

if (!isset($_SESSION['role']) || $_SESSION['role'] !== 'admin') {
    die("เฉพาะแอดมินเท่านั้นที่สามารถเข้าถึงหน้านี้");
}

// ลบผู้ใช้
if (isset($_GET['delete_id'])) {
    $id = $_GET['delete_id'];
    $conn->query("DELETE FROM users WHERE id = $id");
}

// ดึงข้อมูลผู้ใช้ทั้งหมด
$users = $conn->query("SELECT id, username, role FROM users");
?>

<h2>จัดการผู้ใช้</h2>
<table border="1">
    <tr>
        <th>ชื่อผู้ใช้</th>
        <th>บทบาท</th>
        <th>จัดการ</th>
    </tr>
    <?php while ($row = $users->fetch_assoc()): ?>
    <tr>
        <td><?= $row['username'] ?></td>
        <td><?= $row['role'] ?></td>
        <td>
            <a href="?delete_id=<?= $row['id'] ?>" onclick="return confirm('แน่ใจหรือไม่ที่จะลบผู้ใช้นี้?')">ลบ</a>
        </td>
    </tr>
    <?php endwhile; ?>
</table>

<a href="dashboard.php">กลับสู่หน้าหลัก</a>

6. ออกจากระบบ

📄 logout.php

<?php
session_start();
session_destroy();
header("Location: login.php");
exit();
?>

🔥 สรุป

  • register.php: เพิ่มผู้ใช้ใหม่ (เฉพาะแอดมิน)
  • login.php: ล็อกอิน (Staff/Admin)
  • dashboard.php: หน้าหลัก แสดงเมนูเฉพาะบทบาท
  • manage_users.php: แอดมินสามารถดู/ลบผู้ใช้
  • logout.php: ออกจากระบบ

ต่อยอดเพิ่มได้:

  • ระบบเปลี่ยนรหัสผ่าน
  • ระบบรีเซ็ตรหัสผ่าน (Forgot Password)
  • เช็คสิทธิ์เพิ่มในการเข้าถึงหน้าอื่นๆ

🔐 อัปเกรดระบบ POS: เปลี่ยนรหัสผ่าน + รีเซ็ตรหัสผ่าน + เช็คสิทธิ์เข้าถึง


1. ระบบเปลี่ยนรหัสผ่าน

📄 change_password.php

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

if (!isset($_SESSION['user_id'])) {
    header("Location: login.php");
    exit();
}

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $user_id = $_SESSION['user_id'];
    $current_password = $_POST['current_password'];
    $new_password = $_POST['new_password'];
    $confirm_password = $_POST['confirm_password'];

    // ตรวจสอบรหัสผ่านเก่า
    $stmt = $conn->prepare("SELECT password FROM users WHERE id = ?");
    $stmt->bind_param("i", $user_id);
    $stmt->execute();
    $stmt->store_result();
    $stmt->bind_result($hashed_password);
    $stmt->fetch();

    if (!password_verify($current_password, $hashed_password)) {
        die("รหัสผ่านเดิมไม่ถูกต้อง!");
    }

    // ตรวจสอบว่ารหัสใหม่และยืนยันรหัสตรงกัน
    if ($new_password !== $confirm_password) {
        die("รหัสผ่านใหม่และยืนยันรหัสผ่านไม่ตรงกัน!");
    }

    // อัปเดตรหัสผ่านใหม่
    $new_hashed_password = password_hash($new_password, PASSWORD_DEFAULT);
    $update_stmt = $conn->prepare("UPDATE users SET password = ? WHERE id = ?");
    $update_stmt->bind_param("si", $new_hashed_password, $user_id);
    if ($update_stmt->execute()) {
        echo "เปลี่ยนรหัสผ่านสำเร็จ!";
    } else {
        echo "เกิดข้อผิดพลาด: " . $update_stmt->error;
    }
}
?>

<h2>เปลี่ยนรหัสผ่าน</h2>
<form method="post">
    รหัสผ่านเดิม: <input type="password" name="current_password" required><br>
    รหัสผ่านใหม่: <input type="password" name="new_password" required><br>
    ยืนยันรหัสผ่านใหม่: <input type="password" name="confirm_password" required><br>
    <button type="submit">เปลี่ยนรหัสผ่าน</button>
</form>
<a href="dashboard.php">กลับสู่หน้าหลัก</a>

2. ระบบรีเซ็ตรหัสผ่าน (Forgot Password)

📄 forgot_password.php

<?php
include 'db.php';

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = $_POST['username'];
    $new_password = bin2hex(random_bytes(4)); // สร้างรหัสผ่านใหม่แบบสุ่ม
    $hashed_password = password_hash($new_password, PASSWORD_DEFAULT);

    $stmt = $conn->prepare("UPDATE users SET password = ? WHERE username = ?");
    $stmt->bind_param("ss", $hashed_password, $username);

    if ($stmt->execute() && $stmt->affected_rows > 0) {
        echo "รีเซ็ตรหัสผ่านสำเร็จ! รหัสผ่านใหม่ของคุณคือ: <strong>$new_password</strong>";
    } else {
        echo "ไม่พบชื่อผู้ใช้!";
    }
}
?>

<h2>ลืมรหัสผ่าน</h2>
<form method="post">
    ชื่อผู้ใช้: <input type="text" name="username" required><br>
    <button type="submit">รีเซ็ตรหัสผ่าน</button>
</form>
<a href="login.php">กลับไปยังหน้าล็อกอิน</a>

3. เช็คสิทธิ์การเข้าถึงหน้าอื่นๆ

เพิ่มโค้ดต่อไปนี้ไปยังหน้าที่ต้องการจำกัดสิทธิ์ เช่น menu.php, orders.php, sales_report.php (เฉพาะแอดมิน)

<?php
session_start();
if (!isset($_SESSION['user_id'])) {
    header("Location: login.php");
    exit();
}

// เช็คสิทธิ์ (เฉพาะแอดมินเท่านั้น)
if ($_SESSION['role'] !== 'admin') {
    die("คุณไม่มีสิทธิ์เข้าถึงหน้านี้!");
}
?>

4. อัปเดตเมนูแดชบอร์ด

📄 dashboard.php

<ul>
    <li><a href="menu.php">จัดการเมนู</a></li>
    <li><a href="tables.php">จัดการโต๊ะ</a></li>
    <li><a href="orders.php">สั่งอาหาร</a></li>
    <li><a href="sales_report.php">รายงานยอดขาย</a></li>
    <li><a href="change_password.php">เปลี่ยนรหัสผ่าน</a></li>
    <?php if ($_SESSION['role'] === 'admin'): ?>
        <li><a href="register.php">เพิ่มผู้ใช้ใหม่</a></li>
        <li><a href="manage_users.php">จัดการผู้ใช้</a></li>
    <?php endif; ?>
    <li><a href="logout.php">ออกจากระบบ</a></li>
</ul>

สรุปฟีเจอร์ใหม่

  • 🔑 เปลี่ยนรหัสผ่าน: ผู้ใช้สามารถเปลี่ยนรหัสผ่านเอง
  • 🔐 รีเซ็ตรหัสผ่าน: กรณีลืมรหัสผ่าน ระบบจะสร้างรหัสผ่านใหม่อัตโนมัติ
  • 🔒 เช็คสิทธิ์เข้าถึง: ป้องกันพนักงานเข้าถึงหน้าสำคัญของแอดมิน

,


ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *