2011-09-29 10 views
5

php comment stocker et lire des données json via mysql?php comment stocker et lire des données json via mysql?

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

alors, comment mettre à jour data valeur? lire les données, puis l'insérer avec un processus json_encode et décoder, ou seulement une mise à jour facile?

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

puis insérez une autre modification [{"id": "1", "value": "yes"},{"id": "2", "value": "yes"}] ...

Ou même si une longue valeur à long.

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

puis mettre à jour l'autre, changer pour [{"id": "1", "value": "yes"},{"id": "2", "value": "yes"}...{"id": "10000", "value": "yes"},{"id": "10001", "value": "yes"}]

Je veux demander, comment faire le traitement des requêtes MySQL plus sage et efficace? Merci pour plus de suggestion.

Répondre

22

Techniquement, vous allez dans le mauvais sens avec ça. MySQL est utilisé pour stocker chacun de vos ID/VALUE séparément. Par souci de ne pas changer votre code, nous examinerons d'abord votre solution, mais ensuite je vous expliquerai la "meilleure" façon de le faire.

Tout d'abord, vous devez faire votre JSON comme une variable, ne fait pas partie de votre SQL:

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

au lieu de

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

Cette première partie vous permettra au moins à la place les données correctement dans mysql. Je suppose votre table a une carte d'identité et que vous allez utiliser pour mettre à jour ou supprimer

Lorsque vous récupérez vos données, vous pouvez json_decode la ligne de $ [ « données »] pour récupérer vos données à partir de la ligne et travaille avec. Pour le mettre à jour, il suffit de faire:

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

Maintenant, pour la bonne façon de le faire:

La bonne façon de le faire serait d'avoir ces champs dans votre table: ID, JSONID, JsonValue et utiliser SQL à la place:

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

C'est assez basique, mais il vous permettra d'avoir un certain nombre d'entrées dans votre databas e qui en font des recherches, indexé, sortable, interrogeable, etc ...

+7

+1 pour observer la demande OP et montrer la bonne manière. – Herbert

+1

Je crois qu'il y a une citation simple supplémentaire dans votre premier exemple de code – CervEd

2

Vous pouvez le faire plus efficacement en ne stockant pas JSON dans un seul champ mais en créant une table MySQL appropriée avec les noms de propriété de l'objet JSON comme noms de champs.

Le stockage d'une représentation codée en chaîne de texte de vos données dans une base de données détruit complètement le point d'utilisation des bases de données.

+0

MongoDb utilise un format de stockage binaire JSON. Je ne suis donc pas d'accord avec votre deuxième point: stocker des données dans JSON est une mauvaise idée. Pour MySQL (et autres contagions sql), votre point est valide. –

+1

La question (et ma réponse) est spécifiquement à propos de MySQL, et de stocker des données encodées comme une chaîne JSON. De plus, comme vous l'avez dit, MongoDb stocke "JSON" en tant qu'objets binaires, pas en tant que chaînes JSON, donc stocker "JSON" dans MongoDb ne stocke pas les données encodées comme une chaîne (ce qui est encore une mauvaise pratique). : //en.wikipedia.org/wiki/Database_normalisation)). – megaflop

2

Oui, mais .... magasins WordPress beaucoup de ses données sous forme de chaînes JSON codées, telles que les capacités de l'utilisateur.Stocker un tableau sous la forme d'un bit discret de données vous évite d'avoir à faire plusieurs lectures sur la base de données et vous permet d'obtenir beaucoup de données sur une lecture. Si vous ne voyez jamais le besoin de sélectionner les parties individuelles de la chaîne JSON, je ne vois pas pourquoi il n'est pas acceptable de le faire de cette façon. MySQL doit le penser aussi car il a des fonctions pour permettre un SELECT sur les champs individuels dans une chaîne JSON si vous le désirez (voir le mot clé MySQL EXPLAIN). Mais je suis d'accord si vous deviez faire beaucoup de sélections sur un terrain, il devrait avoir l'un des siens. Tout dépend de la façon dont vous allez utiliser les données.

+0

Wordpress ne stocke pas beaucoup de données en tant que chaînes json, il utilise le mécanisme serialize/unserialize interne :) –

+0

@Mathieu - J'ai dit que c'était "codé JSON" qui signifie utiliser searialize/unserialize. Jetez un oeil au mot-clé EXPLAIN dans MySQL. – KoZm0kNoT

Questions connexes