在 CodeIgniter 中检索 JSON POST 数据

Posted

技术标签:

【中文标题】在 CodeIgniter 中检索 JSON POST 数据【英文标题】:Retrieve JSON POST data in CodeIgniter 【发布时间】:2015-04-20 14:12:27 【问题描述】:

我一直在尝试从我的 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

    

【问题讨论】:

你做错了两件事 1. data:productDetails:productDetails, 2. $data = json_decode($_POST["productDetails"]); 你能否在你的代码中显示你想要在 $data 变量中获取数据后执行的操作。您需要返回或回显退出的第二件事,以便您从控制器获取数据并使用 jquery 处理。 我没有在 $data 变量中获取 ant 数据……这就是重点! 你能把你的控制器代码放在上面的帖子里 请看上面的代码...查看和控制器代码..在控制器中没有任何作用 【参考方案1】:

我遇到了完全相同的问题。 CodeIgniter 不知道如何获取 JSON。我首先想到的是编码因为我使用fetch.js 而不是jQuery。无论我在做什么,我都会得到一个通知。 $_POST$this-&gt;input-&gt;post() 都是空的。这是我解决问题的方法。

发送请求(作为对象道具——因为您的 js 库可能会有所不同):

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

节点:我将object 类型的数据编码为jsonjQuery 通过 当您设置 dataType: 'JSON' 选项时,它本身。

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

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

注意:您需要清理您的$this-&gt;input-&gt;raw_input_stream。你是 不使用$this-&gt;input-&gt;post() 这意味着这还没有完成 由 CodeIgniter 自动生成。

至于回复:

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

您也可以这样做:

echo $stream_clean;

注意:不需要设置header('Content-Type: application/json'),但我认为这样做是一个好习惯。 request 已经设置了 'Accept': 'application/json' 标头。

所以,这里的诀窍是使用$this-&gt;input-&gt;raw_input_stream 并自己解码您的数据。

【讨论】:

我们可以使用$this-&gt;input-&gt;input_stream(null, true) 并将第二个参数作为true 传递给XSS 过滤,而不是通过$this-&gt;security-&gt;xss_clean() 传递值。【参考方案2】:

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

这是我发送的 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】:

虽然 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');

【讨论】:

【参考方案4】:

我在 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);

【讨论】:

如何将这些数据回显或放入视图文件的表格中?我该怎么做@AdrienXL?我的 javascript 成功将是什么:函数会是什么样子? $myobject 来自哪里? @logic-unit 它是您构建的对象,具体取决于您在 //Stuff 部分中要做的事情 这或多或少是他所做的,但这个答案没有解决问题。在 OP 的问题中,JSON 需要使用POST 获取。您的答案是不透明的,因为实际上在您的代码中CI 不会将请求处理为JSONjQuery在过程中将请求加载修改为另一种格式!如果您需要按照操作系统所述使用JSON,请查看我的答案以获得完整解释。 我不知道...... OP 能告诉我们这个答案如何帮助他/她【参考方案5】:

你只有自己的答案。

print_r($_POST);

返回:

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

那你将如何获得:echo $id = $this-&gt;input-&gt;post('productDetails');

你会得到echo $id = $this-&gt;input-&gt;post('id');的id

【讨论】:

当我单击结果选项卡时,该结果数组仅显示在开发人员工具中,而不显示在该页面中 print_r($_POST);你一定用php写过正确的代码吧? 所以如果 $_POST 有值那么 $this->input->post() 也将有相同的值 你没有得到它,我可以在开发人员工具预览选项卡中看到输出,但无法在该页面中检索它...我不知道为什么!这就是我发布这个问题的原因! @RanaSoyab 事情是,$_POST 也是空的。正如 jimasun 所述,CI 不知道如何处理具有 application/json 内容类型的请求。

以上是关于在 CodeIgniter 中检索 JSON POST 数据的主要内容,如果未能解决你的问题,请参考以下文章

使用连接(codeigniter)从单个字段中检索和打印逗号分隔符后的值

codeigniter 将数据从视图传递到模型并检索信息

在 codeigniter 中使用 AJAX 从视图调用控制器函数并从 db 检索行

CodeIgniter activerecord,检索最后一个插入ID?

如何在 CodeIgniter 控制器中读取 JSON 文件

CodeIgniter 在 JSON 响应中返回 HTML