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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

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

Q&A

解決済

1回答

4860閲覧

CakePHP3のバリデーションの使い方

cookie.

総合スコア14

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

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

0グッド

1クリップ

投稿2017/02/03 03:17

編集2017/02/03 06:22

###質問概要(追記あり)
CakePHPのバリデーションについて
フォームヘルパーから送られたパスワードの入力値(inputpass)とパスワード確認の入力値(inputpass2)をバリデーションのsameAsルールを使って一致しているかをチェックしたいのですが、
Error: TestsHelper could not be found.
というエラーがtest1ページで出力されて使えません。

==>上記は追記1で消えました。が、新たに
Error: Table "App\Model\Table\TestsTable" is not associated with "validationErrors"

というエラーが出ています。

下記に挙げるコードのどこが間違っているか、あるいは、
バリデーションの書き方をご存知の方がいればご指摘頂きたく願います。
よろしくお願いします。
###前提(追記あり)

  • SQLデータベースについて

CakePHPのSQL接続は完了し
Testsテーブルに
プライマリーキー、A_I_、のINTカラム「id」、
VARCHARカラム「inputpass」
がそれぞれ設定してあるとします。

  • ページ遷移について

indexページから、test1ページにフォームの値をPOSTで送って
test1ページで値のチェックをするとします。
そして、saveメソッド、レコード追加はtest2ページでするものとして、
test1ページでは、値のチェック、エラー表示のみを行うものとします。

  • モデルのテーブルファイル testsTable.php

testsTable.php

1<?php 2namespace App\Model\Table; 3use Cake\ORM\Table; 4 5class TestsTable extends Table{ 6 public function sameAs($a,$b) { 7 $v1 = array_shift($a); 8 $v2 = array_shift($b); 9 return $v1 == $v2; 10} 11 public $validator = [ 12 'inputpass' => [ 13 'alphaNumeric' => [ 14 'rule' => 'alphaNumeric', 15 'message' => '半角英数字のみで入力してください' 16 ], 17 'minLength' => [ 18 'rule' => ['minLength',6], 19 'message' => '6文字以上で入力してください' 20 ] 21 ], 22 'inputpass2' => [ 23 'alphaNumeric' => [ 24 'rule' => 'alphaNumeric', 25 'message' => '半角英数字のみで入力してください' 26 ], 27 'minLength' => [ 28 'rule' => ['minLength',6], 29 'message' => '6文字以上で入力してください' 30 ] 31 'sameAs' => [ 32 'rule' => ['sameAs','inputpass','inputpass2'], 33 'message' => 'パスワードが一致しません' 34 ] 35 ] 36]; 37} 38
  • コントローラ TestsController.php

TestsController.php

