Developer

【PHP応用】入力チェック(バリデーション)
2021.06.30
Lv2

【PHP応用】入力チェック(バリデーション)

テーブルに登録や更新を行う際、
テーブルで定義した型と違う型を入力し処理を行ってしまうと
PDOExceptionが発生してしまい処理が中断してしまいます。
それを防ぐために入力チェックを行います。
入力された値をチェックすること(妥当性の確認)を
バリデーションといいます。

バリデーションで、不正なデータの入力を防ぐことで、
XSSSQLインジェクションを防ぐ助けにもなります。
(確実な防御のためにはそれぞれ専用の対策をとります。)

実例

add.ctp(変更)

1
2
3
4
5
6
7
<h3>Add Form</h3>
<?= $this->Form->create($member); /*createの第一引数にエンティティを指定することで、validationDefaultが効くようになる。*/?>
    Name:<?= $this->Form->text("name"); ?>
    Age:<?= $this->Form->text("age"); ?>
    Mail:<?= $this->Form->text("mail"); ?>
    <?= $this->Form->submit(); ?>
<?= $this->Form->end(); ?>

MembersTable.php(変更)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public function validationDefault(Validator $validator)
   {
       $validator
           ->integer('id')
           ->allowEmpty('id', 'create');                 // 空を許可してなければ作る
 
       $validator
           ->scalar('name')
           ->maxLength('name', 50)                     // 長さは50
           ->requirePresence('name', 'create')       // 必須設定(SQLだとNOTNULLにあたる)
           ->notEmpty('name');                           // 空を許可しない
 
       $validator
           ->integer('age')
           ->nonNegativeInteger('age')                           // ここを追加、自然数のみ許可する
           ->allowEmpty('age');                                     // 空を許可する
 
       $validator
           ->scalar('mail')        
           ->maxLength('mail', 50)      // 長さは50
           ->allowEmpty('mail');        // 空を許可する
 
       return $validator;
   }

入力チェック

前節で以下の記述を追加してもらいました。

1
->nonNegativeInteger('age')

このように、デフォルトのルールの他に任意のルールを適用することが可能です。

入力チェックの流れ

値のチェックには2段階あります。

バリデーション(validation)

Entity作成・更新時に行われます。形式や必須項目漏れ等のチェックです。
エンティティ構築前に行われ、 validationDefaultメソッドの設定に従います。
アプリケーションルール(application rule)
Databaseに作用する(insert, update, delete)際に行われます。データベース上のデータを絡めた)存在チェックや重複チェックです。
エンティティをdatabaseにsaveする前に行われ、
buildRulesメソッドに記述します。(今回は使っていません)

MembersController.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public function add()
    {
        $member = $this->Members->newEntity();   
        if ($this->request->is('post')) {
      // エンティティにリクエストされた値を入れる(この際にvalidationが行われる)
            $member = $this->Members->patchEntity($member, $this->request->getData());
 
       // databaseをsaveする(この際にapplication Ruleが行われる)
            if ($this->Members->save($member)) {
                $this->Flash->success(__('The member has been saved.'));
 
                return $this->redirect(['action' => 'index']);
            }
            $this->Flash->error(__('The member could not be saved. Please, try again.'));
 
        }
        $this->set(compact('member'));
    }

バリデーションルールの種類例

数字

numeric
数字かどうか
naturalNumber
符号なしの数字かどうか
nonNegativeInteger
マイナスを許可しない

英数字

alphanumeric
半角英数字かどうか

指定文字数

minLength
指定文字以上であるかどうか
maxLength
指定文字以下であるかどうか

日付

date
日付のフォーマットであるかどうか

メールアドレス

email
メールアドレスであるかどうか

PHPWEBプログラミング講座 連載目次リンク

PHPWEBプログラミング講座 連載目次