2012-01-24 20 views
8

Estoy almacenando datos JSON en una tabla MySQL utilizando el siguiente código. Funciona bien si el JSON es corto pero se rompe para texto más largo. El "field_json" es un LONGTEXT.Cómo almacenar cadena JSON en MySQL db

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

El error que estoy recibiendo es:

consulta no válido: Usted tiene un error en su sintaxis SQL; revise el manual que corresponde a su versión del servidor MySQL para la sintaxis correcta al use cerca de 'G ' "," nombre de usuario ":" C0WB0Y "," lastName ":" "," id ": 31874363}, {" pathToPhoto ":" 22960/phot' en la línea 2

+3

Por favor, considere usar [declaraciones preparadas] (http://php.net/manual/en/pdo.prepared-statements.php). Bueno, solo si prefiere que su sitio no esté pirateado ... – cheeken

+3

Al igual que un nodo lateral, si está almacenando JSON en una tabla mysql, tal vez debería considerar usar una base de datos que sea más adecuada para almacenar datos como CouchDB, MongoDB , etc. – klaustopher

+0

buen punto. Esto es solo para un trabajo de importación donde quiero guardar el json en caso de que tenga que procesarlo de nuevo – MotoTribe

Respuesta

18

Use marcadores de posición de lo contrario son susceptibles a la inyección de SQL: http://php.net/manual/en/mysqli.quickstart.prepared-statements.php

De lo contrario, he aquí una solución rápida: 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); 

EDIT

Utilice la DOP (http://www.php.net/manual/en/book.pdo.php). La extensión mysql ha quedado obsoleta a partir de 5.5

+0

Inyección de SQL posible con '$ userid'. Puede usar '(int) $ userid' en lugar de mysql_real_escape_string. –

+1

La pregunta no especifica el tipo de datos para el campo de id, pero en los sistemas en los que he trabajado, el id de usuario es un uuid, no un int. –

3

Es necesario para escapar de las comillas en la cadena de JSON - de lo contrario, terminar la consulta SQL que resulta en la excepción que tienes.

3

Escapar de la cadena 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

en su ejemplo, $ userid podría causar una inyección SQL. –

+1

Podría, pero no solo no sabemos de dónde viene '$ userid', tampoco es el origen del problema de OPs. – nickb

+0

Si bien no es un problema de OP, el ejemplo proporcionado silenciosamente deja un posible problema de seguridad. –

2

probar este

$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

Inyección SQL posible con $ userid –

+4

¿Cuál es el punto de 'sprintf' aquí? – jlb