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

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

ただいまの
回答率

88.09%

isUniqueが効きません!!!cakephp2.6.4でのバリデーション

受付中

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 3,696

score 176

何度も投稿すみません。みなさんお疲れ様です。
現在僕は何度もisUniqueがちゃんと聞く方法はないか調べています。
新規のユーザー登録でバリデーションをつかっているのですが、alphaNumericとbetweenは効くくせに
isUniqueはびくともしません。いろいろ試しましたが効きません。憎いです。
現在のAdminUser.phpとAppModel.phpはこんな感じになってます。
どなたか本当にご助言をお願いします。

AdminUser.php
<?php
App::uses('AuthComponent', 'Controller/Component');

class AdminUser extends AppModel {

    var $name = 'AdminUser';

    var $validate = array(
        'username' => array(
            'unique' => array(
                'rule' => array('isUnique'),
                'message' => '既に使用されている名前です'
            ),
            'alphaNumeric' => array(
                'rule' => array('alphaNumeric'),
                'message' => '名前は半角英数字にしてください'
            ),
            'between2and32' => array(
                'rule' => array('between', 2, 32),
                'message' => '名前は2文字以上32文字以内にしてください'
            )
        ),
        'password' => array(
            'between2and32' => array(
                'rule' => array('between', 8, 32),
                'message' => 'パスワードは8文字以上32文字以内にしてください'
            )
        )
    );

   //パスワードをハッシュ化して保存するために下記を追加
   public function beforeSave($options = array()) {
     $this->data['AdminUser']['password'] = AuthComponent::password($this->data['AdminUser']['password']);
     return true;
   }
}

AppModel.php
<?php
/**
 * Application model for CakePHP.
 *
 * This file is application-wide model file. You can put all
 * application-wide model-related methods here.
 *
 * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
 * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the LICENSE.txt
 * Redistributions of files must retain the above copyright notice.
 *
 * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 * @link          http://cakephp.org CakePHP(tm) Project
 * @package       app.Model
 * @since         CakePHP(tm) v 0.2.9
 * @license       http://www.opensource.org/licenses/mit-license.php MIT License
 */

App::uses('Model', 'Model');

/**
 * Application model for Cake.
 *
 * Add your application-wide methods in the class below, your models
 * will inherit them.
 *
 * @package       app.Model
 */
class AppModel extends Model {
    function __construct($id = false, $table = null, $ds = null) {
        $cake_env = Configure::read('cake_env');
        if (empty($cake_env)) {
            $this->useDbConfig = 'default';
        } else {
            $this->useDbConfig = $cake_env;
        }
        parent::__construct($id, $table, $ds);
    }

    public function alphaNumeric($check) {
        $value = array_values($check);
        $value = $value[0];
        return preg_match('/^[a-zA-Z0-9]+$/', $value);
    }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

+2

未確認で申し訳ございませんが、以下のようにするといかがでしょうか?
入力必須の場合はrequiredとallowEmptyを付けます。
'required'=>true,
'allowEmpty'=>false,

それと、各arrayにkey名は不要です。(有っても大丈夫だと思います)

var $validate = array(
    'username' => array(
        array(
            'rule' => 'isUnique',
            'required'=>true,
            'allowEmpty'=>false,
            'message' => '既に使用されている名前です'
        ),
        array(
            'rule' => 'alphaNumeric',
            'message' => '名前は半角英数字にしてください'
        ),
        array(
            'rule' => array('between', 2, 32),
            'message' => '名前は2文字以上32文字以内にしてください'
        )
    ),
    'password' => array(
        array(
            'rule' => array('between', 8, 32),
            'required'=>true,
            'allowEmpty'=>false,
            'message' => 'パスワードは8文字以上32文字以内にしてください'
        )
    )
);

追記:
'rule'=>array('isUnique') は 'rule'=>'isUnique' にします。alphaNumericも。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/04 19:57 編集

    それと、alphaNumericは日本語入力で意図しない動作になります。検索すると沢山出てきます。「CakePHP alphaNumeric」で検索。

    キャンセル

  • 2015/08/04 20:03

    回答ありがとうございます!
    試してみましたが、また効いてくれませんでした。。。

    キャンセル

  • 2015/08/04 20:04

    現在alphaNumericは効いています

    キャンセル

  • 2015/08/04 20:27 編集

    それでは以下はいかがでしょうか?
    当方ではisUniqueを各所で使用して問題無く動作しています。
    実際に使用しているコードにはnotEmptyルールが先に付いていました。

    array(
      'rule' => 'notEmpty',
      'required' => true,
      'allowEmpty' => false,
      'message' => '名前を入力して下さい'
    ),
    array(
      'rule' => 'isUnique',
      'message' => '既に使用されている名前です'
    ),

    (ネスト表示の為全角ブランク使用していますのでコピペにはご注意ください。)

    キャンセル

+1

'unique' => array(
                'rule' => 'isUnique',
                'message' => '既に使用されている名前です'
            ),
rule名を配列内にしないで、上記のようにするとどうなりますでしょうか。
これはパラメータを必要としないrule全般の話になります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/04 19:47

    同じです。効きません泣

    キャンセル

+1

ん、usernameというのはAdminUserテーブルのカラム名ですか?

カラム名と違うとisUniqueは効かなかった記憶があります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/04 20:22

    mongodbをつかっているので
    usernameはAdminUserコレクションの中にあるフィールド名ですね。
    他のbetweenやalphaNumericは効いているのであっていると思います。

    キャンセル

  • 2015/08/04 22:45

    おそらくご存知のことだとは思いますが…

    betweenやalphaNumericは、入力された値のみに対して働くので名前はぶっちゃけなんでもいいです。
    ただしisUniqueは「入力された値がそのフィールド名の中に存在するか」を実際に検索するので、フィールド名が違えば当然のことながら「該当なし」となり常にTRUEが返ってきます。
    (例えばですが、実際のフィールド名がusernameではなくuser_nameだった場合とか…)
    ですので、betweenやalphaNumericが効いているからと言って、フィールド名とバリデーションチェックをかける値のname属性が一致しているとは限りません。

    というわけで今一度フィールド名をチェックしてみてはいかがでしょうか。

    キャンセル

+1

何のRDBMSをご使用頂いているかわかりませんが、usernameカラムにユニーク制約は設定されていますでしょうか?(解決するかはわかりませんが。。)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

アソシエーションでくっつけるため。
public $primaryKey = 'username';としていたせいで、
isUniqueがうまく作動しませんでした。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.09%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る