3

DateTime::createFromFormat()を使用してDB挿入に送信する前に、正しくフォーマットされた日付を検証するためのこのコードブロックがあります。日付形式が「DD/MM/YYYY」を「YYYY-MM-DD」に変換するか、エラーが発生することを期待しています。

$dateofbirth = trim($_POST['dateofbirth']);
$date = DateTime::createFromFormat('d/m/Y', $dateofbirth);

$date_errors = DateTime::getLastErrors();
    var_dump($date_errors);
if ($date_errors['warning_count'] + $date_errors['error_count'] > 0) {
    $dobError = 'Date '.$dateofbirth.' is not a valid DD/MM/YYYY format.';
    $hasError = true;
} else {
    $mysql_dob = $date->format('Y-m-d');
}
error_log($dateofbirth.' -> '.$mysql_dob);

この日付は機能します

 $dateofbirth = '30/11/1980'; => 1980-11-30

しかし、これは静かに失敗します

 $dateofbirth = '30/11/80'; => 0080-11-30

世紀の桁の欠落について通知されることを期待しているので。フォーマット規則を読み、大文字の「Y」を使用しています。これにより、年は 4 桁になります。私が間違っているところはありますか?

編集

1 - OneTrickPony のコメントに従ってテスト日を修正します

2 - $date_errors 変数の var_dump を追加しました。フォーマットは 'd/m/Y' で、入力は '30/11/80' であるため、エラーまたは警告が表示されることを期待していますが、表示されません。

array(4) {
  ["warning_count"]=>
  int(0)
  ["warnings"]=>
  array(0) {
  }
  ["error_count"]=>
  int(0)
  ["errors"]=>
  array(0) {
  }
}
30/11/80 -> 0080-11-30
4

2 に答える 2

0

のドキュメントからDateTime::createFromFormat

http://www.php.net/manual/en/datetime.createfromformat.php

Returns a new DateTime instance or FALSE on failure.

したがって、確認するのではなく、確認getLastErrorsする必要があります$date === false

エラーチェックを次のように変更します。

if ($date === false) {
    $dobError = 'Date '.$dateofbirth.' is not a valid DD/MM/YYYY format.';
    $hasError = true;
} else {
    $mysql_dob = $date->format('Y-m-d');
}
于 2013-05-01T16:30:52.770 に答える
-1
$date = DateTime::createFromFormat('d/m/Y', $dateofbirth);

[...]

この日付は機能します

$dateofbirth = '30/11/1980'; => 1980-11-30

しかし、これは静かに失敗します

$dateofbirth = '30/11/80'; => 0080-11-30

マニュアルページによると、DateTime::createFromFormat()あなたが提供した形式は非常に明示的に4桁の年を探します. 「80」を 1980 年ではなく西暦 80 年として解析しています。

2 桁の年を受け入れるには、大文字の代わりに小文字 を使用する必要があります。ただし、これも 4 桁の年を受け入れません。yY

オプションは次のとおりです。

  1. 日付検証コードが表示される前に、ユーザーが正しい文字列長を入力したことを検証します。
  2. 文字列の長さを使用して、使用される形式を決定します
  3. 正規表現を使用して年の長さを確認し、それに応じて形式を変更します
  4. 正規表現を分解している場合は、単に使用することもできますcheckdate()
  5. 非常に奇妙な非標準のDD/MM/YYYY 形式の日付の受け入れを停止します。スラッシュが一般的に使用されている場合、予想される形式は実際には代わりに MM/DD/YYYY であり、これはユーザーの重大な混乱を引き起こす可能性があります。
于 2013-05-01T19:52:28.413 に答える