ど素人から毛を生やす。<延>

MySQLから取り出した「日付データがあるとき」の条件分岐を、できるだけ最短の記述で行いたい。

Web > PHP 2018年12月28日(最終更新:5月前)

どもです。

PHPで日付データがあるとき、の条件分岐をしたい。

このとき、厳密な日付フォーマットチェックを行いたいのであれば、DateTimeクラスを用いるのが妥当です。
参考サイト:
[Qitta]【PHP】DateTimeクラスでcheckdate()より汎用性のある日付チェックを行う
[SOFTELメモ]【php】DateTimeクラスで日付の表示の補正をおこなう

しかし、今回はMySQLからデータを取り出して使いたい場合です。
厳密なフォーマットチェックは入力時に行うべきことであって、この場合はもっとシンプルにできるはず。

そして問題となるのはMySQLにて、DATETIMEカラムをNOT NULLにすると、
デフォルト値が「0000-00-00 00:00:00」になるということです。

さて、どうすれば最短かつ明瞭な条件分岐になるか。

strtotime()を利用

if(strtotime($date) > 0) echo "日付があるよ"; else echo "日付が無いよ";

ああ、これでいいのか。

「0000-00-00 00:00:00」のとき、環境次第でstrtotime()の返す値が「-62170016400」だったり「false」だったりするという素敵な話がありますが、falseは0なので、「0より大きい」という条件ならどちらもクリアできるわけです。
ついでにいうなら、空白や他の文字など、日付に変換できないものも弾いてくれるので尚良し。

しかし、1970年1月1日以降の日付でないとfalseになってしまうので、汎用性が高いかと言われると、微妙。

文字列として比較

if($date > "0000-00-00 00:00:00") echo "日付があるよ"; else echo "日付が無いよ";

別解。文字列型として比較するパターン。
記述的にはちょっと面倒。しかし処理的にはほぼ最短かつ意外とカバー範囲が広い。

"0000-00-00 00:00:00" は、当然false。
"0000-00-00" もfalseなので、カラムがDATE型かDATETIME型か区別する必要なし。
空白もfalse。

うん、要点を満たしています。
上の解の問題点、1970年より前がfalseとなることもない。西暦1年から許容。

難点は空白or想定のフォーマット以外が入ったときにtrueとなることだが、DBから抜いたそのままのデータを対象とするならその配慮も不要。

泥臭いが、案外これが最適解かもしれない。

この記事は役に立ちましたか?
  • _(:3」∠)_ 面白かった (0)
  • (・∀・) 参考になった (0)
  • (`・ω・´) 役に立った (1)