Bug(バグ) #135
完了mysql でメンバープロフィールの「誕生日」が「-0001-11-30」と表示される
100%
説明
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
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 に変更