Bug(バグ) #135
mysql でメンバープロフィールの「誕生日」が「-0001-11-30」と表示される
100%
Description
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
Related issues
Associated revisions
fixed that the default value of datetime column is noncommittal (fixes #135, thanks to Mari Yamashita's early reporting)
But I think that these changes are very bad know-how. If you want to know why, please read my comment in source code. Most of large comments are used for hiding dirty code, as now :/
History
#1
Updated by Kousuke Ebihara about 11 years ago
- Target version set to OpenPNE 3.1.4
#2
Updated by Kousuke Ebihara about 11 years ago
- Status changed from New(新規) to Accepted(着手)
- Assignee set to Kousuke Ebihara
#3
Updated by Kousuke Ebihara about 11 years ago
- Status changed from Accepted(着手) to 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
#4
Updated by Kousuke Ebihara about 11 years ago
- Status changed from Pending Review(レビュー待ち) to Fixed(完了)
- % Done changed from 0 to 100