1<?php 2namespace App\Controller; 3 4class TestsController extends AppController { 5 public function initialize(){ 6 $this->name = 'Tests'; 7 $this->viewBuilder()->autoLayout(true); 8 $this->viewBuilder()->layout('tests'); 9 } 10 public function index(){ 11 $this->set('entity',$this->Tests->newEntity()); 12 } 13 public function test1(){ 14 if($this->request->isPost()){ 15 $this->Tests->set($this->request->data); 16 } 17 public function test2(){ 18 if ($this->request->is('post')){ 19 $hoge = $this->Tests->newEntity($this->request->data); 20 $this->Tests->save($hoge); 21 } 22 23} 24} 25

コントローラTestsController.php追記1

TestsController.php

1<?php 2namespace App\Controller; 3 4class TestsController extends AppController { 5 public function initialize(){ 6 $this->name = 'Tests'; 7 $this->viewBuilder()->autoLayout(true); 8 $this->viewBuilder()->layout('tests'); 9 } 10 public function index(){ 11 $this->set('entity',$this->Tests->newEntity()); 12 } 13 public function test1(){ 14 if($this->request->isPost()){ 15 $this->Tests->set($this->request->data); 16 $this->Tests->set($hoge); 17 }else{ 18 $error = $this->Tests->validationErrors; 19 $this->set('error',$error); 20 } 21 } 22 public function test2(){ 23 if ($this->request->is('post')){ 24 $hoge = $this->Tests->newEntity($this->request->data); 25 $this->Tests->save($hoge); 26 } 27 28} 29} 30
  • テンプレートファイル test1.ctp

test1.ctp

1<?php 2$error = array(); 3if($this->request->isPost()){ 4$this->Tests->set($this->request->data); 5$inputpass = $this->request->data('inputpass'); 6$inputpass2 = $this->request->data('inputpass2'); 7if($this->Tests->validates()){ 8header("http://hoge/test2",true,303); 9exit(); 10}else{ 11$error = $this->Tests->validationErrors; 12} 13} 14if($this->request->isPost() && !is_null($error)){ ?> 15<?=$this->Form->error('inputpass') ?> 16<?=$this->Form->error('inputpass2') ?> 17<?php } ?> 18<br> 19<a href="http://hoge/index.ctp">戻る</a> 20

テンプレートtest1.ctp追記1

test1.ctp

1<?php 2if($this->request->isPost()){ 3$this->Tests->set($this->request->data); 4$inputpass = $this->request->data('inputpass'); 5$inputpass2 = $this->request->data('inputpass2'); 6if(is_null($error){ 7header("http://hoge/test2",true,303); 8exit(); 9} 10} 11if($this->request->isPost() && !is_null($error)){ ?> 12<?=$this->Form->error('inputpass') ?> 13<?=$this->Form->error('inputpass2') ?> 14<?php } ?> 15<br> 16<a href="http://hoge/index.ctp">戻る</a> 17

###自分で調べたこと
持っているCakePHPの参考書を読み倒してみると、バリデーションメソッドsameAsというのが、存在する様に書いてあるのですが、
あまり詳しい記述がなく
そのままだと使えなかったので、
今は自分でsameAsを定義して使おうとしています。
CakePHPの記事を検索エンジンでもかなり調べたのですが、
CakePHP自体の日本語記事が少ないこともあって、
解決できるものはありませんでした。
Error: UsersHelper could not be found.と出力されますが、
ヘルパーを用意しても解決しないので、
そもそもヘルパーを用意しなくても解決できる書き方が他にあって、
自分の書き方が間違っているのではないかと考えています。

==>上記は追記1により解決しました。

新たに出ている
Error: Table "App\Model\Table\TestsTable" is not associated with "validationErrors"
というエラー出力ですが、テーブルファイルの記述が間違っているのではないかと自分では考えています。

バリデーションを入力値チェックのみのページで使う書き方をご存知の方がいればご指摘してもらえると大変助かります。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

シンタックスエラーなのでPHPの文法がおかしいんだと思いますよ。たぶん、以下のカンマではないかと。

php

1 'minLength' => [ 2 'rule' => ['minLength',6], 3 'message' => '6文字以上で入力してください' 4 ], // ここにカンマが足りない? 5 'sameAs' => [ 6 'rule' => ['sameAs','inputpass','inputpass2'], 7 'message' => 'パスワードが一致しません' 8 ]

(追記)
シンプルなバリデーションの例を書いたので参考にしてください。

正直元のコードは内容がCakephp2の書き方だったり、そもそも文法も変だったりするので、基本的なところが理解できていいないと感じました。もっと基礎的な部分からじっくり勉強して理解していったほうがいいと思いますよ。

以下のコードの内容を軽く解説しておくと、バリデーションの定義は3系では配列ではなくオブジェクトに追加します。コントローラ側でnewEntity()にデータを渡すと自動的にバリデートが動いて、エラーがあればentityのerrors()で取得できます。
エラーをテンプレート側で表示したい場合、Formヘルパーのcreateにentityを渡してあげれば、対応するinputに自動的にエラーメッセージが表示されます。Cakephpでは、規約に従えば自動的に処理が実行されるものが多くあるので、よく理解することが大切だと思います。

TestsTable.php

php

1<?php 2namespace App\Model\Table; 3 4use Cake\ORM\Table; 5use Cake\Validation\Validator; 6 7class TestsTable extends Table{ 8 9 public function validationDefault(Validator $validator) { 10 $validator 11 ->add('inputpass', [ 12 'length' => [ 13 'rule' => ['minLength', 6], 14 'message' => '6文字以上で入力してください' 15 ] 16 ]) 17 ->add('inputpass2', [ 18 'length' => [ 19 'rule' => ['minLength', 6], 20 'message' => '6文字以上で入力してください' 21 ] 22 ]) 23 ->add('inputpass2', [ 24 'sameAs' => [ 25 'rule' => [$this, 'sameAs'], 26 'message' => 'パスワードが一致しません' 27 ] 28 ]); 29 return $validator; 30 } 31 32 public function sameAs($value, $context) { 33 if($value == $context['data']['inputpass']) { 34 return true; 35 } 36 return false; 37 } 38}

TestsController.php

php

1<?php 2namespace App\Controller; 3 4class TestsController extends AppController { 5 6 public function test1() { 7 if($this->request->isPost()) { 8 $entity = $this->Tests->newEntity($this->request->data); 9 if($entity->errors()) { 10 debug('error'); 11 } else { 12 debug('success'); 13 } 14 } else { 15 $entity = $this->Tests->newEntity(); 16 } 17 $this->set(compact('entity')); 18 } 19}

test1.ctp

php

1<?= $this->Form->create($entity) ?> 2<?= $this->Form->input('inputpass') ?> 3<?= $this->Form->input('inputpass2') ?> 4<?= $this->Form->submit() ?> 5<?= $this->Form->end() ?>

投稿2017/02/03 03:25

編集2017/02/03 23:06
popobot

総合スコア6586

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

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

cookie.

2017/02/03 04:03

引き続きご指摘ありがとうございます、 質問内容の大幅修正をさせてもらいました。
popobot

2017/02/03 04:15 編集

test1.ctpにある$this->Usersがおかしいというエラーですね... ※あと、途中で質問を編集してしまうと、最初の回答との一貫性が保てないので、あまりよくないと思いました。せめて追記する形で記載してください。
cookie.

2017/02/03 04:11

すみません、質問の記述ミスです、すぐに修正しました。
cookie.

2017/02/03 04:22

>>最初の回答との一貫性が保てない 申し訳ございません。
popobot

2017/02/03 04:33

テンプレートからTestsテーブルにアクセスしようとしているのがおかしいので、Controller側に書くべきだと思います。
cookie.

2017/02/03 05:48 編集

ご指摘ありがとうございます。 コントローラ側に書いて 今度は Table "App\Model\Table\TestsTable" is not associated with "validationErrors" と出ました テーブルファイルの記述、おかしいですか?
popobot

2017/02/03 06:49

回答に追記しました。あとはご自身で自分のコードや参考資料やマニュアルを良く読み理解してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問