2012-02-22 17 views
23

Tôi đã đọc những câu hỏi nhưng không ai trong số họ trả lời cho nhu cầu của tôi:jQuery, AJAX, JSONP: làm thế nào để thực sự gửi một mảng ngay cả khi nó trống?

(mới nhất ai nói chỉ cần thêm các dấu ngoặc đơn được mã hoá cứng tức là [''] nhưng tôi không thể làm điều này, tôi gọi một hàm trả về một mảng)

vì vậy đây là mã của tôi (lưu ý rằng vấn đề nằm ở mảng trống new Array()):

function AjaxSend() { 
    $.ajax({ 
    url: '/json/myurl/', 
    type: 'POST', 
    dataType: 'jsonp', 
    data : { 'tab':new Array() }, 
    context: this, 
    success: function (data) { 
     if (data.success) { 
     console.log('ok'); 
     } 
     else { 
     console.log('error'); 
     } 
    } 
    }); 
} 

Simple eh? Đây là mã Php tôi:

echo '_POST='.var_export($_POST,true)."\n"; 

Và đây là kết quả:

_POST=array (
) 
jQuery1710713708313414827_1329923973282(...) 

Nếu tôi thay đổi mảng trống rỗng bởi một tổ chức phi rỗng, ví dụ:

'tab':new Array({ 't':'u' },{ 'v':'w' }) 

Kết quả là:

_POST=array (
    'tab' => 
    array (
    0 => 
    array (
     't' => 'u', 
    ), 
    1 => 
    array (
     'v' => 'w', 
    ), 
), 
) 
jQuery1710640656704781577_1329923761425(...) 

Vì vậy, điều này rõ ràng có nghĩa là khi có một mảng rỗng() trống được gửi đi, nó bị bỏ qua và nó không được thêm vào các biến POST.

Tôi có thiếu gì đó không?

PS: phiên bản jQuery của tôi là từ mới nhất google CDN ví dụ:

http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js

http://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js

Tôi muốn mảng được gửi đi, ngay cả khi nó rỗng (= gửi [])! Bất kỳ giải pháp nào? Bất kỳ ý tưởng? Tôi đã cố gắng thêm tùy chọn này traditional: true mà không thành công.

+3

bạn đã nghĩ về sendin g một biến riêng biệt có chứa chiều dài của mảng? Khi độ dài bằng không, mảng trống. Bạn có thể sử dụng kiểm tra này thay vì cố gắng tính đến biến mảng bị thiếu trong bài đăng. – tvanfosson

+0

'dữ liệu: {'tab': []},' – Vytautas

+0

@Vytautas: Tương tự. –

Trả lời

17

Vấn đề là bạn không thể gửi mảng trống. Bạn đã thử gửi một mảng trống theo cách thủ công chưa? Làm thế nào mà uri sẽ nhìn (lưu ý rằng đó là cùng một lý do cho POST)?

/path?arr[] 

này sẽ cho kết quả trong một $ _GET như thế này:

array (
'arr' => array (
    0 => '' 
) 
) 

Đó không phải là thực sự là một mảng trống rỗng, phải không? Đó là một mảng với một phần tử duy nhất của một chuỗi rỗng. Vì vậy, những gì jQuery làm, và tôi sẽ đồng ý rằng đây là cách chính xác để xử lý nó, là không gửi bất cứ điều gì cả.

Điều này thực sự rất đơn giản để bạn kiểm tra trên máy chủ. Chỉ cần thêm một kiểm tra thêm liệu tham số tồn tại hay không, ví dụ:

$tabs = array(); 
if(isset($_POST['tab'])) { 
    $tabs = $_POST['tab']; 
} 
+3

Vì vậy, từ quan điểm của bạn, đây là một hành vi bình thường? Tôi có nghĩa là, có thể nó có vẻ như nó vẫn "đồng nhất" với GET/POST nguyên tắc trong Php, nhưng, mặc dù nó vẫn "đồng nhất", đây không phải là bình thường từ một quan điểm "hợp lý". –

+2

Vì vậy, những gì tôi làm là: nếu param không có mặt, tôi chỉ đơn giản là đặt nó như là một mảng trống, và kết quả cuối cùng là nó làm trống mảng thực sự. Vì vậy, nếu một hacker cố gắng một 'wget' không có tham số, giỏ sẽ được dọn sạch, trong khi (đó là ý kiến ​​của tôi) nó sẽ trả về một lỗi. –

+1

Tôi không hiểu điểm của bạn .. nếu tham số HAS có mặt, tại sao chúng ta có cuộc thảo luận này? Thay vì thiết lập một mảng trống, trả về một trang lỗi nếu tham số không được thiết lập? – PatrikAkerstrand

0

Hãy thử

php

<?php 
// `echo.php` 
if (isset($_POST["emptyArray"])) { 
    function arr() { 
    $request = $_POST["emptyArray"]; 
    if(is_array($request) && count($request) === 0) { 
     // do stuff 
     echo $request; 
    }; 
    }; 
    arr(); 
}; 

js

$.post("echo.php", {"emptyArray":[]} 
     , function (data, textStatus, jqxhr) { 
      if (textStatus === "success" && data.length === 0) { 
      // do stuff 
      console.log(data.length === 0 ? new Error("error").message : data); 
      }; 
    }); 

jsfiddle http://jsfiddle.net/guest271314/Lf6GG/

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