Cakephp PHP WEB開発

【Cakephp4】SQLSTATE[22003]: Numeric value out of range: 1264 Out of range value for column

※本サイトはPR表記を含みます。

フォーム作成の際、例えば、DBカラムの最大値 int(11) 数値にすると int(11) の最大値は 2147483649。そして、最小値は -2147483648

許容範囲を超えて、保存しようとすると以下のようなデータベースエラーが発生します。

 error
SQLSTATE[22003]: Numeric value out of range: 1264 Out of range value for column {カラム名} at row 1

こうした場合、根本的な解決にはなりませんが、簡単な入力制限をするにはインプットフィールドに maxlenth 属性を付与することが考えられます。
ですが、入力の桁数的に自由さを保ちたい場合、そして正しくは、本来は厳密に値を検証(バリデート)させるのがよいと思います。

そこで以下、int(11) の許容値の入力バリデートの実装方法です。

Cake4: int(11)の許容値の検証を行う

/**
* デフォルトバリデーション
*
* @param \Cake\Validation\Validator $validator A Validator instance
* @return \Cake\Validation\Validator
*/
public function validationDefault(Validator $validator): Validator
{
    $validator
        ->notEmptyString('money', '金額を入力してください')
        ->add('money', 'custom', [
             'rule' => function ($value) {
                 // int(11)の許容値: 2147483647 ~ -2147483648
                 return (int)$value <= 2 ** 31 - 1 && (int)$value >= -2 ** 31;
            },
            'message' => '数値範囲外です',
        ]);

    return $validator;
}

こうすること厳密に int(11) の許容値を超えた場合は正しく数値範囲外エラーを判定することができます。

MySQL: 整数型 (真数値) - INTEGER、INT、SMALLINT、TINYINT、MEDIUMINT、BIGINT

https://dev.mysql.com/doc/refman/8.0/ja/integer-types.html

-Cakephp, PHP, WEB開発
-,