web-dev-qa-db-ja.com

JSONを取得POST 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

    }
9
Abhinav

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

私はまったく同じ問題を抱えていました。 CodeIgniterはJSONを取得する方法を知りません。 jQueryではなく_fetch.js_を使用しているため、最初にエンコーディングについて考えました。私が何をしていたにせよ、私はノッティングを得ていました。 _$_POST_は$this->input->post()と同様に空でした。ここに私が問題を解決した方法があります。

要求を送信します(オブジェクトの小道具として-js libが異なる場合があるため):

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

ノード:タイプobjectのデータをjsonにエンコードします。 _dataType: 'JSON'_オプションを設定すると、jQueryが単独でこれを行います。

CodeIgniter(私の場合は3.1):

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

注:_$this->input->raw_input_stream_をクリーンアップする必要があります。 $this->input->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->input->raw_input_stream_を使用して、自分でデータをデコードすることです。

19
jimasun

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

私は同じ問題を抱えていましたが、解決策を見つけました。

これは私が送信しているJsonです[{"name":"JOSE ANGEL", "lastname":"Ramirez"}]

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

このコードはテストされ、結果は[{"name":"JOSE ANGEL","lastname":"Ramirez"}]

あなた自身の答えしかありません。

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を取得します

2
Rana Soyab