在CodeIgniter中检索JSON POST数据

时间:2015-02-19 09:36:43

标签: 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_url() ?>index.php/user/Add_to_cart/addProductsToCart",
            type: 'POST',
            data:productDetails,
            dataType:'JSON',
        });

尝试在我的控制器中检索:

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

无输出。

以下是我的标题:

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

    }

5 个答案:

答案 0 :(得分:16)

我遇到了完全相同的问题。 CodeIgniter不知道如何获取JSON。我首先想到的是关于编码因为我使用fetch.js而不是jQuery。无论我做什么,我都会得到一个回应。 $_POST$this->input->post()一样空。method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: JSON.stringify({ ready: 'ready' }) 。以下是我解决问题的方法。

发送请求(作为对象道具 - 因为你的js lib可能会有所不同):

object
  

节点:我将json类型的数据编码为jQuerydataType: 'JSON'这样做   设置$stream_clean = $this->security->xss_clean($this->input->raw_input_stream); $request = json_decode($stream_clean); $ready = $request->ready; 选项时本身。

CodeIgniter(在我的情况下为3.1):

$this->input->raw_input_stream
  

注意:您需要清除$this->input->post()。你是   不使用$response = json_encode($request); header('Content-Type: application/json'); echo $response; ,这意味着没有这样做   由CodeIgniter自动完成。

至于答复:

echo $stream_clean;

或者你可以这样做:

header('Content-Type:
  application/json')
  

注意:不需要设置request,但我认为这样做是个好习惯。 'Accept': 'application/json'已设置$this->input->raw_input_stream标题。

所以,这里的诀窍是使用VisibleDeprecationWarning: boolean index did not match indexed array along dimension 0; dimension is 744 but corresponding boolean dimension is 1 并自己解码数据。

答案 1 :(得分:3)

尽管OP看起来很满意,但选择答案并没有告诉我们原因和真正的解决方案。 (顺便说一下post_array不是一个数组,它确实是一个对象)@jimasun的答案有正确的方法。我会清楚地说明并添加CI之外的解决方案。

所以问题的原因是;

  

不是CI或PHP,但您的服务器不知道如何处理具有的请求   应用程序/ json内容类型。所以你没有$ _POST数据。 Php与此无关。详情请见:Reading JSON POST using PHP

解决方案是; 要么不发送请求作为application / json或进程请求体来获取发布数据。

CI @ jimasun的回答是精确的方式。

你也可以使用像这样的纯PHP来获取请求体。

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

答案 2 :(得分:3)

我遇到了同样的问题,但我找到了解决方案。

这是我发送的Json [{"name":"JOSE ANGEL", "lastname":"Ramirez"}]

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

此代码已经过测试,结果为[{"name":"JOSE ANGEL","lastname":"Ramirez"}]

答案 3 :(得分:2)

你只有自己的答案。

print_r($_POST);

返回:

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

然后你将如何获得:echo $id = $this->input->post('productDetails');

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

获取ID

答案 4 :(得分:0)

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

JS:

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);
}