操作
Bug(バグ) #3543
完了MySQLのStrict Modeが有効な状態でメンバーの新規登録を行うとエラーが発生する
開始日:
2014-01-07
期日:
進捗率:
0%
予定工数:
3.6 で発生するか:
Unknown (未調査)
3.8 で発生するか:
Unknown (未調査)
説明
現象¶
MySQLの Strict Mode が有効な環境でメンバーの新規登録を行う際に プリセット でかつ 日付 の項目を入力すると、次のようなエラーが発生する。
SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: '' for column 'value_datetime' at row 1
エラーが発生した SQL は下記の通り。
12月 27 17:23:12 symfony [info] {Doctrine_Connection_Statement} execute : INSERT INTO member_profile (value, member_id, profile_id, value_datetime, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?) - (, 6, 2, , 2013-12-27 17:23:12, 2013-12-27 17:23:12)
再現手順¶
- MySQL の my.cnf に下記の設定を加える
[mysqld] sql_mode=STRICT_ALL_TABLES
- 管理画面から招待メールを送信し、メールに記載されたURLから新規登録ページ (/member/register) を開く
- プロフィール入力 (/member/registerInput) へ進む
- 必須項目と 誕生日 を入力する
- 「送信」をクリックすると500エラーが発生する
原因¶
MemberProfile::preSave()
内の下記のコードが直接の原因となっている。
elseif ('date' === $this->getFormType() && isset($modified['value']) && $this->getProfile()->isPreset())
{
$this->_set('value_datetime', $this->_get('value'));
}
config/doctrine/schema.yml
に MemberProfile.value
のデフォルト値が ""
であると記述されているため、value に変更が加えられたか否かに係わらず MemberProfile::preSave()
内で isset($modified['value'])
は常に true になる(UPDATE の場合を除く)。
すると MemberProfile.value_datetime
に空文字列がそのままセットされてしまい、前述の Invalid datetime format
エラーが発生してしまう。
なお、プリセットではない日付型のプロフィール項目については value_datetime は使用されない (参照: b6445a0a) ためこの問題は発生しない。
修正内容¶
MemberProfile::preSave()
内で value_datetime
に対するから文字列の代入が行われないように $modified['value']
のチェックを行う。
Youichi Kimura さんがほぼ11年前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
更新履歴 d18ed005dd5430d53141271dec226b2bfcd20b0d で適用されました。
isao sano さんが約10年前に更新
- コピー先 Backport(バックポート) #3723: MySQLのStrict Modeが有効な状態でメンバーの新規登録を行うとエラーが発生する を追加
isao sano さんが約10年前に更新
- コピー先 Backport(バックポート) #3724: MySQLのStrict Modeが有効な状態でメンバーの新規登録を行うとエラーが発生する を追加
Shinichi Urabe さんがほぼ10年前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
レビューOK
操作