CodeIgniterバリデーション完全攻略!条件付きルールの設定方法を優しく解説
生徒
「CodeIgniterで、例えば『チェックボックスにチェックを入れた時だけ、この入力欄を必須にする』みたいなことってできますか?」
先生
「もちろんです!それを『条件付きバリデーション』と呼びます。特定の状況に合わせてルールを切り替える便利な機能ですよ。」
生徒
「難しそうですが、初心者でも実装できるでしょうか?」
先生
「仕組みさえ分かれば意外と簡単です。プログラムの書き方を一つずつ丁寧に学んでいきましょう!」
1. バリデーションと条件付きルールとは?
まずは「バリデーション」という言葉について説明します。バリデーションとは、日本語で言うと「入力チェック」のことです。 例えば、会員登録フォームでメールアドレスが正しく入力されているか、パスワードの文字数が足りているかなどを確認する作業を指します。
そして、今回学習する「条件付きバリデーション」とは、ある条件が満たされた時だけ、特定のルールを発動させる仕組みのことです。 日常生活で例えるなら、「雨が降っている時だけ、傘を持っていく」という判断と同じです。 ウェブサイトのフォームでも、「アンケートに回答するボタンを押した人だけ、感想欄を必須にする」といった賢い動きを作ることができます。
CodeIgniter(コードイグナイター)というPHPのフレームワーク(便利な道具箱のようなもの)を使うと、この複雑な仕組みをとてもスッキリと記述することができます。 初心者の方は、まず「もし~だったら、このルールを適用する」という流れをイメージすることから始めてみましょう。
2. 基本のバリデーション設定をおさらい
条件付きの前に、まずは普通のバリデーションがどう動くかを確認しましょう。
CodeIgniter4では、validate() という命令を使ってチェックを行います。
下記のコードは、名前とメールアドレスが必ず入力されているか(必須入力)を確認する、最もシンプルなプログラムの例です。
// コントローラー内での記述例
$rules = [
'username' => 'required',
'email' => 'required|valid_email',
];
if (!$this->validate($rules)) {
// 入力エラーがある場合の処理
return view('signup', ['validation' => $this->validator]);
}
ここで出てくる required は「必須」、valid_email は「正しいメール形式か」というルールです。
これらのキーワードを指定するだけで、自動的に中身をチェックしてくれるのがCodeIgniterの素晴らしいところです。
3. required_withoutを使った条件付きチェック
ここからが本題の「条件付き」です。よくあるパターンに「電話番号かメールアドレスの、どちらか一方は必ず入力してほしい」というものがあります。
これを実現するために required_without というルールを使います。
これは「もし〇〇が入力されていなければ、自分は必須になる」というルールです。
// 電話番号がなければメールを必須にし、メールがなければ電話番号を必須にする設定
$rules = [
'phone' => 'required_without[email]',
'email' => 'required_without[phone]|valid_email',
];
if ($this->validate($rules)) {
echo "チェック成功です!";
}
このコードでは、ユーザーがメールアドレスを入力し忘れても、電話番号さえ書いてあればエラーになりません。
逆に両方とも空っぽだと、「どちらか書いてください」と怒られる仕組みになります。
これを手書きのPHPプログラムで作ろうとすると、if文が複雑になりますが、CodeIgniterなら一行で書けてしまいます。
4. 別の項目の値によってルールを変える方法
次に、より高度な「特定の文字が入力されたら、別の項目をチェックする」という方法を解説します。 例えば、「支払い方法で『クレジットカード』を選んだ時だけ、カード番号を必須にする」という場面です。
これには required_if というルールを使います。使い方は required_if[項目の名前, 値] という形式です。
// 支払い方法(pay_method)が「card」の時だけ、カード番号を必須にする
$rules = [
'pay_method' => 'required',
'card_number' => 'required_if[pay_method,card]|min_length[16]',
];
if (!$this->validate($rules)) {
// エラー時のメッセージ表示など
echo "カード番号を入力してください";
}
この min_length[16] というのは「最低でも16文字必要」という意味です。
このように、複数のルールを縦棒 | でつなげて書くことができます。
条件に合致しない場合(例えば現金払いを選んだ場合)は、このカード番号のチェック自体が無視されるので、空欄のままでも次に進めます。
5. 動的にバリデーションルールを追加するテクニック
あらかじめルールを決めておくだけでなく、プログラムの途中で「やっぱりこのルールも追加しよう!」と変更することも可能です。 初心者の方には少し難しく感じるかもしれませんが、PHPの「配列(データのリスト)」を操作する感覚で覚えられます。
例えば、ログインしているユーザーの種類(管理者か一般ユーザーか)によって、入力ルールをガラッと変えたいときに使います。
// まずは共通のルールを作る
$rules = [
'title' => 'required',
];
// もし「管理者」として操作しているなら、パスワード入力を必須に追加する
if ($user_role === 'admin') {
$rules['admin_password'] = 'required|min_length[8]';
}
if ($this->validate($rules)) {
// 処理実行
}
このように、PHPの if 文を使って、$rules という変数の中身を書き換えることで、状況に応じた柔軟なチェックが可能になります。
これをマスターすると、一つのフォームで複数の役割を持たせることができるようになります。
6. エラーメッセージの日本語化とカスタマイズ
バリデーションでエラーが起きた際、標準では英語でメッセージが表示されることが多いです。 しかし、日本のユーザー向けにサービスを作るなら「名前は必須です」といった分かりやすい日本語を出したいですよね。
CodeIgniterでは、ルールの設定と一緒に、エラー時のメッセージも自分で決めることができます。
$rules = [
'username' => [
'label' => 'ユーザー名',
'rules' => 'required',
'errors' => [
'required' => '{field}を入れ忘れていますよ!',
],
],
];
if (!$this->validate($rules)) {
// 画面に「ユーザー名を入れ忘れていますよ!」と表示されます
}
{field} と書いた部分は、自動的に「ユーザー名(labelで指定した名前)」に置き換わります。
初心者の方でも、ここを書き換えるだけで、まるでお喋りしているような親切なサイトを作ることができます。
「エラー=怖い」というイメージを、優しいメッセージで和らげてあげましょう。
7. フォーム(HTML)側での準備
プログラム側でバリデーションを作っても、入力する場所(フォーム)がなければ意味がありません。 HTMLという言葉を使って、ユーザーが文字を打ち込む箱を作ります。
ここでは、Bootstrap(ブートストラップ)というデザインの枠組みを使った、綺麗な入力フォームの例を紹介します。
<form action="/save" method="post">
<div class="mb-3">
<label for="username" class="form-label">お名前</label>
<input type="text" name="username" class="form-control" id="username">
</div>
<div class="mb-3">
<label for="email" class="form-label">メールアドレス</label>
<input type="email" name="email" class="form-control" id="email">
</div>
<button type="submit" class="btn btn-primary">送信する</button>
</form>
name="username" という部分が重要です。
PHPプログラムは、この「名前(name)」を頼りにして、「お名前の箱に何が書かれているかな?」と中身をチェックしに行きます。
HTMLとPHPが、この名前を通じてバトンタッチをしているイメージですね。
8. バリデーションが失敗した時の動き
もしユーザーが何も入力せずに送信ボタンを押してしまったらどうなるでしょうか。 プログラムは「エラーがあるよ!」と判断し、再び入力画面に戻してあげる必要があります。
このとき、せっかく途中まで入力した内容が消えてしまうと、ユーザーはガッカリしてしまいます。
CodeIgniterには old() という便利な機能があり、前に入力した内容を覚えておくことができます。
これがあるだけで、ユーザーは「間違えたところだけ直せばいいんだ」と安心できます。 親切なサイト制作には欠かせないテクニックです。 条件付きバリデーションと組み合わせて、ストレスのないフォーム作りを目指しましょう。
9. まとめとして知っておきたいこと
ここまで、CodeIgniterでの条件付きバリデーションについて学んできました。 一見難しそうに見えるプログラミングも、言葉の意味を一つずつ紐解いていけば、決して魔法ではありません。
「もし~なら(if)」という考え方は、プログラムの基本中の基本です。 バリデーションを通じてこの考え方に慣れていくことで、PHPそのものの理解も深まっていくはずです。 まずは小さなフォームから作ってみて、実際にエラーメッセージが出る感動を味わってみてください。
一度に全部覚えようとしなくて大丈夫です。必要なときに、この解説を何度も読み返して、少しずつ自分のものにしていきましょう。 プログラミングの世界は、試行錯誤の繰り返しで上達していくものです。