Backport(バックポート) #2683
完了op_preset_birthdayについて、member_profileのvalue_datetimeがゼロ値もしくはnullの場合、プロフィール閲覧時に例外が発生し閲覧できない場合がある
100%
説明
Overview (現象)¶
http://sns.openpne.jp/diary/25790 より転記
お世話様です。 既出や3.6βで解決してたらごめんなさい。 OpenPNE3.52を使ってます。 プロフィールを閲覧不能のメンバーがたまに出てきてphpMyAdminで直して気付いたんですが、生年月日の生まれ年を適当に入れたり全角で入れたりするとこの症状が出ます リストボックスのように選べるのを限定(沢山有ってダメっすかね?)かチェックをかける事はできますか?
現在サポート中の各バージョンおよびMasterにおいて、チェック(バリデーション)がかかっています。
ただし、旧バージョンからのアップグレード等で、
op_preset_birthdayのmember_profileデータが正しくない場合
(具体的にはvalue_datetimeがゼロ値もしくはvalue_datetimeがnullかつ、valueが日付として認識できない場合)
プロフィール閲覧(member/profile)で「Impossible to parse date "xxxxxxxx" with format "yyyy-MM-dd HH:mm:ss".」という例外が発生します
(3.0系ではデータ構造が異なるため上記の現象は発生しません)
Causes (原因)¶
本来、member_profileのvalue_datetimeには日付が正しく入っているはずで、
その値をもとにプロフィール閲覧の表示を行っているが
上記のように、ゼロ値もしくはnullかつvalueがでたらめの場合は
プロフィール閲覧で利用しているop_format_date()で例外が発生してしまう。
Way to fix (修正内容)¶
member_profileの値が以下の場合は値を返さず、nullを返すようにする- value_datetimeがnullではなく、ゼロ値の場合
- op_preset_birthdayに対応するデータなのに、value_datetimeがnullの場合
Yuya Watanabe さんがほぼ13年前に更新
- ステータス を New(新規) から Accepted(着手) に変更
- 担当者 を Yuya Watanabe にセット
Maki Takahashi さんがほぼ13年前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
更新履歴 fbb3bdb67c3736f8e749e446af091da58ffca280 で適用されました。
Kousuke Ebihara さんがほぼ13年前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
OK とします。
ただ、バックポート元のコードで 0000-00-00 00:00:00
というマジックナンバーが使われているのは好ましくありません。しかもこの値は MySQL 独自の未定義値であり、 OpenPNE のこのレイヤーでは前提とするべき値ではありません。ただ、既に他のバージョンで取り込まれていることや、チケットで示されているような状況は OpenPNE 2 からのアップグレードを経由した場合ぐらいしか発生し得ないと考えられるため、ここでは実際的な問題はないものとします。
0000-00-00 00:00:00
を決めうちで使いたいなら、 opDoctrineRecord.class::UNDEFINED_DATETIME_BC
を用いるべきです。また、日付型に特化した処理をおこなわせたいなら opDoctrineRecord::_get()
内で checkIsDatetimeField()
が true を返す場合の配慮が特定のプロフィール項目の場合にも機能するように、 checkIsDatetimeField()
をオーバーライドする方法も採用しうるのではないかと思います。
先述の通り、このチケットで対応するべき内容とは言えないのでステータスは「テスト待ち」にします。別チケット対応とするべきかどうかについてはまだ考えがありません。
Yuma Sakata さんがほぼ13年前に更新
- ステータス を Pending Testing(テスト待ち) から Fixed(完了) に変更
- 進捗率 を 70 から 100 に変更
テストOKです。