2011-09-29 48 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