Подтвердить что ты не робот

JQuery, AJAX, JSONP: как отправить массив, даже если он пуст?

Я уже прочитал эти вопросы, но никто из них не ответил на мои потребности:

(последний сказал, что просто добавьте закодированные кавычки, т.е. [''], но я не могу этого сделать, я вызываю функцию, возвращающую массив)

Итак, вот мой код (обратите внимание, что проблема кроется в пустом массиве 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');
      }   
    }   
  }); 
}

Простой а? Здесь мой код Php:

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

И вот результат:

_POST=array (
)
jQuery1710713708313414827_1329923973282(...)

Если я изменю пустой массив на непустую, то есть:

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

Результат:

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

Таким образом, это явно означает, что при отправке пустого массива() он игнорируется и не добавляется к переменным POST.

Я что-то пропустил?

PS: моя версия jQuery - из последней версии CDN i.e.:

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

и

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

Я хочу, чтобы массив отправлялся, даже если он пуст (= send [])! Любое решение? Есть идеи? Я уже пытался добавить эту опцию traditional: true без успеха.

4b9b3361

Ответ 1

Проблема в том, что вы не можете отправить пустой массив. Вы пытались отправить пустой массив вручную? Как бы выглядел этот uri (обратите внимание, что это то же самое для POST)?

/path?arr[]

Это приведет к $_GET следующим образом:

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

Это не пустой массив, не так ли? Это массив с одним элементом пустой строки. Итак, что делает jQuery, и я бы согласился с тем, что это правильный способ обращения с ним, вовсе не отправлять ничего.

Это действительно очень просто проверить на сервере. Просто добавьте дополнительную проверку, существует ли параметр или нет: i.e:

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

Ответ 2

Try

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/