引数としてやってきた現在のカテゴリから、子カテゴリのリストを取得しようと思います。
/data/class/helper/SC_Helper_DB.phpにはやたら沢山メソッドがあるのですが、その中にカテゴリ関連のものも存在します。
カテゴリを取得できるっぽいメソッドとしてSC_Helper_DB::sfGetCatTree()があります。
ちょっと試してみます。
親カテゴリIDが1のリストを取得してくるかと思えば、何故か商品が一件でも登録されているカテゴリが全て返ってきました。
なんだこれ。
試しに発行されたSQLを覗いてみると、
……何処にもparent_category_idの文字がない……
実際メソッドを見てみると、上記SQLで全てのカテゴリを取得後、親カテゴリIDを取得してその中に突っ込むという何をやっているのかさっぱりわからないことをやっています。
これは一体何のためのメソッドなんだ?
もうひとつカテゴリを取得できそうなメソッドを見つけました。
試してみます。
無事に想定どおり、親カテゴリIDが1であるカテゴリの配列が返ってきました。
めでたしめでたし。
が、調子に乗って
とすると死にます。
引数として'1 OR 1=1'を与えると見事に全カテゴリが返ってきてしまいました。
普通こういうメソッドを作る場合は$addwhereを連想配列なりプリペアドクエリなりにし、メソッド側でエスケープ処理を行います。
SC_Helper_DB::sfGetCategoryList()は
という信じがたいことをやっているので、外部引数を使用するときにはこのメソッドを使うことができません。
全てのメソッドがこのような作りであれば(よくはありませんが)まだましなのですが、
例えばSC_Helper_DB::sfDataExists($table_name, $where, $arrval)は引数$whereにプリペアドクエリを用意し$arrvalにその値を入れるという作りになっています。
という形で安全に引数を渡すことができるようになっているのです。
いやはやなんでこんな酷いことになってるんですかね。
簡単に子カテゴリリストを取得できるメソッドを追加しましょう。
/data/class_extends/helper_extends::SC_Helper_DB_Ex.php
何故この程度のメソッドが最初から用意されていないのかは謎。
SC_Helper_DBそのものについても、SC_Queryを毎回newせずにコンストラクタで用意しておいてSC_Queryにreset()、resetOrder()を用意してくれとかSC_Queryを渡したりするのをやめてくれとかいろいろ言いたいことはあるのですがあまりに酷すぎるのでもういいや。
EC-CUBEの記事
/data/class/helper/SC_Helper_DB.phpにはやたら沢山メソッドがあるのですが、その中にカテゴリ関連のものも存在します。
カテゴリを取得できるっぽいメソッドとしてSC_Helper_DB::sfGetCatTree()があります。
1
2
3
4
5
6
7
8
|
/**
* カテゴリツリーの取得を行う.
*
* @param integer $parent_category_id 親カテゴリID
* @param bool $count_check 登録商品数のチェックを行う場合 true
* @return array カテゴリツリーの配列
*/
function sfGetCatTree($parent_category_id, $count_check = false)
|
ちょっと試してみます。
1
|
$ret=$SC_Helper_DB->sfGetCatTree('1',false);
|
親カテゴリIDが1のリストを取得してくるかと思えば、何故か商品が一件でも登録されているカテゴリが全て返ってきました。
なんだこれ。
試しに発行されたSQLを覗いてみると、
1
2
3
4
5
6
7
|
SELECT
T1.category_id, category_name, level
FROM dtb_category AS T1
LEFT JOIN dtb_category_total_count AS T2
ON T1.category_id = T2.category_id
WHERE
del_flg = 0 AND product_count > 0ORDER BY rank DESC
|
……何処にもparent_category_idの文字がない……
実際メソッドを見てみると、上記SQLで全てのカテゴリを取得後、親カテゴリIDを取得してその中に突っ込むという何をやっているのかさっぱりわからないことをやっています。
これは一体何のためのメソッドなんだ?
もうひとつカテゴリを取得できそうなメソッドを見つけました。
1
2
3
4
5
6
7
8
9
10
11
12
|
/**
* カテゴリツリーの取得を行う.
*
* $products_check:true商品登録済みのものだけ取得する
*
* @param string $addwhere 追加する WHERE 句
* @param bool $products_check 商品の存在するカテゴリのみ取得する場合 true
* @param string $head カテゴリ名のプレフィックス文字列
* @return array カテゴリツリーの配列
*/
function sfGetCategoryList($addwhere = "",
$products_check = false, $head = CATEGORY_HEAD)
|
試してみます。
1
|
$ret=$SC_Helper_DB->sfGetCategoryList('parent_category_id=1',false);
|
無事に想定どおり、親カテゴリIDが1であるカテゴリの配列が返ってきました。
めでたしめでたし。
が、調子に乗って
1
2
|
$ret=$SC_Helper_DB->sfGetCategoryList(
'parent_category_id='.$_REQUEST['category_id'],false);
|
とすると死にます。
引数として'1 OR 1=1'を与えると見事に全カテゴリが返ってきてしまいました。
普通こういうメソッドを作る場合は$addwhereを連想配列なりプリペアドクエリなりにし、メソッド側でエスケープ処理を行います。
SC_Helper_DB::sfGetCategoryList()は
1
|
$where.= " AND $addwhere";
|
という信じがたいことをやっているので、外部引数を使用するときにはこのメソッドを使うことができません。
全てのメソッドがこのような作りであれば(よくはありませんが)まだましなのですが、
例えばSC_Helper_DB::sfDataExists($table_name, $where, $arrval)は引数$whereにプリペアドクエリを用意し$arrvalにその値を入れるという作りになっています。
1
2
|
$ret=$SC_Helper_DB->sfDataExists('dtb_category'
, 'parent_category_id=?', array($_REQUEST['category_id']))
|
という形で安全に引数を渡すことができるようになっているのです。
いやはやなんでこんな酷いことになってるんですかね。
簡単に子カテゴリリストを取得できるメソッドを追加しましょう。
/data/class_extends/helper_extends::SC_Helper_DB_Ex.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
/*
子カテゴリリストを取得
*/
public function getChildCategory($parent_category_id=0){
//SQL
$objQuery = new SC_Query();
$col = " * ";
$where = "del_flg = 0 AND parent_category_id = ?";
$objQuery->setOption("ORDER BY rank DESC");
//実行
$arrRet = $objQuery->select($col, "dtb_category",
$where, array($parent_category_id));
//返却
return $arrRet;
}
|
何故この程度のメソッドが最初から用意されていないのかは謎。
SC_Helper_DBそのものについても、SC_Queryを毎回newせずにコンストラクタで用意しておいてSC_Queryにreset()、resetOrder()を用意してくれとかSC_Queryを渡したりするのをやめてくれとかいろいろ言いたいことはあるのですがあまりに酷すぎるのでもういいや。
EC-CUBEの記事
PR
トラックバック
トラックバックURL: