web-dev-qa-db-fra.com

Récupérer les données JSON POST dans CodeIgniter

J'ai essayé de récupérer les données JSON de mon fichier php, cela me donne du fil à retordre, c'est mon code

Code à mon avis:

var productDetails = {'id':ISBNNumber,'qty':finalqty,'price':finalprice,'name':bookTitle};

        var base_url = '<?php echo site_url() ?>';
        $.ajax({
            url: "<?php echo base_url() ?>index.php/user/Add_to_cart/addProductsToCart",
            type: 'POST',
            data:productDetails,
            dataType:'JSON',
        });

Essayer de récupérer dans mon contrôleur:

echo $this->input->post("productDetails");

Ne produit rien.

Voici mes en-têtes:

Remote Address:[::1]:80
Request URL:http://localhost/CI/index.php/user/Add_to_cart/addProductsToCart
Request Method:POST
Status Code:200 OK
Request Headersview source
Accept:application/json, text/javascript, */*; q=0.01
Accept-Encoding:gzip, deflate
Accept-Language:en-US,en;q=0.8,fr;q=0.6
Connection:keep-alive
Content-Length:52
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
Cookie:ci_session=3E5SPro57IrJJkjs2feMNlmMrTqEXrTNN8UyEfleeothNnHwNxuCZDSx4a7cJZGjj7fyr2KLpj%2BPNJeGRSzSPVmcFHVEdhSk4D47ziOl4eZcTUAZlQrWa3EYIeQJVWxMpiGZS26MEfbSXNmfel9e8TcsJTreZHipvfisrJovbXEAW4Uv%2BwrJRep1KCi1MMaDCVJb9UEinRVcDtYe%2F86jhn7kOj4kraVmVzx%2FsOaO0rAxLyAUtez%2Feaa4zBwpN3Td153sAoIb3WxVHoEj2oKyH5prVHigbIhIBR6XZqjBkM6hjBuoD2OSZ2wgLbp9DEENMoqui4WYyHROBuS2DYiJajblcS0KiFga5k%2FQOODvE7p6n%2BozN5ciDliVjJ4PnJ5PD1GaPEmec5%2FbQSlOHYWZk%2F2Blzw3Nw0EtLL7wKDzzQY%3Df645c36bb3548eb8de915b73f8763d97a47783ce
Host:localhost
Origin:http://localhost
Referer:http://localhost/CI/index.php/user/view_available_books/viewAvailableBooks/5
User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36
X-Requested-With:XMLHttpRequest
**Form Dataview** sourceview URL encoded
id:234
qty:1
price:0.00
name:dasdadsd2q3e!@!@@

Ma réponse que je peux voir dans les outils de développement:

    Array
(
    [id] => 234
    [qty] => 1
    [price] => 0.00
    [name] => dasdadsd2q3e!@!@@
)

Mais dans le navigateur, la sortie n'est rien. J'essaie de le résoudre depuis plus de 4 heures maintenant mais en vain.

print_r($_POST); // outputs nothing
echo $data = file_get_contents('php://input'); //outputs nothing
echo $id    = $this->input->post('productDetails');// outputs nothing

Mon code d'affichage:

<script>
    $('#addtoCart').on('click',function(event){
        event.preventDefault();
        $(this).attr('disabled',"disabled");
        finalprice = $.trim($('#price').val());
        finalqty = $.trim($('#quantity').val());

        var productDetails = JSON.stringify({'id':ISBNNumber,'qty':finalqty,'price':finalprice,'name':bookTitle});

        var base_url = '<?php echo site_url() ?>';
        // console.log($);
        $.ajax({
            url: "<?php echo base_url() ?>index.php/user/Add_to_cart/addProductsToCart",
            type: 'POST',
            contentType: "application/json; charset=utf-8",
            data:productDetails,
            dataType:'html',
        });


    });
</script>

Code du contrôleur:

function addProductsToCart(){
        var_dump(json_decode(file_get_contents("php://input")));
        print_r($_POST);
        // $data = json_decode($_POST["productDetails"]);
        // var_dump($data);
        // echo $data = file_get_contents('php://input');
// print_r(json_decode($data));
        // $id    = $this->input->post('id');
        // $qty   = $this

    }
9
Abhinav

Méthode générale que j'utilise pour mes appels Ajax en CI:

JS:

post_array =
{
    "myvar" : "value1",
    "myvar2": "value2"
} 

$.post(baseUrl + "/AjaxController/my_function", post_array,
    function(data)
    {
        var res = jQuery.parseJSON(data);
        alert(res.property);
    }  

Contrôleur:

public function my_function()
{
    $myvar = $this->input->post('myvar');
    $myvar2 = $this->input->post('myvar2'); 

    //Stuff

    echo json_encode($myobject);
}
0
AdrienXL

J'ai eu exactement le même problème. CodeIgniter ne sait pas comment récupérer JSON. J'ai d'abord pensé au codage car j'utilise fetch.js Et non jQuery. Quoi que je fasse, je recevais une note. $_POST Était vide ainsi que $this->input->post(). Voici comment j'ai résolu le problème.

Envoyer la demande (en tant qu'objet prop - car votre bibliothèque js peut varier):

method: 'POST',
headers: {
  'Accept': 'application/json',
  'Content-Type': 'application/json'
},
body: JSON.stringify({
  ready: 'ready'
})

Noeud: j'encode mes données de type object en json. jQuery le fait par lui-même lorsque vous définissez l'option dataType: 'JSON'.

CodeIgniter (3.1 dans mon cas):

$stream_clean = $this->security->xss_clean($this->input->raw_input_stream);
$request = json_decode($stream_clean);
$ready = $request->ready;

Remarque: vous devez nettoyer votre $this->input->raw_input_stream. Vous n'utilisez pas $this->input->post() ce qui signifie que cela n'est pas fait automatiquement par CodeIgniter.

Quant à la réponse:

$response = json_encode($request);
header('Content-Type: application/json');
echo $response;

Vous pouvez également faire:

echo $stream_clean;

Remarque: Il n'est pas nécessaire de définir la header('Content-Type: application/json') mais je pense que c'est une bonne pratique de le faire. request a déjà défini l'en-tête 'Accept': 'application/json'.

Donc, l'astuce consiste à utiliser $this->input->raw_input_stream Et à décoder vos données par vous-même.

19
jimasun

Bien que OP semble satisfait, la réponse choisie ne nous dit pas la raison et la vraie solution. (btw que post_array n'est pas un tableau, c'est un objet en effet) @ jimasun's answer has the right approach. Je vais simplement clarifier les choses et ajouter une solution au-delà de CI.

La raison du problème est donc;

Pas CI ou PHP, mais votre serveur ne sait pas comment gérer une demande qui a un type de contenu application/json. Vous n'aurez donc pas de données $ _POST. Php n'a rien à voir avec ça. En savoir plus sur: Lecture de JSON POST en utilisant PHP

Et la solution est; N'envoyez pas de demande en tant que corps de demande/json ou de processus pour obtenir les données de publication.

Pour CI @ jimasun, la réponse est précise.

Et vous pouvez également obtenir le corps de la requête en utilisant PHP comme ceci.

$json_request_body = file_get_contents('php://input');
4

J'ai eu le même problème mais j'ai trouvé la solution.

Voici le Json que j'envoie [{"name":"JOSE ANGEL", "lastname":"Ramirez"}]

$data = json_decode(file_get_contents('php://input'), true);
echo json_encode($data);

Ce code a été testé et le résultat est [{"name":"JOSE ANGEL","lastname":"Ramirez"}]

Vous n'avez que votre propre réponse.

print_r($_POST);

Revenir :

Array
(
    [id] => 234
    [qty] => 1
    [price] => 0.00
    [name] => dasdadsd2q3e!@!@@
)

Alors comment obtiendrez-vous: echo $id = $this->input->post('productDetails');

Vous obtiendrez id par echo $id = $this->input->post('id');

2
Rana Soyab