Bug(バグ) #3543
Youichi Kimura さんがほぼ11年前に更新
h3. 現象 MySQLの "Strict Mode":http://dev.mysql.com/doc/refman/5.1/ja/server-sql-mode.html が有効な環境でメンバーの新規登録を行う際に *プリセット* でかつ *日付* の項目を入力すると、次のようなエラーが発生する。 <pre> SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: '' for column 'value_datetime' at row 1 </pre> エラーが発生した SQL は下記の通り。 <pre> 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) </pre> h3. 再現手順 # MySQL の my.cnf に下記の設定を加える <pre> [mysqld] sql_mode=STRICT_ALL_TABLES </pre> # 管理画面から招待メールを送信し、メールに記載されたURLから新規登録ページ (/member/register) を開く # プロフィール入力 (/member/registerInput) へ進む # 必須項目と *誕生日* を入力する # 「送信」をクリックすると500エラーが発生する h3. 原因 @MemberProfile::preSave()@ 内の下記のコードが直接の原因となっている。 <pre><code class="php"> elseif ('date' === $this->getFormType() && isset($modified['value']) && $this->getProfile()->isPreset()) { $this->_set('value_datetime', $this->_get('value')); } </code></pre> @config/doctrine/schema.yml@ に @MemberProfile.value@ のデフォルト値が @""@ であると記述されているため、value に変更が加えられたか否かに係わらず @MemberProfile::preSave()@ 内で @isset($modified['value'])@ は常に true になる(UPDATE の場合を除く)。 になる。 すると @MemberProfile.value_datetime@ に空文字列がそのままセットされてしまい、前述の @Invalid datetime format@ エラーが発生してしまう。 h3. 修正内容 @MemberProfile::preSave()@ 内で @value_datetime@ に対するから文字列の代入が行われないように @$modified['value']@ のチェックを行う。