少し前にあった事象の話を書きます。ディレクターさんから「商品規格を新規で登録しようとしたらエラーになるのです・・・」という話を聞きまして調査を行いました。
最初はタカをくくって、以前に旧ブログで書いた、EC-CUBEでよくあるPHPの以下設定
max_input_vars
(規格数が増えるとPOSTがうまくできなくなってしまう)
こちらによるものかと思い、上限値を上げて確認したのですがダメ・・・。うーんと思い、どこで落ちているかをログを出力しながら確認してみました。そうしたところ、どうやら税率テーブル(dtb_tax_rule)を更新する際に落ちていることを確認しました。
Fatal error(E_USER_ERROR): DB処理でエラーが発生しました。
SQL: [INSERT INTO dtb_tax_rule(calc_rule,tax_rate,tax_adjust,apply_date,member_id,update_date,tax_rule_id,country_id,pref_id,product_id,product_class_id,create_date) SELECT $1,$2,$3,$4,$5,CURRENT_TIMESTAMP,$6,$7,$8,$9,$10,CURRENT_TIMESTAMP]
PlaceHolder: [array (
0 => '2',
1 => '', ← tax_rateが空で、空でのINSERTを許容していない
2 => 0,
3 => '2021/07/15 20:54:14',
4 => '2',
5 => 52,
6 => 0,
7 => 0,
8 => '331',
9 => 97851,
)]
なんでこのようになるのかと思い、規格情報の配列を確認すると
Array
(
[filter] => 1
[tree_id] => Array
(
[0] => ○○○○○
[1] => ●●●●●
[2] => △△△△△
[3] => ■■■■■
)
[class_id3] =>
[only_flg] =>
[classcategory_id3] => Array
(
[0] =>
[1] =>
[2] =>
[3] =>
)
[classcategory_name3] => Array
(
[0] =>
[1] =>
[2] =>
[3] =>
)
[product_id] => ▲▲▲
[category_id] =>
[search_pageno] =>
[search_page_max] => 10
[search_product_id] =>
[search_product_code] =>
[search_name] =>
[search_category_id] =>
[search_status] =>
[search_startyear] =>
[search_startmonth] =>
[search_startday] =>
[search_endyear] =>
[search_endmonth] =>
[search_endday] =>
[search_product_statuses] =>
[class_id1] => 46
[class_id2] => 45
[total] => 4
[product_name] => ◯◯◯
[product_code] => Array
(
[0] => test2
[1] => test2
[2] => test2
[3] => test2
)
[classcategory_id1] => Array
(
[0] => 425
[1] => 425
[2] => 424
[3] => 424
)
[classcategory_id2] => Array
(
[0] => 418
[1] => 419
[2] => 418
[3] => 419
)
[classcategory_name1] => Array
(
[0] => あいうえおあいうえお
[1] => あいうえおあいうえお
[2] => かきくけこかきくけこ
[3] => かきくけこかきくけこ
)
[classcategory_name2] => Array
(
[0] => A かきくけこかきくけこ
[1] => B あいうえおあいうえお
[2] => A かきくけこかきくけこ
[3] => B あいうえおあいうえお
)
[product_class_id] => Array
(
[0] =>
[1] =>
[2] =>
[3] =>
)
[stock] => Array
(
[0] => 0
[1] => 0
[2] => 0
[3] => 0
)
[stock_unlimited] => Array
(
[0] =>
[1] =>
[2] =>
[3] =>
)
[price01] => Array
(
[0] =>
[1] =>
[2] =>
[3] =>
)
[price02] => Array
(
[0] => 100
[1] => 100
[2] => 100
[3] => 100
)
[tax_rate] => Array
(
[0] => 10
[1] => ← 何故!!
[2] => 10
[3] => ← 何故!!
)
[product_type_id] => Array
(
[0] => 1
[1] => 1
[2] => 1
[3] => 1
)
[del_flg] =>
[down_filename] =>
[down_realfilename] =>
[check] => Array
(
[0] => 1
[2] => 1
)
[upload_index] =>
)
上記で何故!!と書いたのは、以下のような選択、設定をしたからです。
【画像】
一番左のチェックを入れたものだけを規格として登録したいのに、未選択のデータを含めてループが行われており、その未選択のデータのtax_rateが空であるためINSERTがエラーになっておりました・・・。ですので、未選択のデータについては、基本税率を設定するようにして回避しました。
data/class/helper/SC_Helper_TaxRule.php
/**
* 税率設定情報を登録する(商品管理用)
*
* @param float $tax_rate 消費税率
* @param int $product_id 商品ID
* @param int $product_class_id 商品規格ID
* @param integer $tax_adjust 消費税加算額
* @param int $pref_id 県ID
* @param int $country_id 国ID
* @return void
*/
public static function setTaxRuleForProduct($tax_rate, $product_id = 0, $product_class_id = 0, $tax_adjust=0, $pref_id = 0, $country_id = 0)
{
// 基本設定を取得
$arrRet = SC_Helper_TaxRule_Ex::getTaxRule($product_id, $product_class_id);
// 基本設定の消費税率と一緒であれば設定しない
if ($arrRet['tax_rate'] != $tax_rate) {
// 税率未設定の場合は基本税率を設定 ← ここから
if($tax_rate == NULL){
$tax_rate = $arrRet['tax_rate'];
} ← ここまで
// 課税規則は基本設定のものを使用
$calc_rule = $arrRet['calc_rule'];
// 日付は登録時点を設定
$apply_date = date('Y/m/d H:i:s');
// 税情報を設定
SC_Helper_TaxRule_Ex::setTaxRule($calc_rule, $tax_rate, $apply_date, NULL, $tax_adjust, $product_id, $product_class_id, $pref_id, $country_id);
}
}
この話は少しオチがありまして、オリジナルのソースでカスタマイズもしていないのに、結構運用していて何故今までエラーが出なかったのかという話にディレクターさんとなりまして、「もしかして規格の組み合わせ全てを有効にしていたのではないですか。そうするとtax_rateが空にならないのではないですか?」と回答したところ、本当にそうだったそうです。チャンチャン。