J'ai déjà lu ces questions, mais aucune d'entre elles ne répond à mon besoin:
(Le dernier a dit simplement ajouter des citations codées, c'est-à-dire ['']
mais je ne peux pas le faire, j'appelle une fonction qui renvoie une matrice)
Alors voici mon code (notez que le problème réside dans le tableau vide 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? Voici mon code Php:
echo '_POST='.var_export($_POST,true)."\n";
Et voici le résultat:
_POST=array ( ) jQuery1710713708313414827_1329923973282(...)
Si je change le tableau vide par un non-vide, c'est-à-dire:
'tab':new Array({ 't':'u' },{ 'v':'w' })
Le résultat est:
_POST=array ( 'tab' => array ( 0 => array ( 't' => 'u', ), 1 => array ( 'v' => 'w', ), ), ) jQuery1710640656704781577_1329923761425(...)
Donc, cela signifie clairement que lorsqu'il y a un tableau vide () à envoyer, il est ignoré, et il n'est pas ajouté aux variables POST .
Est-ce que je manque quelque chose?
PS: ma version jQuery provient du dernier CDN de google:
Http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js
et
Http://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js
Je veux que le tableau soit envoyé, même s'il est vide (= send []
)! Toute solution? Une idée? J'ai déjà essayé d'ajouter cette option traditional: true
sans succès.
Le problème est que vous ne pouvez pas vraiment envoyer un tableau vide. Avez-vous essayé d'envoyer manuellement un tableau vide? Comment cet aspect uri (notez-vous que c'est le même raisonnement pour POST)?
/path?arr[]
Cela entraînerait un $ _GET comme ceci:
array ( 'arr' => array ( 0 => '' ) )
Ce n'est pas vraiment un tableau vide, n'est-ce pas? C'est un tableau avec un seul élément d'une chaîne vide. Alors, qu'est-ce que jQuery fait, et je suis d'accord pour dire que c'est la bonne façon de le gérer, c'est ne rien envoyer.
C'est vraiment très simple pour vous de vérifier sur le serveur. Ajoutez simplement un contrôle supplémentaire si le paramètre existe ou non, c'est-à-dire:
$tabs = array(); if(isset($_POST['tab'])) { $tabs = $_POST['tab']; }
essayer
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); }; });