2012-01-24 8 views
8

Sto memorizzando i dati JSON in una tabella MySQL usando il codice qui sotto. Funziona bene se il JSON è breve ma si interrompe per un testo più lungo. "Field_json" è un LONGTEXT.Come memorizzare la stringa JSON in MySQL db

$sql = sprintf("UPDATE mytable 
    SET field_json = '$json_string' 
    WHERE id = $userid"); 
$result = mysql_query($sql); 

L'errore che sto ottenendo è:

Query non valida: Hai un errore nella sintassi SQL; controllare il manuale corrispondente alla versione del server MySQL per la sintassi corretta su da utilizzare vicino a "G " "," nomeutente ":" C0WB0Y "," lastName ":" "," id ": 31874363}, {" pathToPhoto ":" 22960/phot' alla linea 2

+3

Per favore, per favore, considera di utilizzare [istruzioni preparate] (http://php.net/manual/en/pdo.prepared-statements.php). Beh, solo se preferisci che il tuo sito non venga violato ... – cheeken

+3

Proprio come un nodo laterale, se stai memorizzando JSON in una tabella mysql, forse dovresti prendere in considerazione l'uso di un database che è più adatto per archiviare dati come CouchDB, MongoDB , ecc. – klaustopher

+0

buon punto. Questo è solo per un lavoro di importazione in cui voglio salvare il json nel caso in cui devo rielaborarlo nello – MotoTribe

risposta

18

Utilizzare i titolari di posto altrimenti si è soggetti ad SQL injection: http://php.net/manual/en/mysqli.quickstart.prepared-statements.php

In caso contrario, ecco una soluzione rapida: http://php.net/manual/en/function.mysql-real-escape-string.php

$sql = sprintf(
     "UPDATE mytable SET field_json = '%s' WHERE id = '%s'", 
     mysql_real_escape_string($json_string), 
     mysql_real_escape_string($userid) 
); 
$result = mysql_query($sql); 

MODIFICA

Utilizzare PDO (http://www.php.net/manual/en/book.pdo.php). L'estensione mysql è obsoleta dal 5.5

+0

Iniezione SQL possibile con '$ userid'. Puoi usare '(int) $ userid' invece di mysql_real_escape_string. –

+1

La domanda non specifica il tipo di dati per il campo id, ma nei sistemi su cui ho lavorato, l'id utente è un uuid, non un int. –

3

Hai bisogno di fuggire le virgolette nella stringa JSON - altrimenti terminare l'SQL-Query conseguente l'eccezione che hai.

3

escape della stringa JSON:

$json_string = mysql_real_escape_string($json_string); 

$sql = sprintf("UPDATE mytable 
    SET field_json = '$json_string' 
    WHERE id = $userid"); 
$result = mysql_query($sql); 
+0

nell'esempio, $ userid potrebbe causare un'iniezione SQL. –

+1

Potrebbe, ma non solo non sappiamo da dove provenga '$ userid', ma non è la fonte del problema degli OP. – nickb

+0

Sebbene non sia un problema OP, l'esempio fornito lascia in sospeso un potenziale problema di sicurezza. –

2

provare questo

$json_string = mysql_real_escape_string($json_string); 
    $sql = sprintf("UPDATE mytable 
    SET field_json = '$json_string' 
    WHERE id = $userid"); 
    $result = mysql_query($sql); 
+0

Iniezione SQL possibile con $ userid –

+4

Qual è il punto di 'sprintf' qui? – jlb

Problemi correlati