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