CakePHP フォームから入力した値のGETとPOSTそれぞれでのデータ取得方法 

PHP 5.5.31
CakePHP 2.8.0

更新履歴
2017/11/09
指摘していただいた間違っている記述を編集リクエストしてもらっていたので反映

CakePHPで、GETとPOSTでのデータ取得方法を具体的な例を挙げてまとめます。
今回は以下のパラメータを利用します。

# リクエスト元ページ
リクエストパラメータをフォームで生成

 | パラメータ
---------- | :----------:
Controller | HogeHogesController
アクション | fuga_fuga()
URL | /hoge_hoges/fuga_fuga

# リクエスト先ページ
リクエストパラメータを受け取り何らかの処理を実行

 | パラメータ
---------- | :----------:
Controller | HogeHogesController
アクション | piyo_piyo()
URL | /hoge_hoges/piyo_piyo

# フォームの例
名前を入力するフォームを作成する。

## Formヘルパーでinputフォームを作成
### GETの場合
```fuga_fuga.ctp
<?=$this->Form->create('HogeHoge', ['url' => ['action' => 'piyo_piyo'], 'type' => 'get'])?>
<?=$this->Form->input('name', ['label' => '名前']);?>
<?=$this->Form->submit('送信')?>
<?=$this->Form->end()?>
```

生成されるタグ

```html
<form action="/hoge_hoges/piyo_piyo" id="HogeHogePiyoPiyoForm" method="get" accept-charset="utf-8">
  <div class="input text">
    <label for="HogeHogeName">名前</label>
    <input name="name" type="text" id="HogeHogeName"/>
  </div>
  <div class="submit">
    <input type="submit" value="送信"/>
  </div>
</form>
```

### POSTの場合
```fuga_fuga.ctp
<?=$this->Form->create('HogeHoge', ['url' => ['action' => 'piyo_piyo', 'type' => 'post']])?>
<?=$this->Form->input('name', ['label' => '名前']);?>
<?=$this->Form->submit('更新')?>
<?=$this->Form->end()?>
```

`'type' => 'post'`は省略することが可能である。省略した場合、必ずpostを指定したことになる。

生成されるタグ

```html
<form action="/hoge_hoges/piyo_piyo" id="HogeHogePiyoPiyoForm" method="post" accept-charset="utf-8">
  <div style="display:none;">
    <input type="hidden" name="_method" value="POST"/>
  </div>
  <div class="input text">
    <label for="HogeHogeName">名前</label>
    <input name="data[HogeHoge][name]" type="text" id="HogeHogeName"/>
  </div>
  <div class="submit">
    <input type="submit" value="送信"/>
  </div>
</form>
```

## 生成されるform
![スクリーンショット 2016-04-12 19.53.28.png](https://qiita-image-store.s3.amazonaws.com/0/42625/d986d6e0-1197-f182-dc8f-4482a49ccc8a.png)

# リクエストパラメータの取得方法
フォームの名前に「hogera」と入力し、送信ボタンを押したと仮定する。

## GETの場合
### query変数
```HogesController.php
// piyo_piyoアクション内
$this->request->query;

// prでの出力結果
Array
(
    [url] => hoge_hoges/piyo_piyo
    [name] => hogera
)

// URL
https://ドメイン名/hoge_hoges/piyo_piyo?name=hogera
```

### query()メソッド
```HogesController.php
// piyo_piyoアクション内
$this->request->query('name');

// prでの出力結果
hogera
```

### query[]とquery()の使い分け
query()を使うと、キーが存在しない時に`null`を返してくれる。
query[]を使い、キーが存在しない時は`undefined index: キー名`というエラーが出力される。

```php
// GETでnameを取得したい場合
$this->request->query('name');

// issetを利用した場合
if (isset($this->request->query['name']) {
  $a = $this->request->query['name'];
}
else {
  $a = null;
}

// 上記に三項演算子にした場合
$a = isset($this->request->query['name']) ? $this->request->query['name'] : null;
```

## POSTの場合
### data変数
```HogesController.php
// piyo_piyoアクション内
$this->request->data;

// prでの出力結果
Array
(
    [HogeHoge] => Array
        (
            [name] => hogera
        )
)
```

### data()メソッド
```HogesController.php
// piyo_piyoアクション内
$this->request->data('HogeHoge');

// prでの出力結果
Array
(
    [name] => hogera
)
```

```HogesController.php
// piyo_piyoアクション内
$this->request->data('HogeHoge.name');

// prでの出力結果
hogera
```

### data[]とdata()の使い分け
data()を使うと、キーが存在しない時に`null`を返してくれる。
data[]を使い、キーが存在しない時は`undefined index: キー名`というエラーが出力される。

```php
// POSTでnameを取得したい場合
$this->request->data('HogeHoge.name');

// issetを利用した場合
if (isset($this->request->data['HogeHoge']['name']) {
  $a = $this->request->data['HogeHoge']['name'];
}
else {
  $a = null;
}

// 上記に三項演算子にした場合
$a = isset($this->request->data['HogeHoge']['name']) ? $this->request->data['HogeHoge']['name'] : null;
```

# 共通点
## getとpostで取得する数字は文字列として取得される


## getやpostで値がうまく取得できなかった時にやること
データ単体では無くデータ全体を表示する
全体を見ることにより、スペルミスやPOST時の配列の深層ミスに気がつける。

```php
// GETの場合
debug($this->request->query);

// POSTの場合
debug($this->request->data);
```