- ベストアンサー
時刻修正フォームとバリデーション処理
時刻を修正するフォームを作成しています。<input type="text" name="hour">のようにして、以下の条件を満たすバリデーション処理を追加することはできますか?(時間:06~24時の間、分と秒:00~59の間 半角数字のみ許可)
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
なんか、こんな感じですかね。 inputタグにtype="time"というのがあるので、それを使うと入力もしやすいしいい感じかもしれませんね。 <!-- min --> 最小時刻 max --> 最大時刻 step --> 入力可能な閾値900秒なので15分単位で入力可。消すと1分単位 上記の条件を満たせていないと、ブラウザからフロートでエラー警告をだしPOSTされない --> <input type="time" name="hour" min="06:00" max="24:00" step="900"> <?php // 以下のようにPOSTされてきたとする $_POST = [ 'date' => '2021-10-01', 'hour' => '23:59', ]; // 定数を設定する define('MIN_TIME', ['hour' => 9, 'minutes' => 0]); define('MAX_TIME', ['hour' => 23, 'minutes' => 59]); // 24時といっていましたけど23:59までですよね。 // hiddenで対象の日付を渡すなり、SESSIONで渡すなりする $targetDate = $_POST['date'] ?? null; // $targetDate = $_SESSION['date'] ?? null; // POSTされた打刻を取得 $time = $_POST['hour'] ?? null; $errorMsg = ''; try { if (empty($targetDate) || empty($time)) { // 入力値が空だった場合 throw new ValidateErrorException('正しく入力してください。'); } if (!preg_match('/^([0-9]+):([0-9]+)$/', $time, $match)) { // 入力値が既定のフォーマットではなかった場合(ざっくり) throw new ValidateErrorException('正しく入力してください'); } $hour = $match[1]; $minutes = $match[2]; $date = new DateTimeImmutable($targetDate); $begin = $date->setTime(MIN_TIME['hour'], MIN_TIME['minutes']); $finish = $date->setTime(MAX_TIME['hour'], MAX_TIME['minutes'])->modify('+1 minutes'); $input = $date->setTime($hour, $minutes); $beginDiff = $begin->diff($input); $finishDiff = $finish->diff($input); if ($beginDiff->invert === 1) { // 差分が負の値 = 最小値よりも小さい throw new ValidateErrorException(sprintf( '%02d:%02d から %02d:%02d の間で入力してください(%s)', MIN_TIME['hour'], MIN_TIME['minutes'], MAX_TIME['hour'], MAX_TIME['minutes'], 'ERROR_MIN' )); } if ($finishDiff->invert === 0) { // 差分が正の値 = 最大値と同じか、(日付生成するときに1分増やしているので 0 = 超えている) throw new ValidateErrorException(sprintf( '%02d:%02d から %02d:%02d の間で入力してください(%s)', MIN_TIME['hour'], MIN_TIME['minutes'], MAX_TIME['hour'], MAX_TIME['minutes'], 'ERROR_MAX' )); } } catch (ValidateErrorException $e){ // 自分で設定した、バリデーションエラー時のException $errorMsg = $e->getMessage(); } catch (Exception $e) { // DateTimeで入力不可能なフォーマットが入力された場合 $errorMsg = sprintf( '%02d:%02d から %02d:%02d の間で入力してください', MIN_TIME['hour'], MIN_TIME['minutes'], MAX_TIME['hour'], MAX_TIME['minutes'] ); } echo '=== 入力された値 ========' . PHP_EOL; print_r($_POST); if (!empty($errorMsg)) { echo 'バリデーションエラー' . PHP_EOL; echo $errorMsg; } else { echo 'バリデーション成功' . PHP_EOL; echo $input->format('Y-m-d H:i'); } class ValidateErrorException extends Exception { }