10 บั๊ก PHP ที่ทำให้โปรเจกต์จริงพัง
โค้ดทำงานได้ปกติบนเครื่องของคุณ แต่พอคุณ push ขึ้นเซิร์ฟเวอร์ ทุกอย่างกลับพังพินาศ ไม่มี error ปรากฏใน log เลย คุณเห็นเพียงแค่ผลลัพธ์ที่ผิดพลาดเท่านั้น
บั๊กเหล่านี้ไม่ได้มาจากตำรา แต่มันมาจากระบบล็อกอิน, ร้านค้า และ API ที่ใช้งานจริง พวกมันดูเหมือนจะไม่มีปัญหาตอนทำ code review แต่กลับไปพังตอนใช้งานจริง (production)
และนี่คือบั๊กหมายเลข #11 ถึง #20 พร้อมวิธีแก้ไข
• Infinite Loops การลืมเพิ่มค่าตัวนับ (counter) จะทำให้กระบวนการ PHP ค้าง ซึ่งอาจทำให้เซิร์ฟเวอร์ทั้งเครื่องล่มได้ วิธีแก้: ตรวจสอบให้แน่ใจเสมอว่าตัวนับในลูปมีการเพิ่มค่าขึ้นเสมอ
• Case-Sensitivity Issues
PHP มองว่า "Admin" และ "admin" เป็นคนละสตริงกัน ซึ่งจะทำให้ระบบควบคุมการเข้าถึง (access control) พังได้
วิธีแก้: ใช้ strtolower() ก่อนที่จะเปรียบเทียบสตริง
• Math and Truncation
การใช้ (int) กับเลขทศนิยมไม่ใช่การปัดเศษ แต่เป็นการตัดเศษทิ้ง ซึ่งจะทำให้เกิดข้อผิดพลาดทางการเงินในระบบเรียกเก็บเงิน
วิธีแก้: ใช้ round() หรือ number_format()
• JSON Errors
json_decode จะคืนค่าเป็น object โดยค่าเริ่มต้น หากคุณพยายามใช้งานมันเหมือนกับ array สคริปต์จะทำงานล้มเหลว
วิธีแก้: ส่งค่า true เป็นอาร์กิวเมนต์ตัวที่สองเพื่อให้ได้ค่าเป็น array
• XSS Security Risks
การพิมพ์ user input โดยตรงจะเปิดโอกาสให้ผู้โจมตีฉีดสคริปต์ (inject scripts) เข้ามาได้
วิธีแก้: ใช้ htmlspecialchars() เสมอ
• Path Failures
Relative paths อาจทำงานได้บนเครื่อง local แต่จะพังบนเซิร์ฟเวอร์จริง
วิธีแก้: ใช้ค่าคงที่ __DIR__ เพื่อระบุ absolute paths
• Duplicate Data
ผู้ใช้มักจะกดปุ่ม submit ซ้ำๆ ซึ่งทำให้เกิดข้อมูลซ้ำในฐานข้อมูล
วิธีแก้: ตรวจสอบก่อนว่ามีข้อมูลนั้นอยู่แล้วหรือไม่ และใช้ข้อกำหนด UNIQUE ในฐานข้อมูลของคุณ
• Merging Arrays
array_merge() จะรีเซ็ต numeric keys ให้เป็นศูนย์ ซึ่งจะทำลายโครงสร้างข้อมูลของคุณ
วิธีแก้: ใช้ตัวดำเนินการ + หรือ array_replace() เพื่อรักษา key เดิมไว้
• Invisible Errors
การปิดการแสดง error ใน production เป็นเรื่องดีในแง่ความปลอดภัย แต่จะเป็นเรื่องแย่สำหรับการ debug หากคุณไม่ได้ทำ log เก็บไว้
วิธีแก้: ตั้งค่า log_errors เป็น 1 และกำหนดเส้นทาง error_log
• Loop References
foreach loop จะแก้ไขข้อมูลในสำเนา ไม่ใช่ใน array ต้นฉบับ
วิธีแก้: ใช้สัญลักษณ์ & เพื่อสร้างการอ้างอิง (reference) แต่ต้องอย่าลืม unset ตัวแปรนั้นหลังจากจบลูปเสมอ
บั๊กส่วนใหญ่เหล่านี้จะไม่แจ้ง error แต่ PHP จะยังคงทำงานต่อไปและให้ผลลัพธ์ที่ผิดพลาด ซึ่งนั่นทำให้มันอันตรายมาก
การเขียนโค้ดนั้นง่าย แต่การเขียนโค้ดให้พร้อมใช้งานจริง (production-ready) จำเป็นต้องเข้าใจว่าสิ่งต่างๆ จะพังได้อย่างไร
อ่านคู่มือฉบับเต็มได้ที่นี่: https://dev.to/bikkisingh/10-php-bugs-that-break-real-projects-and-how-to-fix-them-part-2-7hm