source: branches/feature-module-update/data/class/helper/SC_Helper_DB.php @ 15224

Revision 15224, 18.6 KB checked in by nanasess, 15 years ago (diff)

DBインスタンスを生成する関数を Helper へ移動

  • Property svn:keywords set to Id Revision Date
  • Property svn:mime-type set to application/x-httpd-php
Line 
1<?php
2/*
3 * Copyright(c) 2000-2007 LOCKON CO.,LTD. All Rights Reserved.
4 *
5 * http://www.lockon.co.jp/
6 */
7
8/**
9 * DB関連のヘルパークラス.
10 *
11 * @package Helper
12 * @author LOCKON CO.,LTD.
13 * @version $Id$
14 */
15class SC_Helper_DB {
16
17    // }}}
18    // {{{ functions
19
20    /**
21     * データベースのバージョンを所得する.
22     *
23     * @param string $dsn データソース名
24     * @return string データベースのバージョン
25     */
26    function sfGetDBVersion($dsn = "") {
27        if($dsn == "") {
28            if(defined('DEFAULT_DSN')) {
29                $dsn = DEFAULT_DSN;
30            } else {
31                return;
32            }
33        }
34
35        $objQuery = new SC_Query($dsn, true, true);
36        list($db_type) = split(":", $dsn);
37        if($db_type == 'mysql') {
38            $val = $objQuery->getOne("select version()");
39            $version = "MySQL " . $val;
40        }
41        if($db_type == 'pgsql') {
42            $val = $objQuery->getOne("select version()");
43            $arrLine = split(" " , $val);
44            $version = $arrLine[0] . " " . $arrLine[1];
45        }
46        return $version;
47    }
48
49    /**
50     * テーブルの存在をチェックする.
51     *
52     * @param string $table_name チェック対象のテーブル名
53     * @param string $dsn データソース名
54     * @return テーブルが存在する場合 true
55     */
56    function sfTabaleExists($table_name, $dsn = "") {
57        if($dsn == "") {
58            if(defined('DEFAULT_DSN')) {
59                $dsn = DEFAULT_DSN;
60            } else {
61                return;
62            }
63        }
64
65        $objQuery = new SC_Query($dsn, true, true);
66        // 正常に接続されている場合
67        if(!$objQuery->isError()) {
68            list($db_type) = split(":", $dsn);
69            // postgresqlとmysqlとで処理を分ける
70            if ($db_type == "pgsql") {
71                $sql = "SELECT
72                            relname
73                        FROM
74                            pg_class
75                        WHERE
76                            (relkind = 'r' OR relkind = 'v') AND
77                            relname = ?
78                        GROUP BY
79                            relname";
80                $arrRet = $objQuery->getAll($sql, array($table_name));
81                if(count($arrRet) > 0) {
82                    return true;
83                }
84            }else if ($db_type == "mysql") {
85                $sql = "SHOW TABLE STATUS LIKE ?";
86                $arrRet = $objQuery->getAll($sql, array($table_name));
87                if(count($arrRet) > 0) {
88                    return true;
89                }
90            }
91        }
92        return false;
93    }
94
95    /**
96     * カラムの存在チェックと作成を行う.
97     *
98     * チェック対象のテーブルに, 該当のカラムが存在するかチェックする.
99     * 引数 $add が true の場合, 該当のカラムが存在しない場合は, カラムの生成を行う.
100     * カラムの生成も行う場合は, $col_type も必須となる.
101     *
102     * @param string $table_name テーブル名
103     * @param string $column_name カラム名
104     * @param string $col_type カラムのデータ型
105     * @param string $dsn データソース名
106     * @param bool $add カラムの作成も行う場合 true
107     * @return bool カラムが存在する場合とカラムの生成に成功した場合 true,
108     *               テーブルが存在しない場合 false,
109     *               引数 $add == false でカラムが存在しない場合 false
110     */
111    function sfColumnExists($table_name, $col_name, $col_type = "", $dsn = "", $add = false) {
112        if($dsn == "") {
113            if(defined('DEFAULT_DSN')) {
114                $dsn = DEFAULT_DSN;
115            } else {
116                return;
117            }
118        }
119
120        // テーブルが無ければエラー
121        if(!sfTabaleExists($table_name, $dsn)) return false;
122
123        $objQuery = new SC_Query($dsn, true, true);
124        // 正常に接続されている場合
125        if(!$objQuery->isError()) {
126            list($db_type) = split(":", $dsn);
127
128            // カラムリストを取得
129            $arrRet = sfGetColumnList($table_name, $objQuery, $db_type);
130            if(count($arrRet) > 0) {
131                if(in_array($col_name, $arrRet)){
132                    return true;
133                }
134            }
135        }
136
137        // カラムを追加する
138        if($add){
139            $objQuery->query("ALTER TABLE $table_name ADD $col_name $col_type ");
140            return true;
141        }
142
143        return false;
144    }
145
146    /**
147     * インデックスの存在チェックと作成を行う.
148     *
149     * チェック対象のテーブルに, 該当のインデックスが存在するかチェックする.
150     * 引数 $add が true の場合, 該当のインデックスが存在しない場合は, インデックスの生成を行う.
151     * インデックスの生成も行う場合で, DB_TYPE が mysql の場合は, $length も必須となる.
152     *
153     * @param string $table_name テーブル名
154     * @param string $column_name カラム名
155     * @param string $index_name インデックス名
156     * @param integer|string $length インデックスを作成するデータ長
157     * @param string $dsn データソース名
158     * @param bool $add インデックスの生成もする場合 true
159     * @return bool インデックスが存在する場合とインデックスの生成に成功した場合 true,
160     *               テーブルが存在しない場合 false,
161     *               引数 $add == false でインデックスが存在しない場合 false
162     */
163    function sfIndexExists($table_name, $col_name, $index_name, $length = "", $dsn = "", $add = false) {
164        if($dsn == "") {
165            if(defined('DEFAULT_DSN')) {
166                $dsn = DEFAULT_DSN;
167            } else {
168                return;
169            }
170        }
171
172        // テーブルが無ければエラー
173        if(!sfTabaleExists($table_name, $dsn)) return false;
174
175        $objQuery = new SC_Query($dsn, true, true);
176        // 正常に接続されている場合
177        if(!$objQuery->isError()) {
178            list($db_type) = split(":", $dsn);
179            switch($db_type) {
180            case 'pgsql':
181                // インデックスの存在確認
182                $arrRet = $objQuery->getAll("SELECT relname FROM pg_class WHERE relname = ?", array($index_name));
183                break;
184            case 'mysql':
185                // インデックスの存在確認
186                $arrRet = $objQuery->getAll("SHOW INDEX FROM ? WHERE Key_name = ?", array($table_name, $index_name));
187                break;
188            default:
189                return false;
190            }
191            // すでにインデックスが存在する場合
192            if(count($arrRet) > 0) {
193                return true;
194            }
195        }
196
197        // インデックスを作成する
198        if($add){
199            switch($db_type) {
200            case 'pgsql':
201                $objQuery->query("CREATE INDEX ? ON ? (?)", array($index_name, $table_name, $col_name));
202                break;
203            case 'mysql':
204                $objQuery->query("CREATE INDEX ? ON ? (?(?))", array($index_name, $table_name, $col_name, $length));
205                break;
206            default:
207                return false;
208            }
209            return true;
210        }
211        return false;
212    }
213
214    /**
215     * データの存在チェックを行う.
216     *
217     * @param string $table_name テーブル名
218     * @param string $where データを検索する WHERE 句
219     * @param string $dsn データソース名
220     * @param string $sql データの追加を行う場合の SQL文
221     * @param bool $add データの追加も行う場合 true
222     * @return bool データが存在する場合 true, データの追加に成功した場合 true,
223     *               $add == false で, データが存在しない場合 false
224     */
225    function sfDataExists($table_name, $where, $arrval, $dsn = "", $sql = "", $add = false) {
226        if($dsn == "") {
227            if(defined('DEFAULT_DSN')) {
228                $dsn = DEFAULT_DSN;
229            } else {
230                return;
231            }
232        }
233        $objQuery = new SC_Query($dsn, true, true);
234        $count = $objQuery->count($table_name, $where, $arrval);
235
236        if($count > 0) {
237            $ret = true;
238        } else {
239            $ret = false;
240        }
241        // データを追加する
242        if(!$ret && $add) {
243            $objQuery->exec($sql);
244        }
245        return $ret;
246    }
247
248    /**
249     * 商品規格情報を取得する.
250     *
251     * @param array $arrID 規格ID
252     * @return array 規格情報の配列
253     */
254    function sfGetProductsClass($arrID) {
255        list($product_id, $classcategory_id1, $classcategory_id2) = $arrID;
256
257        if($classcategory_id1 == "") {
258            $classcategory_id1 = '0';
259        }
260        if($classcategory_id2 == "") {
261            $classcategory_id2 = '0';
262        }
263
264        // 商品規格取得
265        $objQuery = new SC_Query();
266        $col = "product_id, deliv_fee, name, product_code, main_list_image, main_image, price01, price02, point_rate, product_class_id, classcategory_id1, classcategory_id2, class_id1, class_id2, stock, stock_unlimited, sale_limit, sale_unlimited";
267        $table = "vw_product_class AS prdcls";
268        $where = "product_id = ? AND classcategory_id1 = ? AND classcategory_id2 = ?";
269        $objQuery->setorder("rank1 DESC, rank2 DESC");
270        $arrRet = $objQuery->select($col, $table, $where, array($product_id, $classcategory_id1, $classcategory_id2));
271        return $arrRet[0];
272    }
273
274    /**
275     * カート内商品の集計処理を行う.
276     *
277     * @param LC_Page $objPage ページクラスのインスタンス
278     * @param SC_CartSession $objCartSess カートセッションのインスタンス
279     * @param array $arrInfo 商品情報の配列
280     * @return LC_Page 集計処理後のページクラスインスタンス
281     */
282    function sfTotalCart($objPage, $objCartSess, $arrInfo) {
283        // 規格名一覧
284        $arrClassName = SC_Utils::sfGetIDValueList("dtb_class", "class_id", "name");
285        // 規格分類名一覧
286        $arrClassCatName = SC_Utils::sfGetIDValueList("dtb_classcategory", "classcategory_id", "name");
287
288        $objPage->tpl_total_pretax = 0;     // 費用合計(税込み)
289        $objPage->tpl_total_tax = 0;        // 消費税合計
290        $objPage->tpl_total_point = 0;      // ポイント合計
291
292        // カート内情報の取得
293        $arrCart = $objCartSess->getCartList();
294        $max = count($arrCart);
295        $cnt = 0;
296
297        for ($i = 0; $i < $max; $i++) {
298            // 商品規格情報の取得
299            $arrData = $this->sfGetProductsClass($arrCart[$i]['id']);
300            $limit = "";
301            // DBに存在する商品
302            if (count($arrData) > 0) {
303
304                // 購入制限数を求める。
305                if ($arrData['stock_unlimited'] != '1' && $arrData['sale_unlimited'] != '1') {
306                    if($arrData['sale_limit'] < $arrData['stock']) {
307                        $limit = $arrData['sale_limit'];
308                    } else {
309                        $limit = $arrData['stock'];
310                    }
311                } else {
312                    if ($arrData['sale_unlimited'] != '1') {
313                        $limit = $arrData['sale_limit'];
314                    }
315                    if ($arrData['stock_unlimited'] != '1') {
316                        $limit = $arrData['stock'];
317                    }
318                }
319
320                if($limit != "" && $limit < $arrCart[$i]['quantity']) {
321                    // カート内商品数を制限に合わせる
322                    $objCartSess->setProductValue($arrCart[$i]['id'], 'quantity', $limit);
323                    $quantity = $limit;
324                    $objPage->tpl_message = "※「" . $arrData['name'] . "」は販売制限しております、一度にこれ以上の購入はできません。";
325                } else {
326                    $quantity = $arrCart[$i]['quantity'];
327                }
328
329                $objPage->arrProductsClass[$cnt] = $arrData;
330                $objPage->arrProductsClass[$cnt]['quantity'] = $quantity;
331                $objPage->arrProductsClass[$cnt]['cart_no'] = $arrCart[$i]['cart_no'];
332                $objPage->arrProductsClass[$cnt]['class_name1'] = $arrClassName[$arrData['class_id1']];
333                $objPage->arrProductsClass[$cnt]['class_name2'] = $arrClassName[$arrData['class_id2']];
334                $objPage->arrProductsClass[$cnt]['classcategory_name1'] = $arrClassCatName[$arrData['classcategory_id1']];
335                $objPage->arrProductsClass[$cnt]['classcategory_name2'] = $arrClassCatName[$arrData['classcategory_id2']];
336
337                // 画像サイズ
338                list($image_width, $image_height) = getimagesize(IMAGE_SAVE_DIR . basename($objPage->arrProductsClass[$cnt]["main_image"]));
339                $objPage->arrProductsClass[$cnt]["tpl_image_width"] = $image_width + 60;
340                $objPage->arrProductsClass[$cnt]["tpl_image_height"] = $image_height + 80;
341
342                // 価格の登録
343                if ($arrData['price02'] != "") {
344                    $objCartSess->setProductValue($arrCart[$i]['id'], 'price', $arrData['price02']);
345                    $objPage->arrProductsClass[$cnt]['uniq_price'] = $arrData['price02'];
346                } else {
347                    $objCartSess->setProductValue($arrCart[$i]['id'], 'price', $arrData['price01']);
348                    $objPage->arrProductsClass[$cnt]['uniq_price'] = $arrData['price01'];
349                }
350                // ポイント付与率の登録
351                $objCartSess->setProductValue($arrCart[$i]['id'], 'point_rate', $arrData['point_rate']);
352                // 商品ごとの合計金額
353                $objPage->arrProductsClass[$cnt]['total_pretax'] = $objCartSess->getProductTotal($arrInfo, $arrCart[$i]['id']);
354                // 送料の合計を計算する
355                $objPage->tpl_total_deliv_fee+= ($arrData['deliv_fee'] * $arrCart[$i]['quantity']);
356                $cnt++;
357            } else {
358                // DBに商品が見つからない場合はカート商品の削除
359                $objCartSess->delProductKey('id', $arrCart[$i]['id']);
360            }
361        }
362
363        // 全商品合計金額(税込み)
364        $objPage->tpl_total_pretax = $objCartSess->getAllProductsTotal($arrInfo);
365        // 全商品合計消費税
366        $objPage->tpl_total_tax = $objCartSess->getAllProductsTax($arrInfo);
367        // 全商品合計ポイント
368        $objPage->tpl_total_point = $objCartSess->getAllProductsPoint();
369
370        return $objPage;
371    }
372
373    /**
374     * 受注一時テーブルへの書き込み処理を行う.
375     *
376     * @param string $uniqid ユニークID
377     * @param array $sqlval SQLの値の配列
378     * @return void
379     */
380    function sfRegistTempOrder($uniqid, $sqlval) {
381        if($uniqid != "") {
382            // 既存データのチェック
383            $objQuery = new SC_Query();
384            $where = "order_temp_id = ?";
385            $cnt = $objQuery->count("dtb_order_temp", $where, array($uniqid));
386            // 既存データがない場合
387            if ($cnt == 0) {
388                // 初回書き込み時に会員の登録済み情報を取り込む
389                $sqlval = $this->sfGetCustomerSqlVal($uniqid, $sqlval);
390                $sqlval['create_date'] = "now()";
391                $objQuery->insert("dtb_order_temp", $sqlval);
392            } else {
393                $objQuery->update("dtb_order_temp", $sqlval, $where, array($uniqid));
394            }
395        }
396    }
397
398    /**
399     * 会員情報から SQL文の値を生成する.
400     *
401     * @param string $uniqid ユニークID
402     * @param array $sqlval SQL の値の配列
403     * @return array 会員情報を含んだ SQL の値の配列
404     */
405    function sfGetCustomerSqlVal($uniqid, $sqlval) {
406        $objCustomer = new SC_Customer();
407        // 会員情報登録処理
408        if ($objCustomer->isLoginSuccess()) {
409            // 登録データの作成
410            $sqlval['order_temp_id'] = $uniqid;
411            $sqlval['update_date'] = 'Now()';
412            $sqlval['customer_id'] = $objCustomer->getValue('customer_id');
413            $sqlval['order_name01'] = $objCustomer->getValue('name01');
414            $sqlval['order_name02'] = $objCustomer->getValue('name02');
415            $sqlval['order_kana01'] = $objCustomer->getValue('kana01');
416            $sqlval['order_kana02'] = $objCustomer->getValue('kana02');
417            $sqlval['order_sex'] = $objCustomer->getValue('sex');
418            $sqlval['order_zip01'] = $objCustomer->getValue('zip01');
419            $sqlval['order_zip02'] = $objCustomer->getValue('zip02');
420            $sqlval['order_pref'] = $objCustomer->getValue('pref');
421            $sqlval['order_addr01'] = $objCustomer->getValue('addr01');
422            $sqlval['order_addr02'] = $objCustomer->getValue('addr02');
423            $sqlval['order_tel01'] = $objCustomer->getValue('tel01');
424            $sqlval['order_tel02'] = $objCustomer->getValue('tel02');
425            $sqlval['order_tel03'] = $objCustomer->getValue('tel03');
426            if (defined('MOBILE_SITE')) {
427                $sqlval['order_email'] = $objCustomer->getValue('email_mobile');
428            } else {
429                $sqlval['order_email'] = $objCustomer->getValue('email');
430            }
431            $sqlval['order_job'] = $objCustomer->getValue('job');
432            $sqlval['order_birth'] = $objCustomer->getValue('birth');
433        }
434        return $sqlval;
435    }
436
437    /**
438     * 受注一時テーブルから情報を取得する.
439     *
440     * @param integer $order_temp_id 受注一時ID
441     * @return array 受注一時情報の配列
442     */
443    function sfGetOrderTemp($order_temp_id) {
444        $objQuery = new SC_Query();
445        $where = "order_temp_id = ?";
446        $arrRet = $objQuery->select("*", "dtb_order_temp", $where, array($order_temp_id));
447        return $arrRet[0];
448    }
449
450    /**
451     * SELECTボックス用リストを作成する.
452     *
453     * @param string $table テーブル名
454     * @param string $keyname プライマリーキーのカラム名
455     * @param string $valname データ内容のカラム名
456     * @return array SELECT ボックス用リストの配列
457     */
458    function sfGetIDValueList($table, $keyname, $valname) {
459        $objQuery = new SC_Query();
460        $col = "$keyname, $valname";
461        $objQuery->setwhere("del_flg = 0");
462        $objQuery->setorder("rank DESC");
463        $arrList = $objQuery->select($col, $table);
464        $count = count($arrList);
465        for($cnt = 0; $cnt < $count; $cnt++) {
466            $key = $arrList[$cnt][$keyname];
467            $val = $arrList[$cnt][$valname];
468            $arrRet[$key] = $val;
469        }
470        return $arrRet;
471    }
472}
473?>
Note: See TracBrowser for help on using the repository browser.