2011-12-21 32 views
12

Tôi đang cố gắng nhận và phân tích cú pháp đối tượng JSON được gửi trong yêu cầu POST bằng Codeigniter nhưng tôi không thể "tìm thấy" nó.Đăng bộ điều khiển JSON cho Codeigniter

Đây là mã điều khiển của tôi:

public function parse() { 

    $json = $this->input->post(); 
    $json = stripslashes($json); 
    $json = json_decode($json); 

    print_r($json); 

} 

Đây là đối tượng JSON của tôi:

{"data":"value"} 

Trả lời

2

Hãy thử điều này thay vì

$json = $this->input->post('data'); 
$json = stripslashes($json); 
$json = json_decode($json); 
print_r($json); 

Bạn cần phải vượt qua trong khóa của dữ liệu biến bạn muốn từ mảng bài làm đối số cho post()

+0

Đó đã tiếc là không làm việc, hoặc. Không có gì được hiển thị. –

+0

Công trình này: dữ liệu = {"màu": "màu xanh"} nhưng có ổn không? Sẽ được mát mẻ với một thư viện có thể "chuyển đổi" chúng để tôi có thể sử dụng xác nhận Codeigniter. –

-1

thử

json_decode(array($this->input->post())) 

HOẶC

$tmp[] = (array)json_decode($this->input->post()); 

print_r($tmp); 
+1

$ mảng này-> input-> post() luôn trống. Tôi không thể tìm ra lý do tại sao. –

+0

tôi đã thử điều này quá và nó mang lại cho tôi mảng trống – Uahmed

0

chắc chắn rằng bạn có dữ liệu POST, sử dụng $this->input->post() nó sẽ luôn luôn trở lại trống rỗng, bạn nên đặt vào tên loại đầu vào $this->input->post('name_of_input_text')

0

Bạn có chắc chắn bạn đang POST các dữ liệu và không làm một GET thay thế? Tôi đã gặp vấn đề này sớm hơn hôm nay (đó là cách tôi tìm thấy câu hỏi này) và tôi đã làm một POST nhưng sử dụng JSONP mà dường như được thực hiện với một GET.

CodeIgniter có hàm get_post sẽ nhận dữ liệu từ bất kỳ nơi nào nó xảy ra.

$this->input->get_post_string('data'); 

Tôi hy vọng điều này sẽ giúp bạn.

Bạn có thể thực hiện thủ công như vậy nếu muốn.

function get_post($index = '', $xss_clean = FALSE){ 
    if (! isset($_POST[$index])) 
    { 
     return $this->get($index, $xss_clean); 
    } 
    else 
    { 
     return $this->post($index, $xss_clean); 
    } 
} 
21

Đây là cách chính xác để thực hiện.

$input_data = json_decode(trim(file_get_contents('php://input')), true); 
+0

php: // đầu vào chỉ có thể được đọc một lần, và lớp đầu vào CodeIgniter sẽ đã đọc nó vào thời điểm này. –

+0

Chỉ cần thêm đúng loại nội dung vào tiêu đề yêu cầu của bạn, 'Content-Type: application/json'. Như đã đề cập bởi Chris, Codeigniter đọc đầu vào trước khi phương thức của bạn được gọi. – Shailesh

+0

Bất cứ điều gì bạn guys đang bình luận, họ không có liên quan đến ngày mà tại đó tôi đăng câu trả lời này, đó là chính xác vào ngày tôi đăng. – CMCDragonkai

0

Tôi biết đây là một bài cũ, nhưng đối với những người khác tìm kiếm, điều này có thể hữu ích:

Về phía trình duyệt, tôi có thể tạo gói dữ liệu của tôi sử dụng mã tương tự như mô hình này:

var form_data = { }; 
    $.each($('#mvt_dialog_form').serializeArray(), function() { 
     form_data[this.name] = this.value; 
    }); 

    // add the address data to the payload 
    var result = { 
     form_data: form_data, 
     locations: addressData, 
     selected_location: selectedLocation 
    }; 

    // now wrap it all up with a pretty bow 
    // Seriously, the key:value format is required for codeigniter INPUT class to be able to "see" 
    var movement = { 
     movement_dlg: JSON.stringify(result) 
    }; 

Sau đó tôi chuyển "đăng" lên máy chủ. Trong bộ điều khiển, tôi sau đó sử dụng logic sau:

// Perform XSS filtering 
    $postData = $this->input->post(NULL, TRUE); 
    $result = json_decode($postData['movement_dlg']); 
0

Chỉ cần thêm kiểu nội dung đúng với tiêu đề yêu cầu của bạn

Content-Type: application/json 
3
$post = json_decode($this->security->xss_clean($this->input->raw_input_stream)); 

Khi bạn sử dụng $ this-> Input-> raw_input_stream bạn có thể đọc nó nhiều lần và về cơ bản giống như file_get_contents ('php: // input'). Điều này hoạt động trên CI3. Tôi không biết nếu nó hoạt động trên CI2.

0

Câu trả lời của Firze là chính xác nhưng đây là câu trả lời chi tiết hơn. Tôi không được phép bình luận nên tôi đăng nó như một câu trả lời.

Nó phải làm với CodeIgniter không thể tìm nạp JSON. jQuery thực hiện một số thủ thuật dưới mui xe và chuyển đổi dữ liệu của bạn thành form-data-x, đó là lý do tại sao nó hoạt động khi bạn không chỉ định content type, không mã hóa đối tượng của bạn hoặc các tình huống khác.

Nếu bạn muốn có một tinh khiết JSON giải pháp là sử dụng $this->input->raw_input_stream để lấy JSON của bạn và giải mã nó bằng cách sử php 's json_decode. Đánh dấu vào câu trả lời đầy đủ và mã bên dưới:

Retrieve JSON POST data in CodeIgniter

2

Hãy thử mã này, nó sẽ ra một mảng với tất cả các thông số của bạn.

$this->input->raw_input_stream; 

$input_data = json_decode($this->input->raw_input_stream, true); 

$input_data sẽ trở lại mảng

+0

Cách tiếp cận này hoạt động trên tôi. Cảm ơn – tthreetorch

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