バージョン選択

フォーラム

メニュー

オンライン状況

36 人のユーザが現在オンラインです。 (27 人のユーザが フォーラム を参照しています。)
登録ユーザ: 1
ゲスト: 35
rains03847 もっと...

サイト内検索

プラグイン > バグ報告・利用に関する質問 > 関連商品プラグインのエラー

バグ報告・利用に関する質問

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
naham
投稿日時: 2018/7/9 13:15
対応状況: −−−
半人前
登録日: 2017/1/11
居住地:
投稿: 11
関連商品プラグインのエラー
EC-CUBE3の「関連商品プラグイン」ですが、
商品情報を更新(在庫数を変更)以下のエラーが発生しました。
画面では「システムエラーです」と表示され、商品情報が更新できません。

[2018-07-09 11:28:29] eccube.INFO: remove all now related product data of {"Product id":364} []
[2018-07-09 11:28:29] eccube.INFO: save new related product data to DB {"Related Product id":32767} []
[2018-07-09 11:28:29] eccube.CRITICAL: Doctrine\DBAL\Exception\UniqueConstraintViolationException: An exception occurred while executing 'INSERT INTO plg_related_product (content, product_id, child_product_id) VALUES (?, ?, ?)' with params [null, 364, 366]:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '32767' for key 'PRIMARY' (uncaught exception) at /home/サーバID/ドメイン/public_html/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php line 66 {"exception":"[object] (Doctrine\\DBAL\\Exception\\UniqueConstraintViolationException(code: 0): An exception occurred while executing 'INSERT INTO plg_related_product (content, product_id, child_product_id) VALUES (?, ?, ?)' with params [null, 364, 366]:\n\nSQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '32767' for key 'PRIMARY' at /home/サーバID/ドメイン/public_html/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php:66, Doctrine\\DBAL\\Driver\\PDOException(code: 23000): SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '32767' for key 'PRIMARY' at /home/サーバID/ドメイン/public_html/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php:93, PDOException(code: 23000): SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '32767' for key 'PRIMARY' at /home/サーバID/ドメイン/public_html/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php:91)"} []


推測なのですが、「関連商品プラグイン」が、商品情報を更新するたびに新しいidを追加しており、
それがMySQLの上限である32767を超えてしまった…という形でしょうか。

一応プラグインを停止すれば通常通り使えますし、
「関連商品の情報」をリセットすれば問題なく使えるのでしょうが、何か根本的な解決策はないでしょうか。
468
投稿日時: 2018/7/11 1:38
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 1224
Re: 関連商品プラグインのエラー
プラグイン内の/Event/Event.php 164行目の以下の記述が原因で
一旦すべて、関連商品データを削除して新規登録し直しているようです。
$app['eccube.plugin.repository.related_product']->removeChildProduct($Product);


