2012-02-22 16 views
23

Ho già letto queste domande, ma nessuno di loro risposta alla mia necessità:jQuery, AJAX, JSONP: come inviare effettivamente un array anche se è vuoto?

(l'ultimo uno ha detto Just Add quotazioni hard-coded cioè [''] ma non posso farlo, sto chiamando una funzione che restituisce una matrice)

Quindi, ecco il mio codice (si noti che il problema sta alla matrice vuota 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'); 
     } 
    } 
    }); 
} 

semplice eh? Ecco il mio codice PHP:

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

Ed ecco il risultato:

_POST=array (
) 
jQuery1710713708313414827_1329923973282(...) 

Se cambio l'Array vuoto da un non-vuoto, vale a dire:

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

Il risultato è:

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

Quindi questo significa chiaramente che quando viene inviato un array vuoto(), viene ignorato e non viene aggiunto alle variabili POST.

Mi manca qualcosa?

PS: la mia versione jQuery è dalla più recente di Google CDN cioè:

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

e

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

voglio la matrice da inviare, anche se è vuoto (= invia [])! Qualche soluzione? Qualche idea? Ho già provato ad aggiungere questa opzione traditional: true senza successo.

+3

hai pensato su sendin g una variabile separata contenente la lunghezza dell'array? Quando la lunghezza è zero, la matrice è vuota. È possibile utilizzare questo controllo piuttosto che cercare di tenere conto della variabile di array mancante nel post. – tvanfosson

+0

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

+0

@Vytautas: È lo stesso. –

risposta

17

Il problema è che non è possibile inviare array vuoti. Hai provato a inviare manualmente un array vuoto? Come sarebbe quel look uri (notare che è lo stesso ragionamento per POST)?

/path?arr[] 

questo si tradurrebbe in un $ _GET come questo:

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

che non è proprio un array vuoto, è vero? È un array con un singolo elemento di una stringa vuota. Quindi, cosa fa jQuery, e sono d'accordo che questo è il modo corretto di gestirlo, è quello di non inviare nulla.

Questo è davvero molto semplice da controllare sul server. Basta aggiungere un controllo in più se il parametro esiste o no, vale a dire:

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

Quindi, dal tuo punto di vista, questo è un comportamento normale? Voglio dire, forse sembra che rimanga "omogeneo" con i principi GET/POST in Php, ma, anche se rimane "omogeneo", questo non è normale da un punto di vista "razionale". –

+2

Quindi quello che faccio è: se il parametro non è presente, l'ho semplicemente impostato come un array vuoto, e il risultato finale è che svuota l'array attuale. Quindi, se un hacker prova un 'wget' senza parametri, il cestino verrà svuotato, mentre (secondo me) dovrebbe restituire un errore. –

+1

Non capisco il tuo punto .. se il parametro deve essere presente, perché stiamo avendo questa discussione? Invece di impostare un array vuoto, restituire una pagina di errore se il parametro non è impostato? – PatrikAkerstrand

0

Prova

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/

Problemi correlati