CodeIgniterのバリデーションルールで他のPOST値を参照する


CodeIgniterのset_rulesは便利ですが、このような形

日付
<input type="number" name="year">
<input type="number" name="month">
<input type="number" name="day">

の入力項目があった場合、set_rulesは基本的に単一のPOST値に対してのバリデーションなので
例えば存在しない日付を入力していないかのチェックは難しいかと思います
(配列のnameにすればいけないこともないですが、、)

その場合はset_rulesで第二引数を利用して、他のPOST値のnameを橋渡しします。

やり方

第二引数を利用する場合は、ルール名の後に[]を記述し、そこに引数の中身をいれてください
第三引数は設定できませんので、今回はカンマ区切りで疑似的な配列指定をします

callback_check_dateはコントローラー内に記述した独自ルール
$this->form_validation->set_rules('year', '年', 'required|trim|numeric|callback_check_date[month,day]');
$this->form_validation->set_rules('month', '月', 'required|trim|numeric');
$this->form_validation->set_rules('day', '日', 'required|trim|numeric');

コールバック関数の中身はこちらになります。

set_rulesを記載したコントローラーと同じところに記述
// MNPの有効期限チェック
function check_date ( $year, $params ) {

  // 月と日のnameが入っている
  @list($month_key, $day_key) = explode(',', $params);
  // 月の日のデータ
  @list($month, $day) = [$this->input->post($month_key) ?? '', $this->input->post($day_key) ?? ''];
  // 空白もしくは入力なしの場合、チェックをスルー
  if( count( array_filter([$year, $month, $day], function ($val) { return empty($val); }) ) != 0 ) {
    return true;
  }
  // 日付形式が間違っている
  if(!@checkdate($month, $day, $year)) {
    $this->set_message('check_date', '日付の形式が間違っています');
    return false;
  }

  return true;
}

第二引数でrurlesで指定したmonthとdayのname名を受け取り
POSTの中身を確認。記載されていれば日付チェックを行う形になります。
今回はnameの名前でしたが、変数の値などを引数にいれてチェックなどもできますので
callback内でDBを参照して、入力値の何かしらをチェックなども行えそうです。