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の場合
<?=$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の場合
<?=$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
リクエストパラメータの取得方法
フォームの名前に「hogera」と入力し、送信ボタンを押したと仮定する。
GETの場合
query変数
// piyo_piyoアクション内
$this->request->query;
// prでの出力結果
Array
(
[url] => hoge_hoges/piyo_piyo
[name] => hogera
)
// URL
https://ドメイン名/hoge_hoges/piyo_piyo?name=hogera
query()メソッド
// 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変数
// piyo_piyoアクション内
$this->request->data;
// prでの出力結果
Array
(
[HogeHoge] => Array
(
[name] => hogera
)
)
data()メソッド
// piyo_piyoアクション内
$this->request->data('HogeHoge');
// prでの出力結果
Array
(
[name] => hogera
)
// 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);