การเก็บ JSON ใน MySQL ด้วย PHP
--
บล็อกนี้จะมาพูดถึงการ logging ลงใน Mysql นะครับแต่ว่า log ไม่ใช่ text ธรรมดาแต่มันจะเป็น JSON ซึ่งถ้าพูดถึง JSON แล้วถือว่าเป็น format ที่กลายเป็นมาตรฐานในการรับ-ส่งข้อมูลในปัจจุบันและน่าจะรองรับเกือบทุกภาษาแล้วตอนนี้
Mysql ก็ไม่น้อยหน้าเช่นกันเพราะตั้งแต่ MySQL 5.7.8 ได้ support native JSON แล้วหล่ะนายจ๋า
As of MySQL 5.7.8, MySQL supports a native
JSON
data type defined by RFC 7159 that enables efficient access to data in JSON (JavaScript Object Notation) documents. TheJSON
data type provides these advantages over storing JSON-format strings in a string column:
และประสิทธิภาพของมันก็น่าติดตามเหมือนกันครับ (ขอขอบคุณคุณพี่โจที่นำมาให้ดูด้วยครับ)
ถ้าหากต้องการรายละเอียดเพิ่มเติมสามารถเข้าไปในลิงค์นี้ได้ครับ
เข้าเรื่องกันดีกว่า
ตี๊ต่างว่าเรามี PHP setup ไว้แล้วนะครับและมี MySQL ติดตั้งไว้อยู่แล้วนะครับซึ่งเวอร์ชันที่ผมใช้ทดสอบจะเป็น
- PHP 7.0.6
- MySQL 5.7.19
ขั้นแรกสร้างตารางขึ้นมาก่อนครับและเลือกตารางนั้น
mysql> CREATE DATABASE json_test;
Query OK, 1 row affected (0.00 sec)mysql> USE json_test;
Database changed
หลังจากนั้นสร้าง table ขึ้นมา
mysql> CREATE TABLE users (data JSON); -- สร้าง field ชื่อ data มี type เป็น JSON
Query OK, 0 rows affected (0.01 sec)mysql> SHOW TABLES;
+---------------------+
| Tables_in_json_test |
+---------------------+
| users |
+---------------------+
1 row in set (0.00 sec)mysql> DESCRIBE users;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| data | json | YES | | NULL | |
+-------+------+------+-----+---------+-------+
1 row in set (0.00 sec)
ลอง insert ด้วย PHP ดู
ถ้าลอง run script แล้วจะได้ข้อมูลใน table แบบนี้ครับ
การแปลง JSON จาก MySQL มาเป็นค่าที่สามารถใช้งานได้
ถ้าใน PHP จะใช้ function json_decode ในการแปลงกลับมาเป็น Object ครับเช่น
ในที่นี้การเข้าถึง $user
จะใช้การ access class member แบบนี้เช่น
$user->firstname; // Mungmana
$user->lastname; // Mana
แต่ถ้าเราใส่ parameter ลำดับที่ 2 ของฟังก์ชัน json_decode เป็น true เราก็จะได้ array มาหนึ่งตัวแบบสวยงาม
$user = json_decode($row['data'], true);
// Array ( [lastname] => Mungmana [firstname] => Mana )
และการเข้าถึงก็จะเป็นการเข้าถึงแบบ array ธรรมดาเช่น
$user['firstname'];
$user['lastname'];
จะเห็นได้ว่าชีวิตง่ายขึ้นเยอะเลยครับและลองไปดูโค้ดอ่านง่าย ๆ กัน