2012-01-24 3 views
8

Je stocke des données JSON dans une table MySQL en utilisant le code ci-dessous. Cela fonctionne bien si le JSON est court mais se casse pour du texte plus long. Le "field_json" est un LONGTEXT.Comment stocker une chaîne JSON dans MySQL db

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

L'erreur que je reçois est:

requête non valide: Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utilisez près de 'G ' "," nom d'utilisateur ":" C0WB0Y "," lastName ":" "," id ": 31874363}, {" pathToPhoto « : » 22960/Phot » à la ligne 2

+3

S'il vous plaît, s'il vous plaît, s'il vous plaît envisager d'utiliser [statements] (http://php.net/manual/fr/pdo.prepared-statements.php). Eh bien, seulement si vous préférez que votre site ne soit pas piraté ... – cheeken

+3

Tout comme un nœud secondaire, si vous stockez JSON dans une table mysql, vous devriez peut-être envisager d'utiliser une base de données mieux adaptée pour stocker des données telles que CouchDB, MongoDB , etc – klaustopher

+0

bon point. Ceci est juste pour un travail d'importation où je veux enregistrer le json au cas où je dois le traiter à nouveau – MotoTribe

Répondre

18

Utilisez des espaces réservés sinon vous êtes sensibles à l'injection SQL: http://php.net/manual/en/mysqli.quickstart.prepared-statements.php

Sinon, voici une solution rapide: 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

Veuillez utiliser PDO (http://www.php.net/manual/en/book.pdo.php). L'extension mysql a été abandonnée à partir de 5,5

+0

SQL Injection possible avec '$ userid'. Vous pouvez utiliser '(int) $ userid' à la place de mysql_real_escape_string. –

+1

La question ne spécifie pas le type de données pour le champ id, mais dans les systèmes sur lesquels j'ai travaillé, l'ID utilisateur est un uuid, pas un int. –

3

vous devez échapper aux citations dans votre chaîne JSON - sinon ils mettre fin à la requête SQL résultant à l'exception que vous avez obtenu.

3

Escape the chaîne 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

dans votre exemple, $ userid pourrait provoquer une injection SQL. –

+1

Il pourrait, mais non seulement nous ne savons pas d'où vient le '$ userid', ce n'est pas non plus la source du problème d'OP. – nickb

+0

Bien qu'il ne s'agisse pas d'un problème OP, l'exemple fourni laisse silencieusement un problème de sécurité potentiel. –

2

essayer cette

$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

Injection SQL possible avec $ userid –

+4

Quel est le point de 'sprintf' ici? – jlb

Questions connexes