2012-01-24 22 views
8

Przechowuję dane JSON w tabeli MySQL za pomocą poniższego kodu. Działa dobrze, jeśli JSON jest krótki, ale ulega przerwaniu na dłuższy tekst. "Field_json" to LONGTEXT.Jak przechowywać ciąg JSON w MySQL db

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

Błąd Dostaję jest:

Nieprawidłowe zapytania: Masz błąd w składni SQL; sprawdź instrukcję , która odpowiada twojej wersji serwera MySQL dla właściwej składni do użyj w pobliżu 'G ' "," username ":" C0WB0Y "," lastName ":" "," id ": 31874363}, {" pathToPhoto „:” 22960/fot” na linii 2

+3

Proszę, proszę, rozważ użycie [przygotowanych wyciągów] (http://php.net/manual/en/pdo.prepared-statements.php). Cóż, tylko jeśli wolisz, aby twoja strona nie była hackowana ... – cheeken

+3

Podobnie jak węzeł boczny, jeśli przechowujesz JSON w tabeli mysql, może powinieneś rozważyć użycie bazy danych, która lepiej nadaje się do przechowywania takich danych, jak CouchDB, MongoDB , itp. – klaustopher

+0

dobry punkt. To jest tylko dla zadania importowania, w którym chcę zapisać json w przypadku, gdy będę musiał przetworzyć to ponownie – MotoTribe

Odpowiedz

18

Wpisz miejsce posiadaczy inaczej jesteś podatna na SQL injection: http://php.net/manual/en/mysqli.quickstart.prepared-statements.php

przeciwnym razie, oto szybkie ustalenie: 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); 

EDYTOWANIE

Proszę używać PDO (http://www.php.net/manual/en/book.pdo.php). Rozszerzenie mysql zostało wycofane z wersji 5.5

+0

Injection SQL możliwe z '$ userid'. Możesz użyć '(int) $ userid' zamiast mysql_real_escape_string. –

+1

Pytanie nie określa typu danych dla pola id, ale w systemach, nad którymi pracowałem, identyfikator użytkownika jest uuid, a nie int. –

3

Musisz uciec cytaty w ciąg JSON - w przeciwnym razie wypowiedzenia zapytania SQL powodując wyjątkiem masz.

3

Ucieczka ciąg 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

w twoim przykładzie, $ userid może spowodować iniekcję SQL. –

+1

Może, ale nie tylko nie wiemy, skąd pochodzi "$ userid", ale także nie jest źródłem problemu z OP. – nickb

+0

Podczas gdy nie jest to problem z OP, podany przykład po cichu pozostawia potencjalny problem z zabezpieczeniami. –

2

spróbować to

$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 możliwe z $ userid –

+4

Jaki jest sens "sprintf" tutaj? – jlb

Powiązane problemy