質問 > 管理機能 > 2.13.1 環境のデータを 4.0.4 環境にて移行させ商品規格登録をするとエラーが出る |
管理機能
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
miwa |
投稿日時: 2020/7/3 9:56
対応状況: −−−
|
半人前 登録日: 2014/12/9 居住地: 投稿: 11 |
2.13.1 環境のデータを 4.0.4 環境にて移行させ商品規格登録をするとエラーが出る 2.13.1 で運営している EC-CUBE のサイト(環境 A )があります
別環境にて EC-CUBE 4.0.4 をインストールし、A のデータベースをコンバートしました(環境 B) この作業でやったことは、 1.環境 A の DB を「システム設定>バックアップ管理」にてバックアップ 2.環境 B にて 4.0.4 を FTP でアップロードしてインストール 3.その環境に【データ移行プラグイン】 https://www.ec-cube.net/products/detail.php?product_id=1804 を用いて 1. のデータをデータ移行 です 軽減税率に対応しようと、環境 B にて色々と設定し、問題がなくなればこれを本環境とする所存です そこで先ず商品登録をしてみようと思いました 商品規格を持つ商品を商品一覧から選び、「この商品の規格を確認」を選択します 「商品規格登録」画面にて、現在数十個の組み合わせがあるのですが、一番左にチェックが入っているものとそうでないものとが混在している状態です チェックが入っているものについて在庫を入力して「登録」をしようとすると、 Call to a member function setVisible() on null Symfony\Component\Debug\Exception\ FatalThrowableError in Eccube/Controller/Admin/Product/ProductClassController.php (line 393) $DefaultProductClass = $this->productClassRepository->findOneBy([ 'Product' => $Product, 'ClassCategory1' => null, 'ClassCategory2' => null, ]); $DefaultProductClass->setVisible(false); $this->entityManager->flush(); } と出ました この状態で $DefaultProductClass を var_dump すると、当然ですが NULL と出ます そこで、この $DefaultProductClass->setVisible(false); をコメントするときちんと機能します(商品規格登録が出来ます) 環境 A / B 共に EC-CUBE のソースは弄っておりません 今は、 ・何故、この様な状態になるのでしょうか? ・コメントにする以外に何か解決策はありますでしょうか? ・現状コメントにする以外にないとしたら、 - コメントにするだけで良いでしょうか? - それとも、例えば if ( ! is_null ( $DefaultProductClass ) ) { $DefaultProductClass->setVisible(false); } とした方が良いでしょうか? - この $DefaultProductClass->setVisible(false); の処理を( $DefaultProductClass が NULL の時は)させないことで他に影響が出ないでしょうか? といった懸念があります EC-CUBE 2 系で軽減税率対応は難しいと考えておりますし、そうでなくても最新版に合わせておいた方が得策というか賢明だと思っております ですが商品(規格)登録でこの様なエラーが出てしまうと、本番環境として用いるには素人の私としては自分で解決出来ず、この場をお借りしてお知恵を拝借したいと思い、投稿させて頂きました その他の情報につきましては、 [EC-CUBE] 環境 A:2.13.1(新規インストール) 環境 B:4.0.4(新規インストール) [PHP] 環境 A:5.6.30 環境 B:7.2.29 [データベース] 環境 A:MySQL 5.0.95 環境 B:MySQL 5.7.27 [WEBサーバ] 環境 A:Apache 環境 B:Apache となっております 何卒宜しくお願い致します |
468 |
投稿日時: 2020/7/3 18:59
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: 2.13.1 環境のデータを 4.0.4 環境にて移行させ商品規格登録をするとエラーが出る データ移行プラグインを使った事がないのであくまで予想ですが
2系のdtb_products_classテーブルでは classcategory_id1=0, classcategory_id2=0でレコードが存在しており 移行時にclasscategory_id1=0→null, classcategory_id2=0→nullという変換が上手くいかず、 dtb_product_classテーブルのclasscategory_id1, classcategory_id2に「0」が入ったままなのではないでしょうか? classcategory_id1, classcategory_id2がnullで無い為、条件に一致せず$DefaultProductClassが取得できていないのではないでしょうか? データベースを直接編集できる環境であれば、 dtb_product_classテーブルのclasscategory_id1, classcategory_id2に0が入っていないか確認して 0→nullに変更してエラーが解消されるかどうか確認されてみては如何でしょうか?
|
miwa |
投稿日時: 2020/7/3 20:15
対応状況: −−−
|
半人前 登録日: 2014/12/9 居住地: 投稿: 11 |
Re: 2.13.1 環境のデータを 4.0.4 環境にて移行させ商品規格登録をするとエラーが出る ご返信誠に有難う御座います
> データ移行プラグインを使った事がないのであくまで予想ですが > 2系のdtb_products_classテーブルでは > classcategory_id1=0, classcategory_id2=0でレコードが存在しており 確かに SELECT `product_class_id` FROM `dtb_products_class` WHERE `classcategory_id1`=0 AND `classcategory_id2`=0 にて、複数のレコードが出て来ました > 移行時にclasscategory_id1=0→null, classcategory_id2=0→nullという変換が上手くいかず、 > dtb_product_classテーブルのclasscategory_id1, classcategory_id2に「0」が入ったままなのではないでしょうか? > classcategory_id1, classcategory_id2がnullで無い為、条件に一致せず$DefaultProductClassが取得できていないのではないでしょうか? そこで、 SELECT * FROM `dtb_product_class` WHERE `class_category_id1`=0 OR `class_category_id2`=0 をしてみましたが、1 件も該当するレコードはありませんでした > データベースを直接編集できる環境であれば、 > dtb_product_classテーブルのclasscategory_id1, classcategory_id2に0が入っていないか確認して > 0→nullに変更してエラーが解消されるかどうか確認されてみては如何でしょうか? 上記の通り 0 が入っているレコードがありませんでしたので、null にしようがなく、確認することが出来ませんでした |
468 |
投稿日時: 2020/7/3 21:08
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: 2.13.1 環境のデータを 4.0.4 環境にて移行させ商品規格登録をするとエラーが出る 4系のデータベースで
SELECT * FROM `dtb_product_class` WHERE `class_category_id1` is NULL AND `class_category_id2`= NULL を実行するとレコードは出てきますか?
|
miwa |
投稿日時: 2020/7/3 22:03
対応状況: −−−
|
半人前 登録日: 2014/12/9 居住地: 投稿: 11 |
Re: 2.13.1 環境のデータを 4.0.4 環境にて移行させ商品規格登録をするとエラーが出る ご返信、誠に有難う御座います
> 4系のデータベースで > SELECT * FROM `dtb_product_class` WHERE `class_category_id1` is NULL AND `class_category_id2`= NULL > を実行するとレコードは出てきますか? いえ、一致するレコードは 0 件でした 因みに、 SELECT * FROM `dtb_product_class` WHERE `class_category_id1` is NULL AND `class_category_id2`is NULL は無数に出て来ます (返答するだけしか出来ずに申し訳ありません) |
468 |
投稿日時: 2020/7/4 2:34
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: 2.13.1 環境のデータを 4.0.4 環境にて移行させ商品規格登録をするとエラーが出る 操作しようとされた商品のレコードは見つかりますか?
SELECT * FROM `dtb_product_class` WHERE `class_category_id1` is NULL AND `class_category_id2`is NULL AND product_id = XXX XXXのところに商品IDを指定してみてください。 あと、「= NULL」ではなくて「IS NULL」でないとレコードがヒットしませんね。 1つ前のSQLは打ち間違えていました。 紛らわしい間違いで申し訳ございません。
|
miwa |
投稿日時: 2020/7/4 8:19
対応状況: −−−
|
半人前 登録日: 2014/12/9 居住地: 投稿: 11 |
Re: 2.13.1 環境のデータを 4.0.4 環境にて移行させ商品規格登録をするとエラーが出る ご返答有難う御座います
> 操作しようとされた商品のレコードは見つかりますか? > SELECT * FROM `dtb_product_class` WHERE `class_category_id1` is NULL AND `class_category_id2`is NULL > AND product_id = XXX > XXXのところに商品IDを指定してみてください。 商品 ID を指定して確認した所、1 件もヒットしませんでした 同じく、 SELECT * FROM `dtb_product_class` WHERE product_id = XXX をやってみると、3 件ヒットし、これは一番最初の > 「商品規格登録」画面にて、現在数十個の組み合わせがあるのですが、一番左にチェックが入っているものとそうでないものとが混在している状態です > チェックが入っているものについて在庫を入力して「登録」をしようとすると、 の「チェックが入っている」数と一致します ・商品 ID だけを条件にした場合はヒットするので商品規格登録画面でチェックが入った状態で見れる ・しかしその商品 ID で class_category_id1 / class_category_id2 共に NULL なものがない ・だから $DefaultProductClass が null になり、setVisible しようがない ということでしょうか? もしそうである場合、管理画面で、或いは DB 上でこれを解決する方法はありますでしょうか? それとも、コードをイジる方法となりますでしょうか? 聞くばかりに終止してしまい大変申し訳ありませんが、ご教示頂けたら幸いです > あと、「= NULL」ではなくて「IS NULL」でないとレコードがヒットしませんね。 > 1つ前のSQLは打ち間違えていました。 > 紛らわしい間違いで申し訳ございません。 いえいえ、とんでもありません 今こうやって問題の所在を掴み掛けていること自体、お導きあってのことであり、とても感謝しております |
468 |
投稿日時: 2020/7/4 15:52
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: 2.13.1 環境のデータを 4.0.4 環境にて移行させ商品規格登録をするとエラーが出る ECCUBE4で新しく商品規格を持つ商品を登録してデータを確認してみましたが
商品規格登録画面でチェックを付けた件数(2件チェック)+1件( class_category_id1 / class_category_id2 共に NULL)のレコードが dtb_product_classテーブルに登録されました。 よって、やはり編集しようとされている商品IDかつ、class_category_id1 / class_category_id2 共に NULLのレコードが無い事が原因で間違いないと思います。 なぜ、レコードの欠落が起きているか分かりませんが 2系のデータベースで既に以下のようなレコードが存在していないという事はないでしょうか? SELECT `product_class_id` FROM `dtb_products_class` WHERE `classcategory_id1`=0 AND `classcategory_id2`=0 AND product_id = XXX ※XXXのところに商品IDを指定してみてください ECCUBE4のソースを全て網羅している訳ではないので 該当レコードが存在しない事による不都合があるのかどうか判断できないのですが レコードが存在しているほうが安心な気もします。 コードをコメントアウトしたりするのではなく、 欠落している商品を特定してレコードを追加する対応をされたほうが良いのではないでしょうか?
|
miwa |
投稿日時: 2020/7/5 6:00
対応状況: −−−
|
半人前 登録日: 2014/12/9 居住地: 投稿: 11 |
Re: 2.13.1 環境のデータを 4.0.4 環境にて移行させ商品規格登録をするとエラーが出る ご丁寧なご返信、本当に有難う御座います
色々と検証したり考えたりで返信が遅れたことをお詫び致します > ECCUBE4で新しく商品規格を持つ商品を登録してデータを確認してみましたが > 商品規格登録画面でチェックを付けた件数(2件チェック)+1件( class_category_id1 / class_category_id2 共に NULL)のレコードが > dtb_product_classテーブルに登録されました。 ご確認有難う御座います > よって、やはり編集しようとされている商品IDかつ、class_category_id1 / class_category_id2 共に NULLのレコードが無い事が原因で間違いないと思います。 なるほどです > なぜ、レコードの欠落が起きているか分かりませんが > 2系のデータベースで既に以下のようなレコードが存在していないという事はないでしょうか? > SELECT `product_class_id` FROM `dtb_products_class` WHERE `classcategory_id1`=0 AND `classcategory_id2`=0 > AND product_id = XXX > ※XXXのところに商品IDを指定してみてください このことで、幾つか確認を行っていました ---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+--- ・EC-CUBE 2 の実稼働環境 A: SELECT `product_class_id` FROM `dtb_products_class` WHERE `classcategory_id1`=0 AND `classcategory_id2`=0 AND product_id = XXX ではヒットするものとしないものとがあった B: SELECT * FROM `dtb_products_class` WHERE `classcategory_id1` =0 AND `classcategory_id2` =0 は多数ヒット ---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+--- ・EC-CUBE 4 の移転働環境(将来正式稼働予定) C: SELECT id FROM `dtb_product_class` WHERE `class_category_id1` IS NULL AND `class_category_id2` IS NULL and `product_id`=XXX ではヒットするものとしないものとがあった D: SELECT * FROM `dtb_product_class` WHERE `class_category_id1` IS NULL AND `class_category_id2` IS NULL は多数ヒット ---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+--- ・B / D のヒット数は違う ・規格を持ちつつもデフォルト規格が無いものがあることが判明した ・A / C では、デフォルト規格を持つ商品 ID の場合は 1 件ヒットする筈だが、C では 2 件ヒットするものもあった ・EC-CUBE 4 の移転働環境では、商品規格を有する商品が 300 あり、その内デフォルト規格を持つものは 50 だった 250 商品は商品規格登録時にエラーが出る(ことになる) > ECCUBE4のソースを全て網羅している訳ではないので > 該当レコードが存在しない事による不都合があるのかどうか判断できないのですが 大丈夫です > レコードが存在しているほうが安心な気もします。 ええ > コードをコメントアウトしたりするのではなく、 > 欠落している商品を特定してレコードを追加する対応をされたほうが良いのではないでしょうか? そうだとは思います ただ、2 系でレコードを追加するのと、4 系で追加するのと、どちらが良いのか判断出来ない状態です レコードの追加ではなく、2 系でも 4 系でも構わないので「管理画面でこの操作をするとデフォルト規格が出来る」というのがあれば良いのですが…… 一度商品を削除して再登録すれば良いかも知れませんが、その場合は商品 ID が変わってしまうので避けたい所です また、多くの商品が規格を沢山持っているので、規格だけを削除することも出来ません…… 2 系は現在稼働中なのでソースをイジれないのですが 4 系なら可能なので、 $DefaultProductClass = $this->productClassRepository->findOneBy([ 'Product' => $Product, 'ClassCategory1' => null, 'ClassCategory2' => null, ]); if ( is_null( $DefaultProductClass ) ) { // ここにレコード追加処理 } else { $DefaultProductClass->setVisible(false); } $this->entityManager->flush(); を入れたらどうだろうと思いつつも、他に影響が出ないかの懸念もあります ソースをイジるにしても手動でレコード追加するにしても、レコード追加時に「何を入力したら良いか」で悩んでいます product_id / class_category_id1 / class_category_id2 等は自明ですが、他はどうすべきかと…… 仰る通り、何故 `classcategory_id1`=0 AND `classcategory_id2`=0 なレコードが欠落したのかこちらも分からず、思い当たる節がありません 気になったのは、 ・`classcategory_id1`=0 AND `classcategory_id2`=0 なレコードが欠落した商品の規格を更新してもエラーは出ない ・`classcategory_id1`=0 AND `classcategory_id2`=0 なレコードが欠落した商品は、 EC-CUBE 4 環境でも `class_category_id1` IS NULL AND `class_category_id2` IS NULL ではない と思ったら、`class_category_id1` IS NULL AND `class_category_id2` IS NULL なレコードを持つ商品もありました といったことです この、商品規格を持っているのに `class_category_id1` IS NULL AND `class_category_id2` IS NULL 出ない商品がある問題は「商品企画の初期化」にも関わると思います 2 系 / 4 系それぞれの整合性や、共通点、相違点、色々考えていたら時間が掛かってしまいました まだ悩んでいる所ですが、現状報告という形で返信させて頂きます もし、お気付きがあればご指摘頂けたら幸いです |
468 |
投稿日時: 2020/7/6 10:01
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: 2.13.1 環境のデータを 4.0.4 環境にて移行させ商品規格登録をするとエラーが出る 2系も4系も管理画面で商品登録を行う流れは同じで
1.商品を新規登録 2.商品規格を編集 の流れかと思います。 通常であれば、「1.商品を新規登録」が完了した時点で dtb_productとdtb_product_class(2系の場合、dtb_productsとdtb_products_class)に1件ずつレコードが登録されると思います。 この時、dtb_product_classテーブルにはclass_category_id1=null, class_category_id2=null(2系の場合、dtb_products_classテーブルにはclass_category_id1=0, class_category_id2=0) のレコードが登録されていると思います。 ※規格を持たない商品もdtb_product_classテーブルにレコードを持つ仕様。 続けて「2.商品規格を編集」が完了した時点で 規格の組み合わせとチェックボックスの内容を基に dtb_product_classテーブルへ必要なレコードを追加していると思います。 (2系の場合、dtb_products_classテーブル) ここで「1.商品を新規登録」で既に登録されているclass_category_id1=null, class_category_id2=nullのレコードに対して 4系の場合、visible=0に変更していると思います。 ※今回の問題はここでエラーが発生する事 規格を持たない商品用のレコードを非表示にする事が目的と思いますが 2系の場合、dtb_products_classテーブルのclass_category_id1=0, class_category_id2=0のレコードに対して del_flg=1の変更を行っているようです。 ここで少し気になったのですが 2系のサイトを構築する際、何度か移行作業を行っていたりしていないでしょうか? あくまで予想ですがデータ移行の際、del_flg=1のレコードは不要と判断して破棄していたりすると レコードの欠落は発生してしまうかと思います。 もしくはサイト構築時のデータ投入時に規格商品のclass_category_id1=0, class_category_id2=0のレコードを追加しなかったのかもしれませんが。
|
(1) 2 » |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |