SHINYA TECH

公務員(行政職)から34歳でエンジニア転職した人

#16 PHPで日付の入力をチェックする方法

f:id:kshinya-tech:20220225121909p:plain

フォーム欄にユーザが入力を行う際、作り手の意図に沿わない入力が行われる可能性があります。

そこで、作り手の意図に沿わない入力が行われた際に、アラートメッセージを表示し、処理が進まないようにする必要があります。(バリデーションと言います。)

今回は、日付の入力に関するバリデーションを学びましたので、アウトプットします。

エラーとなる条件

今回、エラーとなる条件は以下のとおり定めました。

  1. 空欄の場合、エラーとする。
  2. 日付の形式(YYYY-MM-DD)でない場合にエラーとする。
    • 例えば、文字列が入力された場合など
  3. ありえない日付の場合にエラーとする。
    • 例えば、2022-02-30など

使用する関数

checkdate()

  • 日付が正しいかチェックしてくれる。
  • 引数を(月,日,年)の順番で指定する必要がある点に留意。

www.php.net

explode()

  • 特定の文字列によって、文字列を分割して、配列として格納してくれる。

www.php.net

サンプルコード

以下は、ユーザが会社の創業日(establishment_date)を入力し、連想配列$company['establishment_date']に格納されているとしている。

<?php
function validate($company)
{
    $errors = [];

    // checkdate()を使用するため、'-'で日付を区切って配列として格納
    // 例)2020-10-8 -> 2020 10 8 に分割する
    $dates = explode('-', $company['establishment_date']);
 
    // 空欄の場合エラーとする
    if (!strlen($company['establishment_date'])) {
        $errors['establishment_date'] = '設立日を入力してください';

    // $datesの配列の数が3でない場合(つまり、YYYY-MM-DDではない場合)にエラーとする
    } elseif (count($dates) !== 3) {
        $errors['establishment_date'] = '設立日を正しい形式で入力してください';

    // ありえない日付のときに、エラーとする
    // checkdateの引数は(月,日,年)とする必要があるため、以下のようにする
    } elseif (!checkdate($dates[1], $dates[2], $dates[0])) {
        $errors['establishment_date'] = '設立日を正しい日付で入力してください';
    }
    
    return $errors;
}