ec-cube2 icon indicating copy to clipboard operation
ec-cube2 copied to clipboard

PHP8 対応漏れ?「受注管理>受注登録」画面でシステムエラー #829、Warning 回避

Open seasoftjapan opened this issue 1 year ago • 16 comments

  • [x] 数値項目が空文字の場合にシステムエラーになる(#1129)
  • [x] Warning 解消(#1130)
  • [ ] 数量及び税率が空文字の場合にエラーメッセージを表示する

seasoftjapan avatar Feb 06 '24 16:02 seasoftjapan

Codecov Report

Attention: Patch coverage is 80.00000% with 3 lines in your changes missing coverage. Please review.

Project coverage is 55.61%. Comparing base (fc5a36a) to head (c80bc7c).

Files with missing lines Patch % Lines
data/class/util/SC_Utils.php 50.00% 2 Missing :warning:
data/class/SC_FormParam.php 80.00% 1 Missing :warning:
Additional details and impacted files
@@            Coverage Diff             @@
##           master     #836      +/-   ##
==========================================
- Coverage   55.63%   55.61%   -0.02%     
==========================================
  Files          75       75              
  Lines        8917     8920       +3     
==========================================
  Hits         4961     4961              
- Misses       3956     3959       +3     
Flag Coverage Δ
tests 55.61% <80.00%> (-0.02%) :arrow_down:

Flags with carried forward coverage won't be shown. Click here to find out more.

:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.

codecov-commenter avatar Feb 06 '24 17:02 codecov-commenter

PHP8 Warning 回避 (b366a0f) の修正を入れましたところ、 数量欄に「あ」を入力し、[計算結果の確認]ボタンを押すと 当方の環境では、システムエラーが出るようになりました。一応お知らせ致します。

[/manager/order/edit.php] Fatal error(E_ERROR): Uncaught TypeError: Unsupported operand types: int + string in data/class/pages/admin/order/LC_Page_Admin_Order_Edit.php:1212

bbkids avatar Feb 07 '24 03:02 bbkids

すみません、今試してみましたところ、 当初の私の検証ミスの様でして、 PHP8 Warning 回避 (b366a0f) の修正以前でも、 数量欄のみ改善させていない様で御座います。

具体的には、 数量欄に「あ」を入力し、[計算結果の確認]ボタンを押すと 当方の環境では、システムエラーで落ちます。

その場合のエラーログは、 [/admin/order/edit.php] Fatal error(E_ERROR): Uncaught TypeError: Unsupported operand types: string * string in data/class/util/SC_Utils.php:895

bbkids avatar Feb 07 '24 07:02 bbkids

@bbkids @seasoftjapan

数量欄のみ改善させていない

こちらは別途 issues で対応したほうが良いですかね?

nanasess avatar Feb 07 '24 07:02 nanasess

数量欄のみ改善させていない

すみません、「数量欄のみ改善されていない」の間違いでした。

別途 issues でOKです。

bbkids avatar Feb 07 '24 07:02 bbkids

@bbkids 不具合報告ありがとうございます。 @nanasess https://github.com/EC-CUBE/ec-cube2/pull/836#issuecomment-1931222235 の再現を確認しましたが、同じ画面内で且つ性質は似ているので、Issue は https://github.com/EC-CUBE/ec-cube2/issues/829 で良さそうな気がします。一旦 fixed #829 の記述を削除しました。マージに間に合わなかったら PR は追加します。

seasoftjapan avatar Feb 07 '24 08:02 seasoftjapan

まずは、https://github.com/EC-CUBE/ec-cube2/pull/836#issuecomment-1931222235 への対応です。

lfCheckError() の前に setProductsQuantity() が呼ばれていたり、 lfCheckError() を通過せずに setProductsQuantity() が呼ばれていたりする状況でした。

setProductsQuantity() の前に lfCheckError() を呼び、エラーがあったら switch を break するよう調整しています。

変更箇所が多いですが、十分にデバッグできていないため、一旦別ブランチに push すると思います。

【追記】 push しました。 https://github.com/seasoftjapan/eccube-2_13/tree/seasoft-829-2

seasoftjapan avatar Feb 07 '24 09:02 seasoftjapan

この修正以降、 商品追加で一度 規格1と規格2がある商品を追加し、その追加した商品を規格がない商品に変更をすると

public function changeShipmentProducts(); の中の以下の箇所で、エラー落ちします。

$arrShipmentProducts['shipment_classcategory_name1'][$shipping_id][$no] = $arrProductInfo['classcategory_name1'];
$arrShipmentProducts['shipment_classcategory_name2'][$shipping_id][$no] = $arrProductInfo['classcategory_name2'];

Fatal error(E_ERROR): Cannot assign an empty string to a string offset が出ます。 また、その逆で、規格がない商品を一度追加して、その追加した商品を規格1と規格2がある商品に変更すると 同じ個所で、 Warning(E_WARNING): Only the first byte will be assigned to the string offset がでます。

bbkids avatar Feb 08 '24 15:02 bbkids

$arrShipmentProducts[]を辿ってみましたところ、 入れ子の配列のについて初期化されていなかったようで、NULLがセットされエラー落ちしていたものと考えられます。

$arrShipmentProducts['shipment_classcategory_name1'][$shipping_id] = [];
$arrShipmentProducts['shipment_classcategory_name2'][$shipping_id] = [];

changeShipmentProducts()の中で値をセットする直前に、配列として初期化したところエラー落ち解消されました。 LC_Page_Admin_Order_Edit全体を把握できていないので、ここでの初期化が適切かどうかは何とも言えません。

【追記】 その後、 https://github.com/seasoftjapan/eccube-2_13/tree/seasoft-829-2 に上記をマージしたものを一通り試して見ましたが、エラー落ちはなくなりました。 Warninngは少々残ります(かなり減りました)が、当方が試した限りは、おおむね良さそうな感じで御座います。

bbkids avatar Feb 09 '24 03:02 bbkids

@bbkids ご報告ありがとうございます。 イレギュラーな操作をすると、他にもPHPエラーありますね。

当プルリクをドラフトに変更して、もう少しじっくりと調整しようかと思います。併せて、seasoft-829-2 ブランチに push していた内容を、プルリク対象ブランチに push し直す予定です。 (@nanasess それで、自動マージになっても master にマージされなくなると想定していますが、違いましたらご指摘ください。)

この画面は、PHPエラー以外の既存バグも多々あると思うので、どこで切りをつけるか難しくなりそうです。

seasoftjapan avatar Feb 11 '24 09:02 seasoftjapan

本件、再開しようと思いますが、経緯が分からなくなってしまいました。

特に https://github.com/seasoftjapan/eccube-2_13/tree/seasoft-829-2 (8fac1d151b0fc162a7f3c547f7a02c1ed8191ccc) の役割を思い出せず、一旦黙殺する予定です。

まずは、https://github.com/seasoftjapan/eccube-2_13/tree/seasoft-829 (a23d6b7c6067e9c02e6d89de987c31fa0dc773dc) に、https://github.com/EC-CUBE/ec-cube2/pull/836#issuecomment-1935293876 で報告いただきました配列要素の初期化漏れを改修しようと思います。

seasoftjapan avatar Jul 30 '24 11:07 seasoftjapan

特に https://github.com/seasoftjapan/eccube-2_13/tree/seasoft-829-2 (8fac1d1) の役割を思い出せず、一旦黙殺する予定です。

https://github.com/seasoftjapan/eccube-2_13/tree/seasoft-829-2 の内容は、本件 PR のブランチにチェリーピックしてありました。(fe9bdf76d)

seasoftjapan avatar Sep 08 '24 10:09 seasoftjapan