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

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

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

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

Q&A

解決済

1回答

859閲覧

【CakePHP】パスワードのバリデーションが一切効かない

pecchan

総合スコア555

CakePHP

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

0グッド

0クリップ

投稿2019/02/26 02:57

編集2019/02/26 11:08

cakephp(2.7.8)
PHP 5.6
MySQL 5.6

CekePHPにて以下のようなシンプルな会員登録ページを作りました。

1.メールアドレスを入力すると、仮登録され、メールアドレスにリンク先が送られる
2.リンク先を開き、名前とパスワードを入力すると本登録が完了する

2で、パスワードのバリデーションが一切通りません。
必須入力、半角英数字、8文字以内と設定しているのですが、空白や全角でも通ってしまいます。
単純な記述ミスと思うのですが分かりません。

どこがおかしいのでしょうか?

宜しくお願い致します。

SignupController.php

PHP

1<?php 2//サインアップコントローラ 3App::uses('AppController', 'Controller'); 4App::uses('CakeEmail', 'Network/Email'); 5App::uses('SimplePasswordHasher', 'Controller/Component/Auth'); 6 7class SignupController extends AppController { 8 9 public $name = 'Signup'; 10 public $uses = array('User'); 11 public $components = array('Auth','Session');//ユーザー登録完了後にログイン状態にするためAuthコンポーネントを使用する 12 13 14 15 16 public function beforeFilter(){ 17 18 parent::beforeFilter(); 19 20 $this->Auth->allow(); //このコントローラでは、全てのアクションが非ログイン状態で実行される 21 22 $this->set('title', '会員登録'); 23 } 24 25 26 27 28 public function index(){ 29 30 //POSTされていない場合はメールアドレス入力画面を表示 31 if(! $this->request->data){ 32 $this->render(); 33 return; 34 } 35 36 //$this->set('title', '会員登録'); 37 38 $this->User->validate = array( 39 'email' => array( 40 array( 41 //'rule' => 'notEmpty', 42 'rule' => 'notBlank', 43 'message' => 'メールアドレスを入力してください' 44 ), 45 array( 46 'rule' => array('custom', '/^.+@.+$/'), 47 'message' => 'メールアドレスの形式が正しくありません' 48 ), 49 array( 50 'rule' => 'confirm', 51 'message' => 'メールアドレスが一致していません' 52 ), 53 array( 54 'rule' => 'isUniqueAndActive', 55 'message' => 'すでに使用されています' 56 ) 57 ) 58 ); 59 60 61 62 $this->User->set($this->request->data); 63 64 //仮登録中のユーザーがあれば、そのレコードを利用する 65 if(! $this->User->invalidFields()){ 66 67 $email = $this->request->data['User']['email']; 68 $activation_code = md5($email.time()); 69 70 $user = $this->User->find('first',array( 71 'conditions' => array('email' => $email,'is_active' => false) 72 )); 73 74 75 if(! $user){ 76 $this->User->create(); 77 $user = array('User' => $this->request->data['User']); 78 } 79 80 $user['User']['is_active'] = false; 81 $user['User']['activation_code'] = $activation_code; 82 $this->User->save($user); 83 84 85 86 87 $cakemail = new CakeEmail('activation'); 88 $cakemail->to($email); 89 $cakemail->subject('仮登録のお知らせ'); 90 $cakemail->send(sprintf('https://kakomon.work/Signup/activate/%s',$activation_code)); 91 92 $this->render('email_sent'); 93 } 94 95 96 97 98 } 99 100 /* 101 *アクティベーションを行う 102 */ 103 public function activate($activation_code){ 104 105 //まだアクティベーションされていないユーザーを取得 106 $user = $this->User->find('first',array( 107 'conditions' => array( 108 'activation_code' => $activation_code, 109 'is_active' => false 110 ) 111 )); 112 113 //見つからなかった場合、処理を抜ける 114 if(! $user){ 115 $this->redirect('/Signup/index'); 116 } 117 118 119 120 //POSTされていない場合はメールアドレス入力画面を表示 121 if(! $this->request->data){ 122 $this->render(); 123 return; 124 } 125 126 127 //バリデーションの用意 128 $this->User->validate = array( 129 'password' => array( 130 array( 131 //'rule' => 'notEmpty', 132 'rule' => 'notBlank', 133 'message' => 'パスワードを入力してください' 134 ), 135 array( 136 'rule' => array('custom','/^[a-zA-Z0-9]+$/'), 137 'message' => '半角英数字で入力してください' 138 ), 139 array( 140 'rule' => 'confirm', 141 'message' => 'パスワードが一致していません' 142 ), 143 array( 144 'rule' => array('minLength',8), 145 'message' => '8文字以上入力して下さい' 146 ) 147 ) 148 ); 149 150 $this->User->validate = array( 151 'name' => array( 152 array( 153 //'rule' => 'notEmpty', 154 'rule' => 'notBlank', 155 'message' => 'お名前を入力してください' 156 ), 157 array( 158 'rule' => array('isUniqueName',-1), 159 'message' => 'こちらのお名前は、すでに使用されています' 160 ) 161 ) 162 ); 163 164 $this->User->set($this->request->data); 165 166 167 168 //パスワードが正しく入力されてたのでDBにパスワードを保存する 169 if(! $this->User->invalidFields()) 170 { 171 172 $user['User']['name'] = $this->request->data['User']['name']; 173 174 $passwordHasher = new SimplePasswordHasher(); 175 176 $user['User']['password'] = $passwordHasher->hash( 177 $this->request->data['User']['password'] 178 ); 179 180 unset($user['User']['password_confirm']); 181 $user['User']['is_active'] = true; 182 183 //セッションにidをセット 184 $this->Session->write('user_id', $user['User']['id']); 185 186 187 //パスワードが暗号化されており確認用パスワードと一致しなくなっているのでバリデーションを解除して登録 188 $this->User->validate = array(); 189 $this->User->save($user); 190 191 //ログイン状態にして完了URLへ飛ばす 192 $this->Auth->login($user); 193 194 195 //$this->redirect($this->Auth->redirectUrl()); 196 $this->redirect('/MyPages/index');//マイページへ 197 } 198 199 200 201 } 202 203} 204

