CakePHPのバリデーションルールに「between」というルールがあります。これは指定した2つの値の範囲に収まっているかチェックするルールなのですが、注意しないとバーリデーションに引っ掛からないでスルーしてしまう時があります。下記にその理由を明記しておきます。

 まず、公式ドキュメントでbetweenルールを見てみると

データの長さが整数で指定された範囲におさまっていることを確認します。最小値と最大値は必須です。「<」ではなく「<=」が使用されます。

と書かれています。この時に注意しないといけないのが「データの長さが整数で」という部分です。betweenはその名の通り、指定した2つの値に入っているかをチェックするのですが、チェックする値は「長さ」を見るということです。

 例えば、最小値が「1」で最大値が「8」の場合、「さようなら」ならOKですが、「おはようございます」は9文字なのでNGです。しかし、同じ最大値、最小値で「20」をチェックするとOKとなってしまいます。その理由は「20」は文字数で2つになるからです。

 /cake/libs/validation.php のファイルを見てみると

function between($check, $min, $max) {
	$length = mb_strlen($check);
	return ($length >= $min && $length <= $max);
}

と書かれていて、mb_strlen関数でしっかり長さをチェックしています。(上記ソースはバージョン1.3で、1.2の場合はstrlen関数を使用しています)。ちなみに「minLength」や「maxLength」も同様です。

対策としては下記のようなオリジナルのルールを自作する必要があります。

function getIntBetween($data, $field_name, $min, $max) {
	return ($data[$field_name] >= $min && $data[$field_name] <= $max);
}

もし、「えっ!そうなの!」という方は今までのソースを一度チェックした方がいいかもしれませんね。