web-dev-qa-db-fra.com

AJAX les données JSON arrivent vides - codeigniter

J'ai trouvé beaucoup de questions similaires, mais personne n'est lié à ma question, cependant, ceci est ma demande AJAX

data = JSON.stringify(data);
url = base_url + "index.php/home/make_order";
//alert(url);

var request = $.ajax({
  url: url,
  type: 'POST',
  contentType: 'application/json',
  data: data
});
request.done(function(response){
  alert('success');
});
request.fail(function(jqXHR, textStatus, errorThrown){
  alert('FAILED! ERROR: ' + errorThrown);
});

Mon problème est que quand il arrive au PHP contrôleur-CI $ this-> input-> post ('data') arrive vide !!

UPDATEVoici mes données: comme indiqué avant la demande AJAX:

data = {"sum": "2.250", "info": [{"id": "6", "name": "bla", "price": "1.000"}]}}

S'il vous plaît aider. Merci d'avance.

8
Roshdy

J'aimerais d'abord remercier toutes les réponses. En fait, c’était quelques erreurs, First : comme @bipen l’a dit, les données doivent être envoyées sous forme d’objet plutôt que de chaîne. et quand j'ai essayé, ça n'a pas marché parce que je n'ai pas mis la guillemet simple autour des données

$.ajax({
  url: url,
  type: 'POST',
  contentType: 'application/json',
  data: {'data': data}
});

Deuxième : comme @foxmulder l'a dit, contentType a été mal orthographié et doit être ContentType de sorte que le code correct est le suivant:

$.ajax({
  url: url,
  type: 'POST',
  ContentType: 'application/json',
  data: {'data': data}
}).done(function(response){
  alert('success');
}).fail(function(jqXHR, textStatus, errorThrown){
  alert('FAILED! ERROR: ' + errorThrown);
});

et juste pour votre information au cas où quelqu'un aurait des problèmes avec l'extraction de PHP, voici comment procéder:

$data = $this->input->post('data');
    $data = json_decode($data);
    $sum = $data->sum;
    $info_obj = $data->info;
    $item_qty = $info_obj[0]->quantity;
14
Roshdy

envoyez vos données en tant qu'objet et non en tant que chaîne.

data = JSON.stringify(data);
url = base_url + "index.php/home/make_order";
        //alert(url);

        var request = $.ajax({
            url         : url,
            type        : 'POST',
            contentType : 'application/json',
            data        : {data:data} //<------here
        });
        request.done(function(response){
            alert('success');
        });
        request.fail(function(jqXHR, textStatus, errorThrown){
            alert('FAILED! ERROR: ' + errorThrown);
        });

mis à jour si en tant que commentaires, vos données sont

 {"sum":"2.250","info":[{"id":"6","name":"bla","price":"1.000"}]}

alors data:data va bien

 var request = $.ajax({
            url         : url,
            type        : 'POST',
            contentType : 'application/json',
            data        : data
        });

bt vous devez changer vos codes codeigniter en

 $this->input->post('sum') // = 2.250
 $this->input->post('info')
4
bipen

contentType doit être en majuscule (ContentType)

voir cette question

4
foxmulder

J'ai étendu le CI_Input class pour permettre l'utilisation de json.

Placez ceci dans application/core/MY_input.php et vous pourrez utiliser $ this-> input-> post () comme d’habitude.

class MY_Input extends CI_Input {

    public function __construct() {
        parent::__construct();
    }

    public function post($index = NULL, $xss_clean = NULL){
        if($xss_clean){
            $json = json_decode($this->security->xss_clean($this->raw_input_stream), true);
        } else {
            $json = json_decode($this->raw_input_stream, true);
        }
        if($json){
            if($index){
                return $json[$index] ?? NULL;
            }
            return $json;
        } else {
            return parent::post($index, $xss_clean);
        }
    }

}

Si vous utilisez PHP5.x . Remplacer

return $json[$index] ?? NULL;

avec

return isset($json[$index]) ? $json[$index] : NULL;
0
Firze