Php 在CodeIgniter中检索JSON POST数据

Php 在CodeIgniter中检索JSON POST数据,php,jquery,ajax,json,codeigniter,Php,Jquery,Ajax,Json,Codeigniter,我一直在尝试从我的php文件中检索JSON数据。这给我带来了困难。这是我的代码 在我看来: var productDetails = {'id':ISBNNumber,'qty':finalqty,'price':finalprice,'name':bookTitle}; var base_url = '<?php echo site_url() ?>'; $.ajax({ url: "<?php echo base_u

我一直在尝试从我的php文件中检索JSON数据。这给我带来了困难。这是我的代码

在我看来:

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',
        });
什么也不输出

以下是我的标题:

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!@!@@
我可以在开发人员工具中看到我的回答:

    Array
(
    [id] => 234
    [qty] => 1
    [price] => 0.00
    [name] => dasdadsd2q3e!@!@@
)
但在浏览器中,输出什么都不是。我试图解决它超过4个小时,但徒劳

print_r($_POST); // outputs nothing
echo $data = file_get_contents('php://input'); //outputs nothing
echo $id    = $this->input->post('productDetails');// outputs nothing
我的视图代码:

<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>
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

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

$.post(baseUrl + "/AjaxController/my_function", post_array,
    function(data)
    {
        var res = jQuery.parseJSON(data);
        alert(res.property);
    }  
public function my_function()
{
    $myvar = $this->input->post('myvar');
    $myvar2 = $this->input->post('myvar2'); 

    //Stuff

    echo json_encode($myobject);
}

你只有自己的答案

print\r($\u POST)

返回:

Array
(
    [id] => 234
    [qty] => 1
    [price] => 0.00
    [name] => dasdadsd2q3e!@!@@
)
那么您将如何获得:
echo$id=$this->input->post('productDetails')


您将通过
echo$id=$this->input->post('id')获得id

我在CI中用于Ajax调用的常规方法:

JS:

<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>
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

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

$.post(baseUrl + "/AjaxController/my_function", post_array,
    function(data)
    {
        var res = jQuery.parseJSON(data);
        alert(res.property);
    }  
public function my_function()
{
    $myvar = $this->input->post('myvar');
    $myvar2 = $this->input->post('myvar2'); 

    //Stuff

    echo json_encode($myobject);
}
控制器:

<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>
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

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

$.post(baseUrl + "/AjaxController/my_function", post_array,
    function(data)
    {
        var res = jQuery.parseJSON(data);
        alert(res.property);
    }  
public function my_function()
{
    $myvar = $this->input->post('myvar');
    $myvar2 = $this->input->post('myvar2'); 

    //Stuff

    echo json_encode($myobject);
}

我也有同样的问题。CodeIgniter不知道如何获取JSON。我首先想到的是编码,因为我使用的是
fetch.js
,而不是
jQuery
。无论我在做什么,我都会得到一个notting
$\u POST
是空的,
$this->input->POST()
。下面是我如何解决这个问题的

发送请求(作为对象属性--因为您的js库可能会有所不同):

节点:我将
object
类型的数据编码为
json
jQuery
通过 当您设置
数据类型:“JSON”
选项时,它会自动关闭

CodeIgniter(在我的例子中为3.1):

注意:您需要清理
$this->input->raw\u input\u流
。你是 未使用
$this->input->post()
,这意味着未完成此操作 由CodeIgniter自动完成

关于答复:

$response = json_encode($request);
header('Content-Type: application/json');
echo $response;
或者,您可以执行以下操作:

echo $stream_clean;
注意:不需要设置
标题('Content-Type:
application/json')
,但我认为这样做是一种很好的做法。
请求
已经设置了
'Accept':'application/json'


所以,这里的诀窍是使用
$this->input->raw\u input\u stream
自己解码数据。

虽然OP看起来很满意,但choosen答案并没有告诉我们原因和真正的解决方案。(顺便说一句,post_数组不是数组,它确实是一个对象)@jimasun的答案是正确的。我将把事情弄清楚,并在CI之外添加一个解决方案

所以问题的原因是

不是CI或PHP,但您的服务器不知道如何处理具有 应用程序/json内容类型。因此,您将没有$u POST数据。Php与此无关。更多信息请访问:

解决办法是,; 要么不将请求作为application/json发送,要么处理请求体以获取post数据

因为CI@jimasun的答案正是这样

您还可以像这样使用纯PHP获取请求体

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

我也有同样的问题,但我找到了解决办法

这是我正在发送的Json
[{“name”:“JOSE ANGEL”,“lastname”:“Ramirez”}]


此代码经过测试,结果是
[{“name”:“JOSE ANGEL”,“lastname”:“Ramirez”}]

您做错了两件事1。数据:{productDetails:productDetails},2$data=json_decode($_POST[“productDetails”]);在$data变量中获取数据后,是否可以显示代码要执行的操作。第二件事,您需要返回或回显退出某些内容,以便从控制器获取数据,并使用jquery处理这些数据!你能把你的控制器代码放在上面的POST中吗?请看上面的代码…查看和控制器代码..控制器中没有任何功能当我单击result选项卡时,结果数组只在developer tools中显示,但不在该页面Print\r($\u POST)中显示;您必须用php编写正确的代码?因此,如果$\u POST有值,那么$this->input->POST()也将有相同的值。您没有得到它,我可以在“开发人员工具预览”选项卡中看到输出,但无法在该页中检索它…我不知道为什么!!这就是为什么我要发布这个问题@RanaSoyab问题是,$\u POST也是空的。正如jimasun所描述的,CI不知道如何处理具有应用程序/json内容类型的请求。将这些数据回送或放入视图文件的表中如何?我该怎么做@AdrienXL?我的javascript成功将是什么:函数将是什么样子?$myobject从何而来?@logic unit它是您根据在
//Stuff
部分中必须执行的操作构建的对象这或多或少是他所做的,但这个答案没有抓住问题。在OP的问题中,
JSON
需要使用
POST
获取。您的答案是不透明的,因为实际上在您的代码
CI
中,不会将请求作为
JSON
处理
jQuery
在过程中将请求加载修改为另一种格式!如果你需要像操作系统所说的那样使用
JSON
,请查看我的答案以获得完整的解释。我没有任何线索。。。Well OP可以告诉我们这个答案如何帮助他/她,而不是通过
$this->security->xss_clean()
传递值。我们可以使用
$this->input->input_stream(null,true)
并将第二个参数作为
true
传递给xss筛选。