2012-01-24 27 views
8

Tôi đang lưu trữ dữ liệu JSON trong bảng MySQL bằng cách sử dụng mã bên dưới. Nó hoạt động tốt nếu JSON là ngắn nhưng phá vỡ cho văn bản dài hơn. "Field_json" là LONGTEXT.Cách lưu trữ chuỗi JSON trong MySQL db

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

Các lỗi tôi nhận được là:

truy vấn không hợp lệ: Bạn có một lỗi trong cú pháp SQL của bạn; kiểm tra hướng dẫn sử dụng tương ứng với phiên bản máy chủ MySQL của bạn cho cú pháp đúng để sử dụng gần 'G ' "," tên người dùng ":" C0WB0Y "," lastName ":" "," id ": 31874363}, {" pathToPhoto ":" 22960/phot ' tại dòng 2

+3

Vui lòng, vui lòng xem xét sử dụng [báo cáo đã chuẩn bị] (http://php.net/manual/en/pdo.prepared-statements.php). Vâng, chỉ khi bạn thích trang web của bạn không bị hack ... – cheeken

+3

Giống như một nút phụ, nếu bạn đang lưu trữ JSON trong bảng mysql, có lẽ bạn nên cân nhắc việc sử dụng cơ sở dữ liệu phù hợp hơn để lưu trữ dữ liệu như CouchDB, MongoDB , v.v. – klaustopher

+0

điểm tốt. Đây là chỉ cho một công việc nhập khẩu, nơi tôi muốn lưu các json trong trường hợp tôi phải xử lý nó một lần nữa – MotoTribe

Trả lời

18

Sử dụng giữ chỗ nếu không bạn rất dễ bị SQL injection: http://php.net/manual/en/mysqli.quickstart.prepared-statements.php

Nếu không, đây là một sửa chữa nhanh chóng: 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

Vui lòng sử dụng PDO (http://www.php.net/manual/en/book.pdo.php). Tiện ích mở rộng mysql đã không được chấp nhận kể từ 5.5

+0

SQL Injection có thể với '$ userid'. Bạn có thể sử dụng '(int) $ userid' thay vì mysql_real_escape_string. –

+1

Câu hỏi không chỉ định loại dữ liệu cho trường id, nhưng trong các hệ thống tôi đã làm việc, id người dùng là uuid, không phải là int. –

3

Bạn cần thoát dấu ngoặc kép trong chuỗi JSON của mình - nếu không chúng sẽ chấm dứt Truy vấn SQL dẫn đến ngoại lệ bạn nhận được.

3

Thoát khỏi chuỗi 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

trong ví dụ của bạn, $ userid có thể gây ra một SQL injection. –

+1

Có thể, nhưng không chỉ chúng ta không biết '$ userid' đến từ đâu, nó cũng không phải là nguồn của vấn đề OP. – nickb

+0

Trong khi không phải vấn đề OP, ví dụ được cung cấp âm thầm để lại một vấn đề bảo mật tiềm ẩn. –

2

thử này

$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

SQL Injection có thể với $ userid –

+4

Điểm của 'sprintf' ở đây là gì? – jlb

Các vấn đề liên quan