質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

PHPUnit

PHPUnitは、PHP向けのユニット・テスト向けフレームワークで、手動では手間のかかるテスト作業を自動化し、繰り返し実行することが可能です。

Q&A

1回答

6230閲覧

CakePHPなどでPOST送信などの値の受け取り方

1nakaji

総合スコア187

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

PHPUnit

PHPUnitは、PHP向けのユニット・テスト向けフレームワークで、手動では手間のかかるテスト作業を自動化し、繰り返し実行することが可能です。

0グッド

0クリップ

投稿2015/11/14 03:20

編集2022/01/12 10:55

現在、CakePHP2.4を使ってWebアプリ開発をしています。

Webアプリ内ではユーザーが入力された値を受け取って、
処理をすることがありますが、
皆様はどのようにして値を受け取りますか?

何も考えなければCakePHPでは
以下のような形で受け取っています。

php

1$name = $this->request->data['name']

受け取った値はデータベースに保存され、
その後、必要に応じてデータベースから取得、
ユーザーの画面に表示されるというイメージです。

もちろん、受け取り方はケースバイケースというのは前提ですが、
それぞれ基本的な取得方法は決めているかと思います。

私の場合は以下のような受け取り方をしています。
実際にはloadModelメソッドなどが別に用意されています。

Userモデルで定義しているバリデーションを通過するかどうかをチェックし、
バリデーションを通過しなければエラーを返しています。
(エラー処理はちょっと適当に書いています)

モデル内で定義しているバリデーションはホワイトリスト方式です。
自由に記述できるような項目については上限文字数のみチェックしています。

php

1$name = $this->checkVariables( 'User', 'name', $this->request->data['name'] ); 2 3public function checkVariables( $model, $dataName, $data ){ 4 5 $this->Common->loadModel($model); //指定したモデルを使えるように読み込む 6 $this->Common->$model->set(array( $dataName => $data )); //バリデーションするデータをセット 7 if ( $this->Common->$model->validates() ) { 8 return $data; 9 } 10 11 //エラー処理 12 header('HTTP', true, 500 ); 13 echo "不正な入力値"; 14 exit; 15} 16

こういった処理を書いておき利用しているのですが、
他の方がどういう感じで処理しているのかが分かりません。

文字エンコーディングチェックも入れた方がいいのでしょうか。
画面に表示する際にはh()でエスケープさせています。

CakePHPの独自の受け取り方などがあるのでしょうか。
他の方がどのように値を取得しているのかお聞きできれば幸いです。

ネット上にもいろいろサンプルがあったりするのですが、
たいていは値取得の部分などは適当に記述されていることが多く、
はっきりとした回答が分かりにくいです。

もちろん、完全に安全ということではなく、
最低限こういう受け取り方はしないとダメでしょ、
というようなことで問題ないです。

もし、これだけでは回答ができなければ、
追加で何が必要か教えていただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

CakePHPの独自の受け取り方という点で言えば、Model::save()時にModel::validates()が実行される点ではないでしょうか。
コントローラのコーディング量も減りスマートに書けます。
その分Modelのバリデート部分はしっかり書かないといけませんが・・・。

PHP

1if(!$this->User->save($this->request->data)){ 2 throw new InternalErrorException('不正な入力値'); 3}

ですので私はDBへの保存の際に行うバリデートであればModel::save()時のModel::validates()に任せます。
特にcheckVariables()のような関数を設けてはいません。
Model::invalidate()を個別に行うような特殊なページの場合には設けるかもしれません。

文字エンコーディングチェックは、大抵の場合は正規表現で解決するかと思いますが、
必要なカラムに対しては行うべきだと思います。

PHP

1// 正規表現例 2$validate = array('name_kana' => array(array('rule' => array('custom', '/^[ァ-ヶー ]*$/u') 3 , 'message' => '全角カナで入力して下さい。')));

PHP

1// 関数による文字エンコーディングチェック例(isUTF8()はUTF8判定。コードは省略) 2$validate = array('name_kana' => array(array('rule' => 'encodeValidate' 3 , 'message' => '文字コードが不正です。'))); 4function encodeValidate($data){ 5 return isUTF8($data['name_kana']); 6}

質問の内容に合っていますでしょうか?
入力値チェックに関しては私も是非他の人の意見もお聞きしたいです。

投稿2015/11/16 02:52

編集2015/11/16 03:01
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1nakaji

2015/11/16 03:10

ご回答ありがとうございます。 >ですので私はDBへの保存の際に行うバリデートであればModel::save()時のModel::validates()に任せます。 なるほどですね、そういう考え方もできるわけですか。 特に途中でバリデーションなどは行わず、 DB登録時にまとめてフレームワークのバリデーションの仕組みを利用して、 バリデーション処理するということでしょうか。 ただ、これだとDB登録時にはバリデーションが走るのでいいのですが、 DBからレコードを取得する際にはSQLインジェクションなどの 脆弱性が残るかなぁと思いまして。 もちろん、それもCakePHPのfindメソッドを使うので、 SQLインジェクションもこちらで対策を 考えなくてもいいところなのかもしれませんが。
退会済みユーザー

退会済みユーザー

2015/11/16 03:33

仰る通りで、私の回答はModel::query()等は使わず、Model::find()を使用する事が前提でした。 どの程度までフレームワークに任せるのか?という話になりそうですね。 私はほぼ任せっきりで、フレームワーク外の部分のみ個別に対応している感じです。
1nakaji

2015/11/16 05:50

ありがとうございます。 認識はあっていそうでよかったです。 他の方からの回答も待ちたいと思います。 色々な意見が見てみたいですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問