EC-CUBE2.4.3をMySQL4.1で利用すると、管理画面の受注履歴編集画面の商品の追加で、システムエラーとなります。
ログイン→受注管理→受注履歴検索→受注履歴編集画面→商品追加ボタンクリック→商品検索画面(ポップアップ)
→カテゴリを選択、または商品名を入力→検索を開始ボタンクリック→システムエラー!!
原因を調査したところ、ファイル「/data/class/pages/admin/order/LC_Page_Admin_Order_ProductSelect.php」の
商品検索SQLを発行した瞬間に「#1052 - Column ‘product_id’ in IN/ALL/ANY subquery is ambiguous」という
MySQLのエラーが発生していました。
このエラーは、カラム「‘product_id’」があいまいな指定になっているという事を指摘しており、
SQLの対象テーブルのうち、SELECT句の中に2つ以上のテーブルに存在するカラム「‘product_id’」を指定している場合によく起こります。
(例)TABLE_AとTABLE_BにあるIDを取得する。
SELECT A.ID, B.ID FROM TABLE_A AS A, TABLE_B AS B
と記述すべきところを
SELECT ID, ID FROM TABLE_A AS A, TABLE_B AS B
と記述してしまった場合、SELECT句にある「ID」「ID」はTABLE_AとTABLE_BのどちらのIDなのか
コンピュータは判断する事ができません。
(人間でも、ルールを知らなければ、判断できません。)
そこでMySQLは、カラム「ID」があいまいな指定になっているとエラーを出力します。
ここで発行しているSQLが、「/data/logs/site.log」に記録されていましたので、確認したところ、
上記「LC_Page_Admin_Order_ProductSelect.php」の100行目と105行目付近の商品検索条件をセットしているところで、
$where.= ” AND product_id IN (~
と、SQLを記述しており、どのテーブルのカラム「product_id」か指定されていません。
よって、上記の箇所を、
$where.= ” AND T1.product_id IN (~
というように修正して、テーブルをきちんと指定する事でエラーは回避できます。
が、残念な事に、該当の箇所は、商品マスタ検索機能でも流用されている為、
今度は、商品マスタ検索機能でエラーが発生するようになります。
(商品マスタ検索機能は、dtb_productしか検索の対象としていない為、T1を指定するとテーブルが見つからないというエラーが発生!)
よって、以下のように商品検索と商品マスタ検索の処理を別々に分けて修正する必要があります。
(97行目付近のCASE文)
case ’search_category_id’:
list($tmp_where, $tmp_arrval) = $objDb->sfGetCatWhere($val);
if($tmp_where != “”) {
$whereSelect = $where . ” AND T1.product_id IN (SELECT product_id FROM dtb_product_categories WHERE ” . $tmp_where . “)”;
$where.= ” AND product_id IN (SELECT product_id FROM dtb_product_categories WHERE ” . $tmp_where . “)”;
$arrval = array_merge((array)$arrval, (array)$tmp_arrval);
}
break;
case ’search_product_code’:
$whereSelect = $where . ” AND T1.product_id IN (SELECT product_id FROM dtb_products_class WHERE product_code LIKE ? GROUP BY product_id)”;
$where .= ” AND product_id IN (SELECT product_id FROM dtb_products_class WHERE product_code LIKE ? GROUP BY product_id)”;
$arrval[] = “$val%”;
break;
default:
さらに170行目付近のSQLを実行するselectメソッドの引数を$whereSelectに変更します。
// 検索結果の取得
$this->arrProducts = $objQuery->select($col, $from, $whereSelect, $arrval);
これで、問題なく商品検索が動作すると思います。
ちなみにMySQL5の場合、このエラーは発生せずに処理が実行されます。



最近のコメント