หลายคนเริ่มเรียน PHP จากการทำระบบ Login และ CRUD (Create, Read, Update, Delete) เป็นโปรเจกต์แรก เพราะมันคือแกนกลางของเว็บแอปแทบทุกประเภท ตั้งแต่ระบบจัดการนักเรียน ระบบสมาชิกร้านค้า ไปจนถึง Backoffice ขององค์กร ในบทความนี้เราจะสร้างระบบนี้ด้วย PHP ดิบ ๆ (Vanilla PHP) ร่วมกับ Bootstrap 5 ตั้งแต่ศูนย์ และที่สำคัญคือเราจะเขียนให้ ปลอดภัยกว่าตัวอย่างทั่วไปที่หาอ่านได้ตามเว็บ เพราะ Tutorial ส่วนใหญ่มักสอนแบบ query ตรง ๆ ที่เปิดช่องให้เกิด SQL Injection และเก็บรหัสผ่านแบบไม่เข้ารหัส ซึ่งเป็นนิสัยที่ไม่ควรติดไปใช้ในงานจริง
เป้าหมายของบทความนี้ไม่ใช่แค่ "ทำให้รัน" แต่อยากให้มือใหม่เห็นว่าการเขียน PHP แบบดิบต้องดูแลเรื่องอะไรเองบ้าง เมื่อเทียบกับตอนที่เราย้ายไปใช้ CodeIgniter 4 หรือ Laravel ที่มีโครงสร้างพวกนี้เตรียมไว้ให้แล้ว
01สิ่งที่ต้องเตรียมก่อนเริ่ม
- Local server: XAMPP หรือ Laragon (มี Apache + MySQL + PHP ในตัว)
- พื้นฐาน PHP: ตัวแปร, ฟังก์ชัน, if/else, array เบื้องต้น
- พื้นฐาน SQL: CREATE TABLE, SELECT, INSERT, UPDATE, DELETE
- Bootstrap 5: ใช้ผ่าน CDN ไม่ต้องติดตั้งอะไรเพิ่ม
02สร้างฐานข้อมูลและไฟล์เชื่อมต่อ
เริ่มจากสร้างฐานข้อมูลชื่อ pcm_demo และตาราง users สำหรับ Login กับตาราง students สำหรับฝึก CRUD
จากนั้นสร้างไฟล์เชื่อมต่อฐานข้อมูล โดยใช้ MySQLi แบบ Object-Oriented และเปิด exception mode ไว้ เพื่อให้ error แสดงชัดเจนตอนพัฒนา
MYSQLI_REPORT_STRICT ทำให้ทุก query ที่ผิดพลาดโยน Exception ออกมาทันที แทนที่จะปล่อยให้ query ล้มเหลวเงียบ ๆ ซึ่งช่วยจับบั๊กได้เร็วกว่าการเช็ค if ($result === false) ทุกจุด03ระบบ Login ที่ปลอดภัยด้วย password_hash()
จุดที่ Tutorial ทั่วไปมักพลาดคือเก็บรหัสผ่านเป็น plain text หรือเทียบรหัสผ่านด้วย == ตรง ๆ ในที่นี้เราจะใช้ password_hash() ตอนสมัครสมาชิก และ password_verify() ตอน Login พร้อม Prepared Statement เพื่อกัน SQL Injection
$password == $user['password'] ใช้ไม่ได้กับ hash เพราะ password_hash() สร้าง salt แบบสุ่มทุกครั้ง ต้องใช้ password_verify() เท่านั้น และห้าม query แบบเอา $_POST ไปต่อ string SQL ตรง ๆ เด็ดขาด เพราะนั่นคือช่องโหว่ SQL Injection แบบคลาสสิกส่วน Form ฝั่ง HTML ใช้ Bootstrap 5 แบบมาตรฐาน เช่น
04CRUD นักเรียนด้วย Bootstrap 5
หลัง Login สำเร็จ เราจะพาไปหน้า students.php ที่แสดงตารางข้อมูล พร้อมปุ่มเพิ่ม/แก้ไข/ลบ ทุกหน้าต้องเช็ค session ก่อนเสมอ ไม่ใช่แค่ซ่อนปุ่มเฉย ๆ
ส่วน add.php และ edit.php ก็ใช้แพทเทิร์นเดียวกัน คือ เช็ค session → bind_param ทุก query → redirect หลังบันทึก ทำซ้ำแบบนี้ใน 4 ไฟล์ (add, edit, delete, login) คือสิ่งที่มือใหม่จะเริ่มรู้สึก "เขียนซ้ำเยอะมาก" และนั่นคือจุดเริ่มต้นที่ทำให้เราอยากมี Framework เข้ามาช่วย
05เขียนเองทั้งหมด vs ใช้ Framework
พอลองสร้างระบบ Login + CRUD ด้วย PHP ดิบจนจบ จะเห็นภาพชัดว่าอะไรที่เราต้อง "คิดเอง ทำเอง" ทั้งหมด ลองเทียบให้เห็นภาพกับ CodeIgniter 4 และ Laravel
| หัวข้อ | PHP ดิบ (Vanilla) | CodeIgniter 4 | Laravel |
|---|---|---|---|
| ป้องกัน SQL Injection | ต้องเขียน prepared statement เอง | Query Builder ป้องกันให้อัตโนมัติ | Eloquent ป้องกันให้อัตโนมัติ |
| เก็บรหัสผ่าน | ต้องเรียก password_hash() เอง | มี password helper ในตัว | Hash facade + bcrypt อัตโนมัติ |
| โครงสร้างไฟล์ | ปนกันหมดในไฟล์เดียว | MVC แยกชัดเจน | MVC + Service/Repository ได้ |
| Validation ฟอร์ม | เขียน if/else เองทั้งหมด | Validation library ในตัว | Form Request Validation |
| ความเร็วในการเริ่มโปรเจกต์เล็ก | เร็วที่สุด ไม่ต้องตั้งค่าอะไร | ต้องตั้งค่าเริ่มต้นเล็กน้อย | ตั้งค่าเริ่มต้นมากกว่า CI4 |
| เหมาะกับโปรเจกต์ใหญ่ขึ้น | ดูแลยากเมื่อโค้ดเยอะ | รองรับงานระดับองค์กรได้ดี | รองรับงานใหญ่ ระบบซับซ้อนได้ดี |
สรุปง่าย ๆ คือ PHP ดิบเหมาะกับการ เข้าใจกลไกเบื้องหลัง ว่า Login ทำงานยังไง CRUD เชื่อมฐานข้อมูลยังไง แต่พอจะทำงานจริงหรือโปรเจกต์ที่มีหลายหน้า หลายฟีเจอร์ Framework อย่าง CodeIgniter 4 หรือ Laravel จะช่วยลดงานซ้ำซ้อนและลดโอกาสพลาดเรื่องความปลอดภัยได้มาก
06สรุป
โปรเจกต์ Login + CRUD ด้วย PHP + Bootstrap 5 เป็นจุดเริ่มต้นที่ดีมากสำหรับมือใหม่ เพราะครอบคลุมทักษะหลักที่ใช้ซ้ำในแทบทุกเว็บแอป ทั้งการเชื่อมต่อฐานข้อมูล การยืนยันตัวตน และการจัดการข้อมูลพื้นฐาน แต่สิ่งสำคัญที่อยากให้จำไว้คือ อย่าก๊อปโค้ดจาก Tutorial ที่ไม่มี prepared statement หรือไม่ hash รหัสผ่าน เพราะนิสัยตอนเริ่มต้นมักติดตัวไปจนถึงงานจริง
