EC-CUBE で商品を大量に注文した時に、お届け先情報が空っぽになるという問題が起きたので調べてみました。
なお、動作環境は EC-CUBE 2.13.2 です。
原因
色々と調べてみるとどうやら EC-CUBE の潜在的な不具合があり、他にも同様な現象が起こっている問題のようです。
- 2.11 お届け先情報が空になっている – EC-CUBE 開発コミュニティ – フォーラム
- #1341 (MySQLでSESSIONをDB保存する際の型がTEXT型なのでデータ量によってはあふれる) – EC-CUBE Trac
カートに入れた商品情報はテーブル dtb_session のカラム sess_data に格納されるようになっていますが、DB に MySQL を使っている場合、sess_data のデータ型が text 型のため、沢山の商品を一度に購入しようとすると text 型のサイズ制限を超えて情報があふれてしまうとのこと。
確かに自分の環境でも、使っている DB は MySQL、また商品を一度に10点ほど購入しようとした場合に問題が発生していました。
こういう原因なのであれば、商品を沢山注文した場合に限らず、配送先を複数指定するなど他にもデータ量が増える形で注文を行う場合に発生する可能性はありそうですね。
なお DB に PostgreSQL を使っている場合は、text 型にデータサイズの制限が無いのでこの問題は起きません。
対応方法
原因がカラム sess_data のサイズ制限ということで、データ型を text から longtext に変更します。なお、sess_data と同様にセッション情報が格納されるフィールド dtb_order_temp.session のデータ型も longtext に変更します。
MySQL コマンドで下記 SQL を実行します。
以上です。自分の環境では、この対応以降問題は起きなくなりました。
前述のチケットでは「必要であれば対応します」というコメントもありましたが、最新バージョン 2.13.3 の DDL をのぞいてみた限りまだ対応はされていないように見えました。結構深刻な問題にも思えますがどう扱われているんでしょうね・・・。