1

時間データを含むいくつかのフィールドを持つオンライン フォームがあります。このデータを MySQL データベースのtimeフィールドに格納します。これには format が必要ですhh:mm:ss。ユーザーがこの形式で時間を正しく入力した場合、データを受け入れたいと思います。また、ユーザーが米国標準時間で時刻を入力できるようにしたいと考えてい9:30 amます。11:25 pm10:27 am

基本的に、最初に時刻が適切なデータベース形式であるかどうかをテストし ( hh:mm:ss)、そうでない場合は、2 番目に受け入れられた形式であるかどうかをテストし ( hh:mm am/pm)、そうである場合は、PHP 関数strtotime()を使用して変換します。それをデータベースの時刻形式に変換します。これらの形式のいずれでもない場合は、エラー メッセージを表示して終了します。

変数の値がこれらの時間形式のいずれかに一致するかどうかをテストする方法を知っている人はいますか?

私がやりたいことの疑似PHPコード:

<?php
    $value = //some time;
    if (is_database_time($value)){
        // good no problem
    }else if (is_usa_time($value)){
        $value = strtotime($value);
    }else{
        die("error incorrect time format, try again.");
    }
?>

** 編集 **

助けてくれてありがとう。ここの情報の一部を使用して、完全に機能する関数を作成しました。

<?php
    function filter_time($key,$value){
        // this section handles the storage of time data
        if (preg_match('/^(0?\d|1\d|2[0-3]):[0-5]\d:[0-5]\d$/', $value)){
            //do nothing
        }else if (preg_match('/^(0?\d|1[0-2]):[0-5]\d\s(am|pm)$/i', $value)){
            $value = date( 'H:i:s', strtotime($value));
        }else{
            display_error('incorrect time format in '.$key.' field.');
        }
        return $value;
    }
?>
4

3 に答える 3

9

関数 verify_time_format()

function verify_time_format ($value) {

  $pattern1 = '/^(0?\d|1\d|2[0-3]):[0-5]\d:[0-5]\d$/';
  $pattern2 = '/^(0?\d|1[0-2]):[0-5]\d\s(am|pm)$/i';
  return preg_match ($pattern1, $value) || preg_match ($pattern2, $value);

}

次の値に対してTRUEを返します。

2:03:32
02:03:32
23:59:59
15:23 AM
15:23 am
09:41 pm
9:41 PM
etc...

アップデート:

function filter_time ($key, $value) {

  $p1 = '/^(0?\d|1\d|2[0-3]):[0-5]\d:[0-5]\d$/';
  $p2 = '/^(0?\d|1[0-2]):[0-5]\d\s(am|pm)$/i';

  if (preg_match ($p1, $value) || preg_match ($p2, $value))
    $res = date ('H:i:s', strtotime ($value));

  else
    display_error ("incorrect time format in {$key} field.");

  return $res;

}
于 2012-03-23T16:03:46.473 に答える
3

既にstrtotimePHP から を使用しており、指定した値に対して特定の形式を強制する必要はありません。

テストして確認したいのは、フィールドが数字、コロン、および Wh1T3h4Ck5 の回答のように午前または午後のみで検証されることです。

これを行うと、コードは次のようになります。

<?php

  function valid_time($value) {//Wh1T3h4Ck5's function
    return preg_match('/^(0?\d|1[0-2]):[0-5]\d\s(am|pm)$/i', $value);
  }

  $value = //some time;
  if (vald_time($value)){
    $time_value = strtotime($value);
    echo $time_value;
  }else{
    die("Error incorrect time format, try again.");
  }
?>

より洗練された解決策は、フォームが送信される前に Jquery/Javascript を使用することです。PHP スクリプトに送信する前に、不適切な形式をテストしてユーザーに警告することができます。ただし、必要に応じて他のセーフガードを使用して、PHP スクリプトの検証もそのままにしておきます。

于 2012-03-23T16:28:46.263 に答える
1

正規表現を使用すると、問題を非常に簡単に解決できます。例えば:

<?php
  $databaseTimePattern = '/^(0[0-9])|(1[0-2]):[0-5][0-9]:[0-5][0-9]$/'; //Matches times in the form hh:mm:ss
  $usaTimePattern = '/^([1-9]|(1[0-2])):[0-5][0-9] [a|p]m$/'; //Matches times in the form hh:mm am/pm

  $value = //some time;
  if (preg_match($databaseTimePattern, $value)){
    // good no problem
  }else if (preg_match($usaTimePattern, $value)){
    $value = strtotime($value);
  }else{
    die("error incorrect time format, try again.");
  }
?>
于 2012-03-23T16:33:58.150 に答える