2011-09-29 137 views
5

php如何通過mysql存儲和讀取json數據?php如何通過mysql存儲和讀取json數據?

mysql_query("INSERT INTO text (data) VALUES (json_encode('id' => $uid, 'value' => yes))"); 

那麼,如何更新data值?讀出數據,然後插入一個json_encode和解碼過程,或者只是簡單的方式更新?

[{"id": "1", "value": "yes"}] 

然後插入另一變化[{"id": "1", "value": "yes"},{"id": "2", "value": "yes"}] ...

或者,即使一個很長很長的價值。

[{"id": "1", "value": "yes"},{"id": "2", "value": "yes"}...{"id": "10000", "value": "yes"}]

然後更新一個又一個,改變[{"id": "1", "value": "yes"},{"id": "2", "value": "yes"}...{"id": "10000", "value": "yes"},{"id": "10001", "value": "yes"}]

我想請問一下,如何做到這一點的MySQL查詢處理更加明智和有效的?感謝您提供更多建議。

回答

22

從技術上講,你的方式是錯誤的。 MySQL用於分別存儲每個ID/VALUE。爲了不改變你的代碼,我們會首先看看你的解決方案,但接下來我會解釋一下「更好」的方法。

首先,你需要讓你的JSON作爲一個變量,而不是你的SQL的一部分:

mysql_query("INSERT INTO text (data) VALUES (".mysql_real_escape_string(json_encode('id' => $uid, 'value' => yes)).")");

,而不是

mysql_query("INSERT INTO text (data) VALUES (json_encode('id' => $uid, 'value' => yes))");

這第一部分將允許您在至少改爲將數據正確地導入到mysql中。 我假設你的表有一個ID,你將用它來更新或刪除

當你檢索你的數據時,你可以json_decode $ row ['data']來從行中取回你的數據並與它一起工作。要更新它,只是做:

mysql_query("UPDATE text SET data = "'.mysql_real_escape_string(json_encode($myJsonToBeData)).'" WHERE rowid = '.$myrowid)

現在,以正確的方式來做到這一點:

這樣做將有這些字段到表中正確的做法:ID, JSONID,JSONVALUE和使用SQL來代替:

SELECT * FROM text WHERE id = $rowid INSERT INTO text VALUES(NULL, $jsonid, $jsonvalue) UPDATE text SET jsonid = $jsonid, jsondata = $jsondata

這是非常基本的,但它可以讓你在你的databas任意數量的條目e,使它可搜索,索引,排序,可查詢等...

+7

+1用於觀察OP的請求並顯示正確的方式。 – Herbert

+1

我相信你的第一個代碼示例中有一個額外的單引號 – CervEd

2

您可以通過不將JSON存儲在單個字段中,而是通過創建一個適當的MySQL表格並將JSON對象的屬性名稱作爲字段名稱,來更高效地完成此操作。

在數據庫中存儲數據的文本字符串編碼表示形式完全破壞了首先使用數據庫的要點。

+0

MongoDb使用二進制JSON存儲格式。所以我不得不不同意你的第二點,即將數據存儲在JSON中是一個不好的主意。對於MySQL(和其他sql傳染病),你的觀點是有效的。 –

+1

問題(和我的答案)是關於MySQL的具體問題,並將數據編碼爲JSON字符串。此外,正如你自己所說的,MongoDb將「JSON」存儲爲二進制對象,而不是JSON字符串,因此在MongoDb中存儲「JSON」不會存儲以字符串形式編碼的數據(這仍然是不好的做法並且會破壞[數據庫規範化](http ://en.wikipedia.org/wiki/Database_normalisation))。 – megaflop

2

是的,但.... WordPress存儲了大量的數據作爲編碼的JSON字符串,如用戶功能。將數組存儲爲一個獨立的數據位不需要對數據庫進行多次讀取,並且可以在一次讀取中獲取大量數據。如果你從來沒有看到需要選擇JSON字符串的各個部分,我不明白爲什麼這樣做是不可接受的。 MySQL也必須這樣認爲,因爲它具有允許在JSON字符串內的各個字段上進行SELECT的功能(如果您願意的話)(請參閱MySQL EXPLAIN關鍵字)。但是我同意,如果你要在一個應該有自己的領域的領域做很多選擇。這完全取決於你將如何使用數據。

+0

WordPress的並不存儲大量的數據作爲JSON字符串,他使用內部序列化/反序列化機制:) –

+0

@Mathieu - 我說這是「編碼JSON」,這意味着使用searialsize/unserialize。看看MySQL中的EXPLAIN關鍵字。 – KoZm0kNoT