【问题标题】:jQuery, AJAX, JSONP: how to actually send an array even if it's empty?jQuery、AJAX、JSONP:即使数组为空,如何实际发送数组?
【发布时间】:2012-03-12 22:48:40
【问题描述】:

我已经阅读了这些问题,但没有一个能满足我的需要:

(最新的说只是添加硬编码引号,即[''],但我不能这样做,我正在调用一个返回数组的函数)

这是我的代码(注意问题出在空数组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(...)

所以这显然意味着当有一个空的 Array() 被发送时,它会被忽略,并且它不会被添加到 POST 变量中

我错过了什么吗?

PS:我的 jQuery 版本来自最新的 google CDN,即:

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

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

我希望发送数组,即使它是空的(= 发送 [])! 有什么解决办法吗?任何想法?我已经尝试添加此选项traditional: true,但没有成功。

【问题讨论】:

  • 你有没有想过发送一个包含数组长度的单独变量?当长度为零时,数组为空。您可以使用此检查,而不是尝试解释帖子中缺少的数组变量。
  • @FelixKling 你是对的,这给出了相同(异常)的结果。

标签: javascript jquery json


【解决方案1】:

问题是你不能真正发送空数组。您是否尝试过手动发送一个空数组?该 uri 看起来如何(注意与 POST 的推理相同)?

/path?arr[]

这将导致像这样的 $_GET:

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

这不是一个真正的空数组,是吗?它是一个包含单个空字符串元素的数组。所以 jQuery 所做的,我同意这是处理它的正确方法,就是不发送任何东西。

这实际上非常简单,您可以在服务器上进行检查。只需添加一个额外的检查参数是否存在,即:

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

【讨论】:

  • 那么,在您看来,这是正常行为吗?我的意思是,也许它听起来与 PHP 中的 GET / POST 原则保持“同质”,但是,即使它保持“同质”,从“理性”的角度来看,这也是不正常的。
  • 所以我要做的是:如果参数不存在,我只是将它设置为一个空数组,最终的结果是它清空了实际的数组。因此,如果黑客尝试不带参数的wget,篮子将被清空,而(我认为)它应该返回错误。
  • 我不明白你的意思..如果参数必须存在,我们为什么要讨论这个问题?不设置空数组,不设置参数返回错误页面?
  • 这是在用户点击图片时的事件,在 JavaScript 中,从购物篮中删除一些东西。如果篮子是空的,仍然将“空篮子”作为 POST 发送。
  • 你应该检查 'array_key_exists('tab', $_POST)' 因为即使 $_POST['tab'] = null;' then isset` 仍然会返回 false
【解决方案2】:

试试

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/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 2021-03-14
    相关资源
    最近更新 更多