activate.ctp

PHP

1<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script> 2<script src="../js/bootstrap.min.js"></script> 3<?php echo $this->Html->css('kakomon'); ?> 4<?php echo $this->element('header'); ?> 5 6<div class="container"> 7 <div class="row"> 8 <div class="col col-md-12"> 9 <h2>会員登録</h2> 10 </div> 11 </div> 12 13 14 <div class="row"> 15 <div class="col-md-6"> 16 <div class="form-login"> 17 18 19 20 21 <?php echo ($this->Form->create()); ?> 22 <div style="display:none;"> 23 <input type="hidden" name="_method" value="POST"/> 24 </div> 25 26 <p>お名前(ニックネーム)を入力してください。</p> 27 28 <div class='name'> 29 <?php 30 echo($this->Form->text('User.name',array('class' => 'form-control input-sm chat-input', 'placeholder' => 'お名前(ニックネーム)'))); 31 echo($this->Form->error('User.name')); 32 ?> 33 </div> 34 35 <br> 36 37 <p>ログインに使用するパスワードを入力してください。</p> 38 39 <div class='password'> 40 <?php 41 42 echo($this->Form->text('User.password',array('class' => 'form-control input-sm chat-input', 'placeholder' => 'パスワード'))); 43 echo($this->Form->error('User.password')); 44 ?> 45 </div> 46 47 <div class='password-confirm'> 48 <?php 49 50 echo($this->Form->text('User.password_confirm',array('class' => 'form-control input-sm chat-input', 'placeholder' => 'パスワード(確認)'))); 51 ?> 52 </div> 53 54 <br> 55 56 <input type="submit" value="送信" class="btn btn-primary btn-md"/> 57 58 </form> 59 </div> <!-- form end --> 60 </div> <!-- col end --> 61 </div> <!-- row end --> 62 63 64 65 66 67</div><!-- container end --> 68 69 70<?php echo $this->element('footer'); ?> 71 72

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

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

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

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

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

