10 บั๊ก PHP ยอดฮิตที่มือใหม่มักพลาด
คุณเขียนโค้ด รีเฟรชหน้าเว็บ แล้วก็เจอหน้าจอสีขาวว่างเปล่า
สิ่งนี้เกิดขึ้นเพราะโดยปกติแล้ว PHP จะไม่แสดงข้อผิดพลาดออกมา (fails silently) หากคุณไม่เห็นข้อผิดพลาด คุณก็ไม่สามารถแก้ไขมันได้
เริ่มการพัฒนาของคุณด้วยการเพิ่มบรรทัดเหล่านี้ไว้ที่ส่วนบนสุดของไฟล์:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
คำสั่งนี้จะบังคับให้ PHP แสดงสิ่งที่ผิดพลาดออกมา แต่อย่าใช้คำสั่งนี้ในระบบที่ใช้งานจริง (production)
นี่คือ 10 บั๊กที่พบบ่อยและวิธีแก้ไข
ลืมใส่เครื่องหมายเซมิโคลอน (Missing Semicolons) PHP จำเป็นต้องมีเครื่องหมายเซมิโคลอนเพื่อจบคำสั่ง หากคุณลืมใส่ สคริปต์จะหยุดทำงาน วิธีแก้: ลงท้ายบรรทัดด้วยเครื่องหมายเซมิโคลอนเสมอ
การเปรียบเทียบแบบไม่เข้มงวด (Loose Comparison) ตัวดำเนินการ
==จะเปลี่ยนประเภทข้อมูลก่อนทำการเปรียบเทียบ ซึ่งอาจนำไปสู่ผลลัพธ์ที่ผิดพลาด วิธีแก้: ใช้===เพราะจะตรวจสอบทั้งค่า (value) และประเภทข้อมูล (type)ตัวแปรที่ไม่ได้กำหนดค่า (Undefined Variables) การใช้ตัวแปรที่คุณไม่ได้สร้างขึ้นจะทำให้เกิดข้อผิดพลาดทางตรรกะ (logic errors) วิธีแก้: ใช้ null coalescing operator
$name = $_GET['name'] ?? 'Guest';ขอบเขตของตัวแปร Global (Global Variable Scope) ฟังก์ชันไม่สามารถมองเห็นตัวแปรที่อยู่นอกขอบเขตของมันได้ วิธีแก้: ส่งตัวแปรเข้าไปในฟังก์ชันในรูปแบบของพารามิเตอร์ (parameters)
SQL Injection การนำข้อมูลจากผู้ใช้ไปใส่ในคำสั่ง query โดยตรงนั้นอันตรายมาก เพราะผู้โจมตีสามารถขโมยข้อมูลของคุณได้ วิธีแก้: ใช้ prepared statements ร่วมกับ placeholders
Cross-Site Scripting (XSS) การแสดงผลข้อมูลดิบจากผู้ใช้บนหน้าจอ อาจทำให้สคริปต์ที่เป็นอันตรายทำงานบนเบราว์เซอร์ได้ วิธีแก้: ใช้
htmlspecialchars()กับข้อมูลที่แสดงผลทั้งหมดข้อผิดพลาดเกี่ยวกับ Header (Header Errors) คุณไม่สามารถส่ง header ได้ หากมีการส่งข้อความหรือช่องว่างไปยังเบราว์เซอร์ไปก่อนหน้านั้นแล้ว วิธีแก้: วางคำสั่ง
header()ไว้ที่ส่วนบนสุดของไฟล์เสมอ และใช้exit()ทุกครั้งหลังจากการ redirectลืมตรวจสอบ Key ใน Form (Missing Form Keys) การเข้าถึง key ของฟอร์มที่ไม่มีอยู่จริงจะทำให้เกิดข้อผิดพลาด วิธีแก้: ใช้ null coalescing operator เพื่อกำหนดค่าเริ่มต้น (default value)
การใช้ Include เทียบกับ Require (Include vs Require) คำสั่ง
includeจะแจ้งเพียงแค่คำเตือน (warning) หากไม่พบไฟล์ แต่สคริปต์จะยังคงทำงานต่อไปและอาจไปพังในภายหลัง วิธีแก้: ใช้require_onceสำหรับไฟล์ที่สำคัญ เช่น การเชื่อมต่อฐานข้อมูลไม่ได้ตรวจสอบค่าที่ส่งกลับมา (Unchecked Return Values) ฟังก์ชันหลายอย่างใน PHP จะส่งค่า
falseกลับมาหากทำงานล้มเหลว การนำค่าfalseนั้นไปใช้ในขั้นตอนถัดไปจะทำให้โปรแกรมพัง วิธีแก้: ตรวจสอบก่อนว่าฟังก์ชันส่งค่าfalseกลับมาหรือไม่ ก่อนที่จะนำผลลัพธ์ไปใช้งาน
สรุปเพื่อการเขียนโค้ดที่ดีขึ้น:
• เปิดการรายงานข้อผิดพลาด (error reporting) ในระหว่างการพัฒนา
• ใช้ === แทน ==
• ตรวจสอบค่าที่ส่งกลับมา (return values)
• ทำความสะอาดข้อมูล (sanitize) จากผู้ใช้ทั้งหมด
ที่มา: https://dev.to/bikkisingh/top-10-php-bugs-every-beginner-makes-and-how-to-fix-them-1anh