2011-09-29 4 views
5

php come memorizzare e leggere dati json via mysql?php come memorizzare e leggere dati json via mysql?

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

quindi, come aggiornare il valore data? leggere i dati, quindi inserirli con un processo json_encode e decodifica o solo un aggiornamento semplice?

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

quindi inserire un altro cambiamento di [{"id": "1", "value": "yes"},{"id": "2", "value": "yes"}] ...

O anche se molto valore a lungo.

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

quindi aggiornare un altro, cambiare [{"id": "1", "value": "yes"},{"id": "2", "value": "yes"}...{"id": "10000", "value": "yes"},{"id": "10001", "value": "yes"}]

voglio chiedere, come fare questo elaborazione delle query mysql più saggia ed efficiente? Grazie per ulteriori suggerimenti.

risposta

22

Tecnicamente, stai andando nella direzione sbagliata. MySQL viene utilizzato per memorizzare separatamente ciascun ID/VALORE. Per motivi di NON modifica del codice, esamineremo prima la soluzione, ma poi spiegherò il modo "migliore" per farlo.

In primo luogo, è necessario per rendere il vostro JSON come una variabile, non fa parte del vostro SQL:

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

invece di

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

Questa prima parte vi permetterà di a meno invece i dati correttamente in mysql. sto supponendo che il tavolo ha un ID e che verrà utilizzato per aggiornare o cancellare

Quando si recuperano i dati, è possibile json_decode il $ row [ 'dati'] per ottenere i vostri dati dalla riga e lavorare con esso. Per aggiornarlo, basta fare:

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

Ora, per il modo giusto per fare questo:

Il modo giusto per farlo sarebbe quello di avere questi campi nella vostra tabella: ID, JSONID, JSONVALUE e utilizzare questo SQL invece:

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

questo è piuttosto semplice, ma vi permetterà di avere un numero qualsiasi di voci nella databas e che lo rendono ricercabile, indicizzato, ordinabile, interrogabile, ecc ...

+7

+1 per osservare la richiesta dell'OP E mostrare la strada giusta. – Herbert

+1

Credo ci sia una citazione singola extra nel tuo primo esempio di codice – CervEd

2

È possibile farlo in modo più efficiente NON memorizzando JSON in un singolo campo ma creando una tabella MySQL corretta con i nomi di proprietà dell'oggetto JSON come nomi di campi.

Memorizzare una rappresentazione codificata di stringhe di testo dei dati in un database distrugge completamente il punto di utilizzo dei database in primo luogo.

+0

MongoDb utilizza un formato di archiviazione JSON binario. Quindi non sarei d'accordo con il secondo punto che l'archiviazione dei dati in JSON è una cattiva idea. Per MySQL (e altri contesti di sql), il tuo punto è valido. –

+1

La domanda (e la mia risposta) riguarda specificamente MySQL e memorizza i dati codificati come una stringa JSON. Inoltre, come hai detto tu stesso, MongoDb memorizza "JSON" come oggetti binari, non come stringhe JSON, quindi la memorizzazione di "JSON" in MongoDb NON memorizza i dati codificati come una stringa (che è ancora pratica scorretta e interruzioni [normalizzazione del database] (http : //en.wikipedia.org/wiki/Database_normalisation)). – megaflop

2

Sì, ma .... WordPress memorizza molti dei suoi dati come stringhe JSON codificate, come le capacità dell'utente.La memorizzazione di un array come un discreto bit di dati comporta la rimozione di più letture nel database e consente di ottenere molti dati su una sola lettura. Se non si vede mai la necessità di SELEZIONARE le singole parti della stringa JSON, non vedo perché non sia accettabile farlo in questo modo. MySQL deve pensarlo anche perché ha le funzioni per consentire una SELEZIONE sui singoli campi all'interno di una stringa JSON se lo si desidera (consultare la parola chiave MySQL EXPLAIN). Ma sono d'accordo sul fatto che stiate per fare un sacco di SELECT in un campo che dovrebbe avere uno dei suoi. Tutto dipende da come userete i dati.

+0

Wordpress non memorizza molti dati come stringhe json, lui usa il meccanismo interno serialize/unserialize :) –

+0

@ Mathieu - Ho detto che era "JSON codificato" che significa usando searialize/unserialize. Dai un'occhiata alla parola chiave EXPLAIN in MySQL. – KoZm0kNoT