PlusMagi's Blog By Pitt Phunsanit Backend,Database PHP: json_encode ไม่มีผลลัพธ์

PHP: json_encode ไม่มีผลลัพธ์

ในฐานะ System Specialist และ Senior Architect การจัดการข้อมูลโครงสร้าง (Structured Data) ให้สามารถแปลงเป็นรูปแบบการส่งผ่านข้อมูลมาตรฐานอย่าง JSON (JavaScript Object Notation) ได้อย่างสมบูรณ์เป็นสิ่งสำคัญอย่างยิ่ง ปัญหาที่พบบ่อยคือการที่ระบบล้มเหลวในการ Encode ข้อมูล ทำให้เกิดข้อผิดพลาดในการประมวลผล (Serialization Failure) แม้ว่าข้อมูลต้นทาง (Source Data) จะดูเหมือนถูกต้องก็ตาม

หากคุณกำลังทำงานกับฐานข้อมูล PostgreSQL และพยายามดึงข้อมูลที่ซับซ้อนเพื่อแปลงเป็น JSON (โดยเฉพาะการใช้ประเภทข้อมูล JSONB) และพบว่าผลลัพธ์ไม่สมบูรณ์ หรือเกิดข้อผิดพลาดในการประมวลผล (ซึ่งเทียบเคียงได้กับปัญหา json_encode ใน PHP ที่ล้มเหลว) สาเหตุส่วนใหญ่มักไม่ได้เกิดจาก Syntax ของ JSON โดยตรง แต่เกิดจากประเภทข้อมูล (Data Type) หรือค่า Null/Invalid Value ที่ระบบไม่สามารถจัดการได้

สาเหตุหลักของ JSON Encoding Failure ในระดับ PostgreSQL

ในโลกของ PostgreSQL การที่ข้อมูลไม่ถูก Encode อย่างสมบูรณ์มักเกิดจาก:

  • การมีค่าที่ไม่สามารถแปลงเป็น String ได้: เช่น ค่า NULL ที่ถูกฝังอยู่ในโครงสร้างที่คาดหวังให้มีค่า หรือการมีค่าที่เกินขอบเขตของประเภทข้อมูล (Overflow)
  • การจัดการข้อมูล Floating Point ที่ผิดพลาด: เช่น ค่า Infinity (INF) หรือ Not a Number (NaN) ซึ่งเป็นค่าที่ทำให้ JSON Encoder ส่วนใหญ่ล้มเหลวในการแปลง
  • ความซับซ้อนของโครงสร้างข้อมูล: การพยายามแปลง Array ที่มีโครงสร้างไม่สม่ำเสมอ (Heterogeneous Structure)

แนวทางการแก้ไขปัญหาด้วย PostgreSQL Functions

แทนที่จะพึ่งพาการตรวจสอบ Error Code แบบ PHP (เช่น json_last_error()) ใน PostgreSQL เราต้องใช้ฟังก์ชันที่ช่วยในการทำความสะอาด (Sanitize) และควบคุมการแปลงข้อมูลก่อนที่จะทำการ jsonb_build_object หรือ jsonb_agg

ตัวอย่างการจัดการข้อมูลที่อาจก่อให้เกิดปัญหา

สมมติว่าเรามีตาราง product_data ที่มีคอลัมน์ price ซึ่งอาจมีค่า NULL หรือค่าที่ไม่ถูกต้อง:

SQL

-- 1. สร้างตารางตัวอย่างที่มีปัญหาข้อมูล (NULL หรือค่าที่ไม่ต้องการ)
CREATE TABLE product_data (
    product_id INT,
    name VARCHAR(100),
    price NUMERIC
);
INSERT INTO product_data (product_id, name, price) VALUES (1, 'Apple', 1.00);
INSERT INTO product_data (product_id, name, price) VALUES (2, 'Banana', NULL);
INSERT INTO product_data (product_id, name, price) VALUES (3, 'Orange', 5.50);
-- 2. การใช้ COALESCE เพื่อจัดการค่า NULL ก่อนการแปลง JSON
SELECT
    jsonb_build_object(
        'id', product_id,
        'name', name,
        'price', COALESCE(price, 0.00) -- แทนที่ NULL ด้วย 0.00
    ) AS product_json
FROM product_data;

คำอธิบาย: การใช้ฟังก์ชัน COALESCE(price, 0.00) เป็นเทคนิคสำคัญในการป้องกันไม่ให้ค่า NULL เข้าไปอยู่ในโครงสร้าง JSON ซึ่งเป็นสาเหตุหลักที่ทำให้การ Encode ล้มเหลว

บทสรุป (Conclusion)

การแก้ไขปัญหา JSON Encoding Failure ไม่ได้อยู่ที่การแก้ไข Syntax ของ JSON แต่คือการทำความสะอาดข้อมูล (Data Cleansing) ในระดับฐานข้อมูลก่อนการส่งออก (Export) เสมอ ใน PostgreSQL การใช้ฟังก์ชันอย่าง COALESCE(), TRIM(), หรือการใช้ CASE WHEN เพื่อตรวจสอบและจัดการกับค่า NULL, INF หรือข้อมูลผิดรูปแบบก่อนการเรียกใช้ jsonb_build_object จะช่วยให้มั่นใจได้ว่าข้อมูลที่ถูกส่งออกไปมีโครงสร้างที่สมบูรณ์และสามารถนำไปใช้งานในระบบอื่นได้อย่างราบรื่น