プロジェクト

全般

プロフィール

Bug(バグ) #135

完了

mysql でメンバープロフィールの「誕生日」が「-0001-11-30」と表示される

Mari Yamashita さんが約15年前に追加. 約15年前に更新.

ステータス:
Fixed(完了)
優先度:
Normal(通常)
担当者:
対象バージョン:
開始日:
2009-10-29
期日:
進捗率:

100%

予定工数:
3.6 で発生するか:
3.8 で発生するか:

説明

mysqlの問題かもしれませんが、メンバープロフィールの「誕生日」を保存すると
value_datetimeが「0000-00-00 00:00:00」になるので
MemberProfileの
@if ($this->_get('value_datetime')) {
$obj = new DateTime($this->_get('value_datetime'));
return $obj->format('Y-m-d');
}@
にマッチして誕生日が「-0001-11-30」になります。

関連チケット#87


関連するチケット 1 (0件未完了1件完了)

関連している OpenPNE 3 - Enhancement(機能追加・改善) #87: Reconsider of handling date type configurations and profiles (日付型の設定とプロフィールの扱いについて再考する)Fixed(完了)Kousuke Ebihara2009-10-08

操作

Kousuke Ebihara さんが約15年前に更新

  • 対象バージョンOpenPNE 3.1.4 にセット

Kousuke Ebihara さんが約15年前に更新

  • ステータスNew(新規) から Accepted(着手) に変更
  • 担当者Kousuke Ebihara にセット

Kousuke Ebihara さんが約15年前に更新

  • ステータスAccepted(着手) から Pending Review(レビュー待ち) に変更

314025979601fa8aa3e0670e22b91b9dd996a604 で修正をおこないました。

mari yamashita さん、早期にご報告いただきありがとうございます。

クリティカルな箇所の対応になってしまいましたので、以下、本対応について説明します(一部ソースコード内のコメントの和訳になります)。

0001-01-01 00:00:00 という値の opDoctrineRecord::UNDEFINED_DATETIME という定数を用意し、この値を用いることでゲッターとセッターが適切に空と見なされる値を扱えるように修正しました。

本来 NULL を使うべきなのですが、少なくとも日付型に限って言えば、 NULL の扱いは RDBMS 間で曖昧なものとなります。

MySQL はこの用途に 0000-00-00 00:00:00 を用意していますが、たとえばこれは PostgreSQL では扱えません。

PostgreSQL の振る舞いは ISO 8601 に似通ったものになっており、これは 0000-01-01 を許容します(これは紀元前 1 年を意味します)。

標準 SQL においては 0001-01-01 00:00:00 が使えるようです。

OpenPNE としては今後複数種類の RDBMS をサポートすることになります。すなわち、多くの RDBMS に取って都合のよい形式を選択するべきと判断し、ここでは 0001-01-01 00:00:00 を未定義の日付として扱うように変更をおこないました。

なお、今回、 hnw さんのエントリを参考にさせていただきました。ありがとうございます。 http://openlab.dino.co.jp/2007/11/10/170436147.html

Kousuke Ebihara さんが約15年前に更新

  • ステータスPending Review(レビュー待ち) から Fixed(完了) に変更
  • 進捗率0 から 100 に変更

他の形式にエクスポート: Atom PDF