2012-02-22 11 views
23

ya he leído esas preguntas, pero ninguno de ellos respuesta a mi necesidad:jQuery, AJAX, JSONP: ¿cómo enviar una matriz, incluso si está vacía?

(la última sólo tiene que añadir uno de dichos citas codificadas, es decir, [''] pero no puedo hacer esto, estoy llamando a una función que devuelve una matriz)

Así que aquí está mi código (tenga en cuenta que el problema radica en la matriz vacía 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? Aquí está mi código PHP:

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

Y aquí está el resultado:

_POST=array (
) 
jQuery1710713708313414827_1329923973282(...) 

Si cambio la Array vacío por un no-vacío, es decir:

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

El resultado es:

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

So esto significa claramente que cuando hay una matriz vacía() que se enviará, se ignorará y no se agregará a las variables POST.

¿Echo de menos algo?

PD: mi versión de jQuery es de la más reciente Google CDN es decir:

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

y

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

Quiero la matriz que se enviará, incluso si está vacío (= envíe [])! ¿Alguna solución? ¿Alguna idea? Ya he intentado agregar esta opción traditional: true sin éxito.

+3

¿Ha pensado sobre enviar g una variable separada que contiene la longitud de la matriz? Cuando la longitud es cero, la matriz está vacía. Puede usar esta comprobación en lugar de tratar de dar cuenta de la variable de matriz faltante en la publicación. – tvanfosson

+0

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

+0

@Vytautas: Es lo mismo. –

Respuesta

17

El problema es que realmente no se puede enviar una matriz vacía. ¿Has intentado enviar una matriz vacía manualmente? ¿Cómo se vería esa uri (tenga en cuenta que es el mismo razonamiento para POST)?

/path?arr[] 

Esto se traduciría en un $ _GET así:

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

Eso no es realmente una matriz vacía, ¿verdad? Es una matriz con un solo elemento de una cadena vacía. Entonces, qué hace jQuery, y yo estaría de acuerdo en que esta es la forma correcta de manejarlo, es no enviar nada en absoluto.

Esto es realmente simple para que pueda verificar en el servidor. Sólo tiene que añadir un control adicional si el parámetro existe o no, es decir:

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

Entonces, desde su punto de vista, ¿este es un comportamiento normal? Quiero decir, tal vez suene como que se mantiene "homogéneo" con los principios GET/POST en Php, pero, a pesar de que se mantiene "homogéneo", esto no es normal desde un punto de vista "racional". –

+2

Entonces, lo que hago es: si el parámetro no está presente, simplemente lo configuro como una matriz vacía, y el resultado final es que vacía la matriz real. Entonces, si un pirata informático intenta un 'wget' sin param, la cesta se vaciará, mientras que (en mi opinión) debería devolver un error. –

+1

No entiendo su punto ... si el parámetro TIENE que estar presente, ¿por qué estamos teniendo esta discusión? En lugar de establecer una matriz vacía, ¿devuelve una página de error si el parámetro no está configurado? – PatrikAkerstrand

0

Trate

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/

Cuestiones relacionadas