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查询处理更加明智和高效?感谢您提出更多建议。
答案 0 :(得分:24)
从技术上讲,你的方式是错误的。 MySQL用于单独存储每个ID / VALUE。为了不改变你的代码,我们先看看你的解决方案,然后我将解释“更好”的方法。
首先,您需要将JSON作为变量,而不是SQL的一部分:
mysql_query("INSERT INTO text (data) VALUES (".mysql_real_escape_string(array(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
这是非常基本的,但它允许您在数据库中拥有任意数量的条目,使其可搜索,索引,可排序,可查询等...
答案 1 :(得分:2)
是的但.... WordPress将大量数据存储为编码的JSON字符串,例如用户功能。将数组存储为离散的数据位会消除对数据库的多次读取,并允许您在一次读取时获取大量数据。如果您从未发现需要选择JSON字符串的各个部分,我不明白为什么这样做是不可接受的。 MySQL也必须这么想,因为它具有允许在JSON字符串中的各个字段上使用SELECT的功能(如果你需要的话)(参见MySQL EXPLAIN关键字)。但我确实同意,如果你要在一个应该拥有自己的一个字段上做很多SELECT。这一切都取决于你将如何使用数据。
答案 2 :(得分:1)
您可以通过不将JSON存储在单个字段中,而是通过使用JSON对象的属性名称作为字段名称创建正确的MySQL表来更有效地执行此操作。
将数据的文本字符串编码表示存储在数据库中完全破坏了首先使用数据库的重点。
答案 3 :(得分:0)
假设您想在 MySQL 中将 JSON 字符串存储为 text 或 varchar 数据类型,您可以简单地像这样对 JSON 字符串进行转义:
$object = new stdClass();
$object->key_a = "Value A";
$object->key_b = "Value B";
$storable_json_string = trim( addslashes( json_encode( $object ) ) );
// `$storable_json_string` contains an ugly invalid JSON
mysqli_query( "INSERT INTO table_a (column_a) VALUES ('{$storable_json_string}')" );
// read from the database
$result = mysqli_query( "SELECT column_a FROM table_a" );
$row = $result->fetch_object();
// makeover the ugly invalid JSON into a machine readable valid JSON
$valid_json_string = substr( stripslashes( $row->column_a ), 1, -1 );
// makes the JSON as a PHP object
$readable_json_object = json_decode( $valid_json_string );
echo $readable_json_object->key_a; // Value A
这可能不是那么安全,但至少这些应该会给你一些垫脚石。