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
}
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);
}
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
enjson
.jQuery
le fait par lui-même lorsque vous définissez l'optiondataType: '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.
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');
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');