2012-02-22 8 views
23

私はすでにそれらの質問を読んだが、それらのどれも私のニーズに答えていない。(最新のものがちょうど追加した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(...) 

Soこれは、送信される空のArray()があるときは無視され、にはが追加されないことを意味します。

何か不足していますか?

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成功なし。

+3

を試してみて、あなたが考えていますsendinについてg配列の長さを含む別の変数?長さがゼロの場合、配列は空です。このチェックは、ポストに欠けている配列変数を考慮する代わりに使用できます。 – tvanfosson

+0

'data:{'tab':[]}、' – Vytautas

+0

@Vytautas:それは同じです。 –

答えて

17

問題は、本当に空の配列を送信できないということです。空の配列を手動で送信しようとしましたか?そのuriはどのように見えますか(POSTの理由は同じです)。

/path?arr[] 

これは、このような$ _GETのような結果になります。それは

本当に空の配列ではありません
array (
'arr' => array (
    0 => '' 
) 
) 

、ありますか?これは、空の文字列の単一の要素を持つ配列です。だからjQueryは何をしているのですか?これが正しい処理方法だと私は同意します。何も送信しないことです。

これは実際にはサーバーをチェックするのが本当に簡単です。ただ、すなわち、パラメータが存在するか否かの余分なチェックを追加します。

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

あなたの視点から見ると、これは正常な動作ですか?私は、PhpのGET/POSTの原則で "同質"のままであるように聞こえるかもしれませんが、 "同質"のままであっても、 "合理的"な観点からは正常ではありません。 –

+2

私がしていることは:paramが存在しない場合、単に空の配列として設定し、最終的な結果は実際の配列を空にすることです。だから、ハッカーがパラメタなしで 'wget'を試みると、バスケットは空になりますが、(私の意見では)それはエラーを返します。 –

+1

私はあなたのポイントを理解していません..パラメータが存在する必要がある場合、なぜこの議論がありますか?空の配列を設定する代わりに、パラメータが設定されていない場合はエラーページを返します。 – PatrikAkerstrand

0

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/

関連する問題