LoginSignup
41
44

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-04-13

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()?>

生成されるタグ

<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を指定したことになる。

生成されるタグ

<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

リクエストパラメータの取得方法

フォームの名前に「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: キー名というエラーが出力される。

// 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: キー名というエラーが出力される。

// 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時の配列の深層ミスに気がつける。

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

// POSTの場合
debug($this->request->data);
41
44
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
41
44