m.ts10806

2019/02/26 03:23

お名前 のほうは問題なしですか?
pecchan

2019/02/26 03:28

失礼しました。はい。お名前の方は問題なしでした。
m.ts10806

2019/02/26 03:46

上書きっぽいなと思いつつ、もしかしたらCakePHPではそのような設定の仕方をするのかなと聞いてみました(お名前だけ問題無しなら上書き、お名前も問題ありなら設定の仕方自体)。上書きでしたね。 解決されたようで何よりです。
maisumakun

2019/02/26 04:32

本題ではありませんが、「バリデーションが通らない」といった場合、この例とは正反対に「バリデーションで全てエラーになる」ということを意味します。 「バリデーションが効かない」としたほうがいいでしょう。
pecchan

2019/02/26 11:11 編集

maisumakun様 なるほど。すみません。 「効かない」に変更させていただきました。
pecchan

2019/02/26 11:10

mts10806様 有難う御座いました。
guest

回答1

0

ベストアンサー

php

1 //バリデーションの用意 2 $this->User->validate = array( 3 'password' => array( 4 array( 5 //'rule' => 'notEmpty', 6 'rule' => 'notBlank', 7 'message' => 'パスワードを入力してください' 8 ), 9 array( 10 'rule' => array('custom','/^[a-zA-Z0-9]+$/'), 11 'message' => '半角英数字で入力してください' 12 ), 13 array( 14 'rule' => 'confirm', 15 'message' => 'パスワードが一致していません' 16 ), 17 array( 18 'rule' => array('minLength',8), 19 'message' => '8文字以上入力して下さい' 20 ) 21 ) 22 ); 23 24 $this->User->validate = array( 25 'name' => array( 26 array( 27 //'rule' => 'notEmpty', 28 'rule' => 'notBlank', 29 'message' => 'お名前を入力してください' 30 ), 31 array( 32 'rule' => array('isUniqueName',-1), 33 'message' => 'こちらのお名前は、すでに使用されています' 34 ) 35 ) 36 );

これだと、せっかく先に代入したpasswordのバリデーション設定を、nameのバリデーション設定で「上書き」する形になっているので、nameの方のバリデーションしか動かなさそうです。

まとめて設定すれば良いのではないでしょうか?

php

1 //バリデーションの用意 2 $this->User->validate = array( 3 'password' => array( 4 array( 5 //'rule' => 'notEmpty', 6 'rule' => 'notBlank', 7 'message' => 'パスワードを入力してください' 8 ), 9 array( 10 'rule' => array('custom','/^[a-zA-Z0-9]+$/'), 11 'message' => '半角英数字で入力してください' 12 ), 13 array( 14 'rule' => 'confirm', 15 'message' => 'パスワードが一致していません' 16 ), 17 array( 18 'rule' => array('minLength',8), 19 'message' => '8文字以上入力して下さい' 20 ) 21 ), 22 'name' => array( 23 array( 24 //'rule' => 'notEmpty', 25 'rule' => 'notBlank', 26 'message' => 'お名前を入力してください' 27 ), 28 array( 29 'rule' => array('isUniqueName',-1), 30 'message' => 'こちらのお名前は、すでに使用されています' 31 ) 32 ) 33 );

投稿2019/02/26 03:23

mix-peach

総合スコア1910

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

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

pecchan

2019/02/26 03:29

上書きされていたわけですね。 気付きませんでした。 有難う御座います。助かりました(><)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問