function onRenderAdminProductComplete()の中を
以下のソースのように、登録済の関連商品と画面から送信された関連商品を比較して、追加・更新・削除を行うようにすれば、
無駄にIDを消費する事は無くなると思います。

    public function onRenderAdminProductComplete(EventArgs  $event)
    {
        log_info('RelatedProduct trigger onRenderAdminProductComplete start');
        $app = $this->app;
        $Product = $event->getArgument('Product');
        $form = $event->getArgument('form');
        //$app['eccube.plugin.repository.related_product']->removeChildProduct($Product);
        
        
        //$FromRelatedProducts = $app['eccube.plugin.repository.related_product']->getRelatedProduct($Product, Constant::DISABLED);
        $FromRelatedProducts = $app['eccube.plugin.repository.related_product']->findBy(array('Product' => $Product));
        //更新対象の関連商品を一時的に格納する配列
        $updateRelatedProducts = array();
        //削除対象の関連商品を一時的に格納する配列
        $deleteRelatedProducts = array();
                
        log_info('remove all now related product data of ', array('Product id' => $Product->getId()));
        
        $RelatedProducts = $form->get('related_collection')->getData();
        
        if (count($FromRelatedProducts) == 0) {
            //関連商品が未登録の場合
            foreach ($RelatedProducts as $RelatedProduct) {
            
                /* @var $RelatedProduct \Plugin\RelatedProduct\Entity\RelatedProduct */
                if ($RelatedProduct->getChildProduct() instanceof Product) {

                    $RelatedProduct->setProduct($Product);
                    $app['orm.em']->persist($RelatedProduct);
                    $app['orm.em']->flush($RelatedProduct);
                    log_info('save new related product data to DB ', array('Related Product id' => $RelatedProduct->getId()));
                    
                }
            
            }
            
        } else {
            //既に登録されている関連商品と画面から渡された関連商品を比較
            foreach ($FromRelatedProducts as $FromRelatedProduct) {
            
                $deleteFlg = true;
                $FromChildProduct = $FromRelatedProduct->getChildProduct();
                if ($FromChildProduct) {
                    foreach ($RelatedProducts as $RelatedProduct) {
                    
                        /* @var $RelatedProduct \Plugin\RelatedProduct\Entity\RelatedProduct */
                        if ($RelatedProduct->getChildProduct() instanceof Product) {
                            if ($RelatedProduct->getChildProduct()->getId() == $FromChildProduct->getId()) {
                                //既に登録済の関連商品は更新する
                                $deleteFlg = false;
                                $updateRelatedProducts[] = $RelatedProduct;
                                
                                $FromRelatedProduct->setContent($RelatedProduct->getContent());
                                $app['orm.em']->persist($FromRelatedProduct);
                                $app['orm.em']->flush($FromRelatedProduct);
                                
                                break;
                            }
                        }
                    }
                }
            
                if ($deleteFlg) {
                    $deleteRelatedProducts[] = $FromRelatedProduct;
                }
            
            }
            
            //画面から渡された関連商品の内、新規追加分を登録
            foreach ($RelatedProducts as $RelatedProduct) {
                if ($RelatedProduct->getChildProduct() instanceof Product) {
                    if (!in_array($RelatedProduct, $updateRelatedProducts)) {
                        $RelatedProduct->setProduct($Product);
                        $app['orm.em']->persist($RelatedProduct);
                        $app['orm.em']->flush($RelatedProduct);
                        log_info('save new related product data to DB ', array('Related Product id' => $RelatedProduct->getId()));
                    }
                }
            }
            
            //既に登録済で画面から渡された関連商品に存在しなかった関連商品を削除
            foreach ($deleteRelatedProducts as $RelatedProduct) {
                $app['orm.em']->remove($RelatedProduct);
                $app['orm.em']->flush($RelatedProduct);
            }
        }
        
        log_info('RelatedProduct trigger onRenderAdminProductComplete finish');
    }

※軽く動作確認していますが、パパッと書いたコードなので、きちんとした検証は必要かと思います。


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

red
投稿日時: 2018/7/11 21:00
対応状況: −−−
登録日: 2010/2/15
居住地:
投稿: 1177
Re: 関連商品プラグインのエラー
MySQLであればUNSIGNEDにしておくだけでもだいぶ違う気がします


----------------
EC-CUBEのカスタマイズ承ります
お気軽にお問い合わせ下さい
https://www.ec-cube.net/integrate/partner/partner.php?partner_id=690

naham
投稿日時: 2018/7/17 17:18
対応状況: 開発中
半人前
登録日: 2017/1/11
居住地:
投稿: 11
Re: 関連商品プラグインのエラー
468様

原因箇所の救命と解決用のコード、誠にありがとうございます。
早速テストを行ってみます。
上手く言ったらまたご報告させていただきます。
naham
投稿日時: 2018/7/17 17:19
対応状況: −−−
半人前
登録日: 2017/1/11
居住地:
投稿: 11
Re: 関連商品プラグインのエラー
red様

ありがとうございます。
ひとまずの解決策として、影響がないか確認後行ってみたいと思います。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBEペイメント

統計情報

総メンバー数は31,977名です
総投稿数は87,520件です

投稿数ランキング

1
seasoft
7331
2
AMUAMU
2712
3
nanasess
1773
4
yuh
1512
5
468
1224
6
red
1177
7
umebius
1007
8
fukap
907
9
shutta
827
10
tsuji
815
11 ramrun 789
12 karin 656
13
tao_s
651
14 sumida 641
15
homan
633
16 DELIGHT 571
17
h_tanaka
566
18
patapata
502
19
flealog
483
20 tonton 436


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© LOCKON CO.,LTD. All Rights Reserved.