14274


## 問題

Input::post()の中身がnullになる。

## 具体的に

jQueryを利用してfuelphpのコントローラーファイルにデータをPOSTメソッドで渡しました。  
しかし、リクエスト先のコントローラーファイルで渡されたはずのデータを取得しようとInput::postメソッドを実行するも、得られた結果はnullでした。  
以下が、それぞれのコードとなります。

**1.javascript**

[code]

    $(function()
    {   
        $('.bookmark').click(function()
    {
        var offer_id = '<?php echo $offer_id; ?>';
        var button  = this;
    
        if($(this).attr('condition') == 'notbookmark')
        {
            $.ajax(
            {
                url:            '<?php echo Uri::base();?>'+'bookmark/add.json',
                type:           'POST',
                contentType:    'application/json',
                dataType:       'json',
                data: {offer_id: offer_id},
                success: function(data)
                {
                    if (data.login_check == false)
                    {
                        $(button).attr('class', 'btn btn-warning btn-lg bookmark');
                        $(button).attr('condition', 'notbookmark');
                        $(button).text("ログインする必要があります");
                        $(button).prop('disabled', true);
                    }
    ...以下省略
    
[/code]

**2.APPPATH/controller/bookmark.php**

[code]

    <?php
    
    class Controller_Bookmark extends Controller_Rest
    {
        public function post_add()
    {
        // ログインチェック
        $auth = Auth::instance('simpleauth');
        if ( ! $auth->check())
        {
            return $this->response(array(
                'login_check' => false,
                'register_check' => false,
            ));
        }
    
        $username = $auth->get('username');
        $offer_id   = Input::post('offer_id');
    
        // ブックマーク数が０であるかチェック
        if (Model_Bookmark::count_how_many_bookmarks($username, $offer_id) != 0)
        {
            return $this->response(array(
                'login_check' => true,
                'register_check' => false,
            ));
        }
    ...以下省略
    
[/code]

ブラウザのデベロッパーツールでヘッダーのリクエスト情報を確認したところ、POSTメソッドで「offer_id=5」のように、コントローラーにデータが送られているのが確認されました。  
一方で、受け取り元のコントローラーで

[code]

    var_dump(Input::post());
    var_dump($_POST);
    
[/code]

を実行したのですが、共に結果が

[code]

    array (size=0)
      empty
    
[/code]

でした。

どのようにしたら、コントローラー側で正しくデータを受け取ることができるでしょうか。  
よろしくお願い致します。


CC BY-SA 3.0
2015-08-11T08:13:49.070
14273
2015-08-11T09:00:21.793
10879
question
javascript php json ajax fuelphp
jQueryを利用してfuelphpのコントローラーにPOSTしたデータがNULLとなるのはなぜでしょう。

[code]

    $.ajax(
    {
        url:            '<?php echo Uri::base();?>'+'bookmark/add.json',
        type:           'POST',
        contentType:    'application/json',
        dataType:       'json',
        data: {offer_id: offer_id},
    ...
    
[/code]

`$.ajax()` のオプションのうち、 `dataType` はレスポンスの形式を、 `contentType`
はリクエストの形式を指定するものです。今回 JSON を使われているのはレスポンスだけのようなので、 `contentType:
'application/json'` という指定は誤りです。

`foo=bar&hoge=piyo` という形はフォームでよく使われるほか、`$.ajax()` の `data`
オプションで自動的にエンコードされるのも、PHPで `$_POST` に展開されるのもこの形式です。これをMIMEタイプで言うと
`application/x-www-form-urlencoded` になりますが、 `$.ajax()` のデフォルトがこれですから、
`contentType` オプションを省略するだけで構いません。

[code]

    $.ajax(
    {
        url:            '<?php echo Uri::base();?>'+'bookmark/add.json',
        type:           'POST',
        dataType:       'json',
        data: {offer_id: offer_id},
    ...
    
[/code]

逆にリクエストもJSONにしたい場合は `contentType`
を指定することになりますが、JavascriptでのJSONエンコード、PHPでのJSONデコードを自分で行う必要があります。


CC BY-SA 3.0
2015-08-11T09:00:21.793
14274
2015-08-11T09:00:21.793
8000
14273
answer