Changes between Initial Version and Version 1 of テストデータ生成スクリプト(v2.0)


Ignore:
Timestamp:
2008/01/08 18:50:23 (15 years ago)
Author:
nanasess
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • テストデータ生成スクリプト(v2.0)

    v1 v1  
     1= テストデータ生成スクリプト = 
     2 
     3EC-CUBE 2.0.x 用のテストデータ生成スクリプトです. 
     4 
     5cli 版の PHP を使用し, このスクリプトを実行することにより, テスト用の商品データを自動生成します. 
     6 * 実行時間の計測に PHP5 のみサポートされている関数を使用しています. PHP4 を使用した場合は, 実行時間の計測ができません. 
     7 * Pear::DB に依存していますので, include_path に Pear::DB が必要です. 
     8 * 下記の PHPコードをコピーして, !CreateEcCubeData.php というファイル名で保存して下さい. 
     9 * 先頭の #!/usr/local/bin/php というパスを環境に合わせて編集して下さい. 
     10 * define の値を環境に合わせて編集して下さい. 
     11 
     12== 実行例 == 
     13{{{ 
     14 % ./CreateEcCubeData.php 
     15}}} 
     16 
     17 
     18== !CreateEcCubeData.php == 
     19{{{ 
     20#!php 
     21#!/usr/local/bin/php -q 
     22<?php 
     23/* 
     24 * EC-CUBE データ生成スクリプト 
     25 * 
     26 * Copyright(c) 2000-2008 LOCKON CO.,LTD. All Rights Reserved. 
     27 * 
     28 * http://www.lockon.co.jp/ 
     29 * 
     30 * This program is free software; you can redistribute it and/or 
     31 * modify it under the terms of the GNU General Public License 
     32 * as published by the Free Software Foundation; either version 2 
     33 * of the License, or (at your option) any later version. 
     34 * 
     35 * This program is distributed in the hope that it will be useful, 
     36 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
     37 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
     38 * GNU General Public License for more details. 
     39 * 
     40 * You should have received a copy of the GNU General Public License 
     41 * along with this program; if not, write to the Free Software 
     42 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. 
     43 * 
     44 * @auther Kentaro Ohkouchi 
     45 * @version $Id$ 
     46 */ 
     47 
     48// {{{ requires 
     49require_once("DB.php"); 
     50 
     51// }}} 
     52// {{{ constants 
     53 
     54/** データベース種別 */ 
     55define("DB_TYPE", "pgsql"); 
     56/** DBホスト */ 
     57define("DB_SERVER", "localhost"); 
     58/** DBポート */ 
     59define("DB_PORT", "5432"); 
     60/** DB名 */ 
     61define("DB_NAME", "eccube_db"); 
     62/** DBユーザー */ 
     63define("DB_USER", "eccube_db_user"); 
     64/** DBパスワード */ 
     65define("DB_PASSWORD", "password"); 
     66 
     67/** データソース名 */ 
     68define ("DEFAULT_DSN", 
     69        DB_TYPE . "://" . DB_USER . ":" . DB_PASSWORD . "@" 
     70                    . DB_SERVER . ":" .DB_PORT . "/" . DB_NAME); 
     71 
     72/** 大カテゴリの生成数 */ 
     73define("TOP_CATEGORIES_VOLUME", 5); 
     74 
     75/** 中カテゴリの生成数 */ 
     76define("MIDDLE_CATEGORIES_VOLUME", 2); 
     77 
     78/** 小カテゴリの生成数 */ 
     79define("SMALL_CATEGORIES_VOLUME", 3); 
     80 
     81/** 規格1の生成数 */ 
     82define("CLASSCATEGORY1_VOLUME", 1); 
     83 
     84/** 規格2の生成数 */ 
     85define("CLASSCATEGORY2_VOLUME", 2); 
     86 
     87/** 商品の生成数 */ 
     88define("PRODUCTS_VOLUME", 100); 
     89 
     90// }}} 
     91// {{{ Logic 
     92 
     93$objData = new CreateEcCubeData(); 
     94$start = microtime(true); 
     95$objData->objQuery->begin(); 
     96 
     97// カテゴリ生成 
     98$objData->createCategories(); 
     99// 規格生成 
     100$objData->createClassData(); 
     101// 商品生成 
     102$objData->createProducts(); 
     103// 商品と規格の関連づけ 
     104$objData->relateClass(); 
     105// 商品とカテゴリの関連づけ 
     106$objData->relateProductsCategories(); 
     107//$objData->objQuery->rollback(); 
     108$objData->objQuery->commit(); 
     109$end = microtime(true); 
     110print("データの生成が完了しました!\n"); 
     111printf("所要時間 %f 秒\n", $end - $start); 
     112 
     113 
     114// }}} 
     115// {{{ classes 
     116 
     117/** 
     118 * EC-CUBE のデータを生成する 
     119 */ 
     120class CreateEcCubeData { 
     121 
     122    /** SC_Query インスタンス */ 
     123    var $objQuery; 
     124 
     125    /** 大カテゴリID の配列 */ 
     126    var $arrCategory1  = array(); 
     127 
     128    /** 中カテゴリID の配列 */ 
     129    var $arrCategory2  = array(); 
     130 
     131    /** 小カテゴリID の配列 */ 
     132    var $arrCategory3  = array(); 
     133 
     134    /** 規格1 */ 
     135    var $arrClassCategory_id1 = array(); 
     136 
     137    /** 規格2 */ 
     138    var $arrClassCategory_id2 = array(); 
     139 
     140    /** 
     141     * コンストラクタ. 
     142     */ 
     143    function CreateEcCubeData() { 
     144        $this->objQuery = new SC_Query(); 
     145    } 
     146 
     147    /** 
     148     * カテゴリを生成する. 
     149     * 
     150     * 以下のように, ツリー状のカテゴリを生成する 
     151     * 
     152     *  大カテゴリ -- 中カテゴリ -- 小カテゴリ 
     153     *             |             |- 小カテゴリ 
     154     *             |             |- 小カテゴリ 
     155     *             | 
     156     *             |- 中カテゴリ -- 小カテゴリ 
     157     *                            |- 小カテゴリ 
     158     *                            |- 小カテゴリ 
     159     * @return void 
     160     */ 
     161    function createCategories() { 
     162 
     163        print("カテゴリを生成しています...\n"); 
     164 
     165        $count = 0; 
     166 
     167        // 全カテゴリ共通の値 
     168        $sqlval['creator_id'] = 2; 
     169        $sqlval['create_date'] = "now()"; 
     170        $sqlval['update_date'] = "now()"; 
     171        $sqlval['del_flg'] = (string) "0"; 
     172 
     173        // 大カテゴリを生成 
     174        for ($i = 0; $i < TOP_CATEGORIES_VOLUME; $i++) { 
     175            $sqlval['category_name'] = sprintf("Category%d00", $i); 
     176            $sqlval['parent_category_id'] = (string) "0"; 
     177            $sqlval['level'] = 1; 
     178            $sqlval['rank'] = $count; 
     179 
     180            $this->objQuery->insert("dtb_category", $sqlval); 
     181            $category_id1 = $this->objQuery->currval("dtb_category", 
     182                                                     "category_id"); 
     183            $this->arrCategory1[] = $category_id1; 
     184            $count++; 
     185            print("."); 
     186 
     187            // 中カテゴリを生成 
     188            for ($j = 0; $j < MIDDLE_CATEGORIES_VOLUME; $j++) { 
     189                $sqlval['category_name'] = sprintf("Category%d%d0", $i, 
     190                                                   $j + MIDDLE_CATEGORIES_VOLUME); 
     191                $sqlval['parent_category_id'] = (string) $category_id1; 
     192                $sqlval['level'] = 2; 
     193                $sqlval['rank'] = $count; 
     194 
     195                $this->objQuery->insert("dtb_category", $sqlval); 
     196                $category_id2 = $this->objQuery->currval("dtb_category", 
     197                                                         "category_id"); 
     198                $this->arrCategory2[] = $category_id2; 
     199                $count++; 
     200                print("."); 
     201 
     202                // 小カテゴリを生成 
     203                for ($k = 0; $k < SMALL_CATEGORIES_VOLUME; $k++) { 
     204                    $sqlval['category_name'] = sprintf("Category%d%d%d", 
     205                                                       $i, $j, 
     206                                                       $k + SMALL_CATEGORIES_VOLUME); 
     207                    $sqlval['parent_category_id'] = (string) $category_id2; 
     208                    $sqlval['level'] = 3; 
     209                    $sqlval['rank'] = $count; 
     210 
     211                    $this->objQuery->insert("dtb_category", $sqlval); 
     212                    $category_id3 = $this->objQuery->currval("dtb_category", 
     213                                                             "category_id"); 
     214                    $this->arrCategory3[] = $category_id3; 
     215                    $count++; 
     216                    print("."); 
     217                } 
     218            } 
     219        } 
     220        print("\n"); 
     221    } 
     222 
     223    /** 
     224     * 規格を生成する. 
     225     * 
     226     * @return void 
     227     */ 
     228    function createClassData() { 
     229        // 規格データ生成 
     230        print("規格データを生成しています...\n"); 
     231        $this->createClass("Size"); 
     232        $this->createClass("Color"); 
     233        print("\n"); 
     234 
     235        // 規格分類データ生成 
     236        print("規格分類データを生成しています...\n"); 
     237 
     238        // 規格1 
     239        for ($i = 0; $i < CLASSCATEGORY1_VOLUME; $i++) { 
     240            $this->createClassCategory($this->arrSize[$i], 
     241                                       $this->arrclass_id[0], "size"); 
     242        } 
     243 
     244        // 規格2 
     245        for ($i = 0; $i < CLASSCATEGORY2_VOLUME; $i++) { 
     246            $this->createClassCategory($this->arrSize[$i], 
     247                                       $this->arrclass_id[1], "color"); 
     248        } 
     249 
     250        print("\n"); 
     251    } 
     252 
     253    /** 
     254     * 商品と規格の関連づけを行う. 
     255     * 
     256     * @return void 
     257     */ 
     258    function relateClass() { 
     259 
     260        print("商品と規格の関連づけを行います...\n"); 
     261 
     262        foreach ($this->arrProduct_id as $product_id) { 
     263            $this->createProductsClass($product_id); 
     264        } 
     265        print("\n"); 
     266    } 
     267 
     268    /** 
     269     * 商品を生成する. 
     270     * 
     271     * @return void 
     272     */ 
     273    function createProducts() { 
     274 
     275        print("商品を生成しています...\n"); 
     276        for ($i = 0; $i < PRODUCTS_VOLUME; $i++) { 
     277            $sqlval['name'] = sprintf("商品%d", $i); 
     278            $sqlval['status'] = 1; 
     279            $sqlval['product_flag'] = "10010"; 
     280            $sqlval['point_rate'] = 1; 
     281            $sqlval['comment3'] = "コメント"; 
     282            $sqlval['main_list_comment'] = "コメント"; 
     283            $sqlval['main_list_image'] = "08311201_44f65122ee5fe.jpg"; 
     284            $sqlval['main_comment'] = "コメント"; 
     285            $sqlval['main_image'] = "08311202_44f6515906a41.jpg"; 
     286            $sqlval['main_large_image'] = "08311203_44f651959bcb5.jpg"; 
     287            $sqlval['sub_comment1'] = "コメント"; 
     288            $sqlval['del_flg'] = (string) "0"; 
     289            $sqlval['creator_id'] = 2; 
     290            $sqlval['create_date'] = "now()"; 
     291            $sqlval['update_date'] = "now()"; 
     292            $sqlval['deliv_date_id'] = 2; 
     293 
     294            $this->objQuery->insert("dtb_products", $sqlval); 
     295            $this->arrProduct_id[] = $this->objQuery->currval("dtb_products", 
     296                                                              "product_id"); 
     297            print("*"); 
     298        } 
     299    } 
     300 
     301    /** 
     302     * 規格を生成する. 
     303     * 
     304     * @param $class_name string 規格名 
     305     * @return void 
     306     */ 
     307    function createClass($class_name) { 
     308        $sqlval['name'] = $class_name; 
     309        $sqlval['status'] = null; 
     310        $sqlval['rank'] = "~(SELECT CASE 
     311                                      WHEN max(rank) + 1 IS NULL THEN 1 
     312                                      ELSE max(rank) + 1 
     313                                    END 
     314                               FROM dtb_class 
     315                              WHERE del_flg = 0),"; 
     316        $sqlval['creator_id'] = 2; 
     317        $sqlval['update_date'] = "now()"; 
     318        $sqlval['del_flg'] = (string) "0"; 
     319        $sqlval['product_id'] = null; 
     320 
     321        $this->objQuery->insert("dtb_class", $sqlval); 
     322 
     323        // class_idを取得 
     324        $this->arrclass_id[] = $this->objQuery->currval("dtb_class", "class_id"); 
     325        print("+"); 
     326    } 
     327 
     328    /** 
     329     * 規格分類を生成する. 
     330     * 
     331     * @param $classcategory_name string 規格名 
     332     * @return void 
     333     */ 
     334    function createClassCategory($classcategory_name, $class_id, $class_name) { 
     335        $sqlval['name'] = $classcategory_name; 
     336        $sqlval['class_id'] = $class_id; 
     337        $sqlval['status'] = null; 
     338        $sqlval['rank'] = sprintf("~(SELECT CASE 
     339                                              WHEN max(rank) + 1 IS NULL THEN 1 
     340                                              ELSE max(rank) + 1 
     341                                            END 
     342                                       FROM dtb_classcategory 
     343                                      WHERE del_flg = 0 
     344                                        AND class_id = %d),", $class_id); 
     345        $sqlval['creator_id'] = 2; 
     346        $sqlval['create_date'] = "now()"; 
     347        $sqlval['update_date'] = "now()"; 
     348        $sqlval['del_flg'] = (string) "0"; 
     349 
     350        $this->objQuery->insert("dtb_classcategory", $sqlval); 
     351 
     352        switch ($class_name) { 
     353        case "size": 
     354            $this->arrClassCategory_id1[] = 
     355                $this->objQuery->currval("dtb_classcategory", 
     356                                         "classcategory_id"); 
     357            break; 
     358 
     359        case "color": 
     360            $this->arrClassCategory_id2[] = 
     361                $this->objQuery->currval("dtb_classcategory", 
     362                                         "classcategory_id"); 
     363            break; 
     364        default: 
     365        } 
     366        print("+"); 
     367    } 
     368 
     369    /** 
     370     * 商品規格を生成する. 
     371     * 
     372     * @param integer $product_id 商品ID 
     373     * @return void 
     374     */ 
     375    function createProductsClass($product_id) { 
     376 
     377        printf("商品ID %d の商品規格を生成しています...\n", $product_id); 
     378 
     379        $sqlval['product_id'] = $product_id; 
     380        $sqlval['stock_unlimited'] = 1; 
     381        $sqlval['price01'] = 1000; 
     382        $sqlval['price02'] = 2000; 
     383        $sqlval['creator_id'] = 2; 
     384        $sqlval['create_date'] = "now()"; 
     385        $sqlval['update_date'] = "now()"; 
     386 
     387        $count = 0; 
     388        foreach ($this->arrClassCategory_id1 as $classCategory_id1) { 
     389            $sqlval['classcategory_id1'] = $classCategory_id1; 
     390 
     391            foreach ($this->arrClassCategory_id2 as $classCategory_id2) { 
     392                $sqlval['classcategory_id2'] = $classCategory_id2; 
     393                $sqlval['product_code'] = sprintf("商品コード%d", $count); 
     394 
     395                $this->objQuery->insert("dtb_products_class", $sqlval); 
     396                $count++; 
     397                print("#"); 
     398            } 
     399        } 
     400        print("\n"); 
     401    } 
     402 
     403    /** 
     404     * 商品とカテゴリの関連づけを行う. 
     405     * 
     406     * @return void 
     407     */ 
     408    function relateProductsCategories() { 
     409 
     410        print("商品とカテゴリの関連づけを行います...\n"); 
     411        $this->createProductsCategories($this->arrCategory1, "大カテゴリ"); 
     412        $this->createProductsCategories($this->arrCategory2, "中カテゴリ"); 
     413        $this->createProductsCategories($this->arrCategory3, "小カテゴリ"); 
     414    } 
     415 
     416    /** 
     417     * 商品カテゴリを生成する. 
     418     * 
     419     * @param array $arrCategory_id カテゴリID の配列 
     420     * @return void 
     421     */ 
     422    function createProductsCategories($arrCategory_id, $category_name) { 
     423 
     424        $count = 0; 
     425        printf("%s の商品カテゴリを生成しています...\n", $category_name); 
     426        foreach ($arrCategory_id as $category_id) { 
     427            $sqlval['category_id'] = $category_id; 
     428 
     429            foreach($this->arrProduct_id as $product_id) { 
     430                $sqlval['product_id'] = $product_id; 
     431                $sqlval['rank'] = $count; 
     432 
     433                $this->objQuery->insert("dtb_product_categories", $sqlval); 
     434                $count++; 
     435                print("$"); 
     436            } 
     437        } 
     438        print("\n"); 
     439    } 
     440 
     441    /** 規格1 */ 
     442    var $arrSize = array("m11(29cm)" 
     443                         ,"m10 1/2(28.5cm)" 
     444                         ,"m10(28cm)" 
     445                         ,"m9 1/2(27.5cm)" 
     446                         ,"m9(27cm)" 
     447                         ,"m8 1/2(26.5cm)" 
     448                         ,"m8(26cm)" 
     449                         ,"43" 
     450                         ,"42" 
     451                         ,"41" 
     452                         ,"43(27.0cm?27.5cm)" 
     453                         ,"42(26.5cm?27.0cm)" 
     454                         ,"37(ladies 23.5?24cm)" 
     455                         ,"42(約27.5cm)" 
     456                         ,"41(約26.5cm)" 
     457                         ,"W36" 
     458                         ,"W34" 
     459                         ,"W32" 
     460                         ,"43" 
     461                         ,"42" 
     462                         ,"41" 
     463                         ,"m11" 
     464                         ,"m10" 
     465                         ,"m9.5" 
     466                         ,"m9" 
     467                         ,"m8" 
     468                         ,"FREE" 
     469                         ,"XS" 
     470                         ,"S" 
     471                         ,"M" 
     472                         ,"L" 
     473                         ,"XL" 
     474                         ,"25-27" 
     475                         ,"27-29" 
     476                         ,"W28" 
     477                         ,"W29" 
     478                         ,"W30" 
     479                         ,"W31" 
     480                         ,"W32" 
     481                         ,"W33" 
     482                         ,"W34" 
     483                         ,"W35" 
     484                         ,"W36" 
     485                         ,"4" 
     486                         ,"6" 
     487                         ,"8" 
     488                         ,"10" 
     489                         ,"12" 
     490                         ,"10cm" 
     491                         ,"12cm" 
     492                         ,"14cm" 
     493                         ,"16cm" 
     494                         ,"18cm" 
     495                         ,"20cm" 
     496                         ,"22cm" 
     497                         ,"24cm" 
     498                         ,"26cm" 
     499                         ,"28cm" 
     500                         ,"30cm" 
     501                         ,"32cm" 
     502                         ,"34cm" 
     503                         ,"36cm" 
     504                         ,"38cm" 
     505                         ,"40cm" 
     506                         ,"10g" 
     507                         ,"20g" 
     508                         ,"30g" 
     509                         ,"40g" 
     510                         ,"50g" 
     511                         ,"60g" 
     512                         ,"70g" 
     513                         ,"80g" 
     514                         ,"90g" 
     515                         ,"100g" 
     516                         ,"110g" 
     517                         ,"120g" 
     518                         ,"130g" 
     519                         ,"140g" 
     520                         ,"150g" 
     521                         ,"160g" 
     522                         ,"170g" 
     523                         ,"180g" 
     524                         ,"190g" 
     525                         ,"200g" 
     526                         ,"8inch" 
     527                         ,"10inch" 
     528                         ,"12inch" 
     529                         ,"14inch" 
     530                         ,"16inch" 
     531                         ,"18inch" 
     532                         ,"20inch" 
     533                         ,"22inch" 
     534                         ,"24inch" 
     535                         ,"26inch" 
     536                         ,"28inch" 
     537                         ,"30inch" 
     538                         ,"32inch" 
     539                         ,"34inch" 
     540                         ,"36inch" 
     541                         ,"38inch" 
     542                    ); 
     543 
     544    /** 規格2 */ 
     545    var $arrColor = array("white" 
     546                         ,"whitesmoke" 
     547                         ,"snow" 
     548                         ,"ghostwhite" 
     549                         ,"mintcream" 
     550                         ,"azure" 
     551                         ,"ivory" 
     552                         ,"floralwhite" 
     553                         ,"aliceblue" 
     554                         ,"lavenderblush" 
     555                         ,"seashell" 
     556                         ,"honeydew" 
     557                         ,"lightyellow" 
     558                         ,"oldlace" 
     559                         ,"cornsilk" 
     560                         ,"linen" 
     561                         ,"lemonchiffon" 
     562                         ,"lavender" 
     563                         ,"beige" 
     564                         ,"lightgoldenrodyellow" 
     565                         ,"mistyrose" 
     566                         ,"papayawhip" 
     567                         ,"antiquewhite" 
     568                         ,"lightcyan" 
     569                         ,"cyan" 
     570                         ,"aqua" 
     571                         ,"darkcyan" 
     572                         ,"teal" 
     573                         ,"darkslategray" 
     574                         ,"turquoise" 
     575                         ,"paleturquoise" 
     576                         ,"mediumturquoise" 
     577                         ,"aquamarine" 
     578                         ,"gainsboro" 
     579                         ,"lightgray" 
     580                         ,"silver" 
     581                         ,"darkgray" 
     582                         ,"gray" 
     583                         ,"dimgray" 
     584                         ,"black" 
     585                         ,"powderblue" 
     586                         ,"lightblue" 
     587                         ,"lightskyblue" 
     588                         ,"skyblue" 
     589                         ,"darkturquoise" 
     590                         ,"deepskyblue" 
     591                         ,"dodgerblue" 
     592                         ,"royalblue" 
     593                         ,"cornflowerblue" 
     594                         ,"cadetblue" 
     595                         ,"lightsteelblue" 
     596                         ,"steelblue" 
     597                         ,"lightslategray" 
     598                         ,"slategray" 
     599                         ,"blue" 
     600                         ,"mediumblue" 
     601                         ,"darkblue" 
     602                         ,"navy" 
     603                         ,"midnightblue" 
     604                         ,"lightsalmon" 
     605                         ,"darksalmon" 
     606                         ,"salmon" 
     607                         ,"tomato" 
     608                         ,"lightcoral" 
     609                         ,"coral" 
     610                         ,"crimson" 
     611                         ,"red" 
     612                         ,"mediumorchid" 
     613                         ,"mediumpurple" 
     614                         ,"mediumslateblue" 
     615                         ,"slateblue" 
     616                         ,"blueviolet" 
     617                         ,"darkviolet" 
     618                         ,"darkorchid" 
     619                         ,"darkslateblue" 
     620                         ,"darkorchid" 
     621                         ,"thistle" 
     622                         ,"plum" 
     623                         ,"violet" 
     624                         ,"magenta" 
     625                         ,"fuchsia" 
     626                         ,"darkmagenta" 
     627                         ,"purple" 
     628                         ,"palegreen" 
     629                         ,"lightgreen" 
     630                         ,"lime" 
     631                         ,"limegreen" 
     632                         ,"forestgreen" 
     633                         ,"green" 
     634                         ,"darkgreen" 
     635                         ,"greenyellow" 
     636                         ,"chartreuse" 
     637                         ,"lawngreen" 
     638                         ,"yellowgreen" 
     639                         ,"olivedrab" 
     640                         ,"darkolivegreen" 
     641                         ,"mediumaquamarine" 
     642                         ,"mediumspringgreen" 
     643                         ,"springgreen" 
     644                         ,"darkseagreen" 
     645                     ); 
     646 
     647} 
     648 
     649/** 
     650 * クエリを生成して実行する. 
     651 * 
     652 * (EC-CUBE からの移植) 
     653 */ 
     654class SC_Query { 
     655    var $option; 
     656    var $where; 
     657    var $conn; 
     658    var $groupby; 
     659    var $order; 
     660 
     661    // コンストラクタ 
     662    /* 
     663        $err_disp:エラー表示を行うか 
     664        $new:新規に接続を行うか 
     665     */ 
     666    function SC_Query($dsn = "", $err_disp = true, $new = false) { 
     667        $this->conn = new SC_DbConn($dsn, $err_disp, $new); 
     668        $this->where = ""; 
     669        return $this->conn; 
     670    } 
     671 
     672    // エラー判定 
     673    function isError() { 
     674        if(PEAR::isError($this->conn->conn)) { 
     675            return true; 
     676        } 
     677        return false; 
     678    } 
     679 
     680    // COUNT文の実行 
     681    function count($table, $where = "", $arrval = array()) { 
     682        if(strlen($where) <= 0) { 
     683            $sqlse = "SELECT COUNT(*) FROM $table"; 
     684        } else { 
     685            $sqlse = "SELECT COUNT(*) FROM $table WHERE $where"; 
     686        } 
     687        // カウント文の実行 
     688        $ret = $this->conn->getOne($sqlse, $arrval); 
     689        return $ret; 
     690    } 
     691 
     692    function select($col, $table, $where = "", $arrval = array()){ 
     693        $sqlse = $this->getsql($col, $table, $where); 
     694        // DBに依存した SQL へ変換 
     695        $dbFactory = SC_DB_DBFactory::getInstance(); 
     696        $sqlse = $dbFactory->sfChangeMySQL($sqlse); 
     697        $ret = $this->conn->getAll($sqlse, $arrval); 
     698        return $ret; 
     699    } 
     700 
     701    function getLastQuery($disp = true) { 
     702        $sql = $this->conn->conn->last_query; 
     703        if($disp) { 
     704            print($sql.";<br />\n"); 
     705        } 
     706        return $sql; 
     707    } 
     708 
     709    function commit() { 
     710        $this->conn->query("COMMIT"); 
     711    } 
     712 
     713    function begin() { 
     714        $this->conn->query("BEGIN"); 
     715    } 
     716 
     717    function rollback() { 
     718        $this->conn->query("ROLLBACK"); 
     719    } 
     720 
     721    function exec($str, $arrval = array()) { 
     722        $this->conn->query($str, $arrval); 
     723    } 
     724 
     725    function autoselect($col, $table, $arrwhere = array(), $arrcon = array()) { 
     726        $strw = ""; 
     727        $find = false; 
     728        foreach ($arrwhere as $key => $val) { 
     729            if(strlen($val) > 0) { 
     730                if(strlen($strw) <= 0) { 
     731                    $strw .= $key ." LIKE ?"; 
     732                } else if(strlen($arrcon[$key]) > 0) { 
     733                    $strw .= " ". $arrcon[$key]. " " . $key ." LIKE ?"; 
     734                } else { 
     735                    $strw .= " AND " . $key ." LIKE ?"; 
     736                } 
     737 
     738                $arrval[] = $val; 
     739            } 
     740        } 
     741 
     742        if(strlen($strw) > 0) { 
     743            $sqlse = "SELECT $col FROM $table WHERE $strw ".$this->option; 
     744        } else { 
     745            $sqlse = "SELECT $col FROM $table ".$this->option; 
     746        } 
     747        $ret = $this->conn->getAll($sqlse, $arrval); 
     748        return $ret; 
     749    } 
     750 
     751    function getall($sql, $arrval = array()) { 
     752        $ret = $this->conn->getAll($sql, $arrval); 
     753        return $ret; 
     754    } 
     755 
     756    function getsql($col, $table, $where) { 
     757        if($where != "") { 
     758            // 引数の$whereを優先して実行する。 
     759            $sqlse = "SELECT $col FROM $table WHERE $where " . $this->groupby . " " . $this->order . " " . $this->option; 
     760        } else { 
     761            if($this->where != "") { 
     762                    $sqlse = "SELECT $col FROM $table WHERE $this->where " . $this->groupby . " " . $this->order . " " . $this->option; 
     763                } else { 
     764                    $sqlse = "SELECT $col FROM $table " . $this->groupby . " " . $this->order . " " . $this->option; 
     765            } 
     766        } 
     767        return $sqlse; 
     768    } 
     769 
     770    function setoption($str) { 
     771        $this->option = $str; 
     772    } 
     773 
     774    function setlimitoffset($limit, $offset = 0, $return = false) { 
     775        if (is_numeric($limit) && is_numeric($offset)){ 
     776 
     777            $option = " LIMIT " . $limit; 
     778            $option.= " OFFSET " . $offset; 
     779 
     780            if($return){ 
     781                return $option; 
     782            }else{ 
     783                $this->option.= $option; 
     784            } 
     785        } 
     786    } 
     787 
     788    function setgroupby($str) { 
     789        $this->groupby = "GROUP BY " . $str; 
     790    } 
     791 
     792    function andwhere($str) { 
     793        if($this->where != "") { 
     794            $this->where .= " AND " . $str; 
     795        } else { 
     796            $this->where = $str; 
     797        } 
     798    } 
     799 
     800    function orwhere($str) { 
     801        if($this->where != "") { 
     802            $this->where .= " OR " . $str; 
     803        } else { 
     804            $this->where = $str; 
     805        } 
     806    } 
     807 
     808    function setwhere($str) { 
     809        $this->where = $str; 
     810    } 
     811 
     812    function setorder($str) { 
     813        $this->order = "ORDER BY " . $str; 
     814    } 
     815 
     816 
     817    function setlimit($limit){ 
     818        if ( is_numeric($limit)){ 
     819            $this->option = " LIMIT " .$limit; 
     820        } 
     821    } 
     822 
     823    function setoffset($offset) { 
     824        if ( is_numeric($offset)){ 
     825            $this->offset = " OFFSET " .$offset; 
     826        } 
     827    } 
     828 
     829 
     830    // INSERT文の生成・実行 
     831    // $table   :テーブル名 
     832    // $sqlval  :列名 => 値の格納されたハッシュ配列 
     833    function insert($table, $sqlval) { 
     834        $strcol = ''; 
     835        $strval = ''; 
     836        $find = false; 
     837 
     838        if(count($sqlval) <= 0 ) return false; 
     839 
     840        foreach ($sqlval as $key => $val) { 
     841            $strcol .= $key . ','; 
     842            if(eregi("^Now\(\)$", $val)) { 
     843                $strval .= 'Now(),'; 
     844            // 先頭に~があるとプレースホルダーしない。 
     845            } else if(ereg("^~", $val)) { 
     846                $strval .= ereg_replace("^~", "", $val); 
     847            } else { 
     848                $strval .= '?,'; 
     849                if($val != ""){ 
     850                    $arrval[] = $val; 
     851                } else { 
     852                    $arrval[] = NULL; 
     853                } 
     854            } 
     855            $find = true; 
     856        } 
     857        if(!$find) { 
     858            return false; 
     859        } 
     860        // 文末の","を削除 
     861        $strcol = ereg_replace(",$","",$strcol); 
     862        // 文末の","を削除 
     863        $strval = ereg_replace(",$","",$strval); 
     864        $sqlin = "INSERT INTO $table(" . $strcol. ") VALUES (" . $strval . ")"; 
     865 
     866        // INSERT文の実行 
     867        $ret = $this->conn->query($sqlin, $arrval); 
     868 
     869        return $ret; 
     870    } 
     871 
     872        // INSERT文の生成・実行 
     873    // $table   :テーブル名 
     874    // $sqlval  :列名 => 値の格納されたハッシュ配列 
     875    function fast_insert($table, $sqlval) { 
     876        $strcol = ''; 
     877        $strval = ''; 
     878        $find = false; 
     879 
     880        foreach ($sqlval as $key => $val) { 
     881                $strcol .= $key . ','; 
     882                if($val != ""){ 
     883                    $eval = pg_escape_string($val); 
     884                    $strval .= "'$eval',"; 
     885                } else { 
     886                    $strval .= "NULL,"; 
     887                } 
     888                $find = true; 
     889        } 
     890        if(!$find) { 
     891            return false; 
     892        } 
     893        // 文末の","を削除 
     894        $strcol = ereg_replace(",$","",$strcol); 
     895        // 文末の","を削除 
     896        $strval = ereg_replace(",$","",$strval); 
     897        $sqlin = "INSERT INTO $table(" . $strcol. ") VALUES (" . $strval . ")"; 
     898 
     899        // INSERT文の実行 
     900        $ret = $this->conn->query($sqlin); 
     901 
     902        return $ret; 
     903    } 
     904 
     905 
     906    // UPDATE文の生成・実行 
     907    // $table   :テーブル名 
     908    // $sqlval  :列名 => 値の格納されたハッシュ配列 
     909    // $where   :WHERE文字列 
     910    function update($table, $sqlval, $where = "", $arradd = "", $addcol = "") { 
     911        $strcol = ''; 
     912        $strval = ''; 
     913        $find = false; 
     914        foreach ($sqlval as $key => $val) { 
     915            if(eregi("^Now\(\)$", $val)) { 
     916                $strcol .= $key . '= Now(),'; 
     917            // 先頭に~があるとプレースホルダーしない。 
     918            } else if(ereg("^~", $val)) { 
     919                $strcol .= $key . "=" . ereg_replace("^~", "", $val) . ","; 
     920            } else { 
     921                $strcol .= $key . '= ?,'; 
     922                if($val != ""){ 
     923                    $arrval[] = $val; 
     924                } else { 
     925                    $arrval[] = NULL; 
     926                } 
     927            } 
     928            $find = true; 
     929        } 
     930        if(!$find) { 
     931            return false; 
     932        } 
     933 
     934        if($addcol != "") { 
     935            foreach($addcol as $key => $val) { 
     936                $strcol .= "$key = $val,"; 
     937            } 
     938        } 
     939 
     940        // 文末の","を削除 
     941        $strcol = ereg_replace(",$","",$strcol); 
     942        // 文末の","を削除 
     943        $strval = ereg_replace(",$","",$strval); 
     944 
     945        if($where != "") { 
     946            $sqlup = "UPDATE $table SET $strcol WHERE $where"; 
     947        } else { 
     948            $sqlup = "UPDATE $table SET $strcol"; 
     949        } 
     950 
     951        if(is_array($arradd)) { 
     952            // プレースホルダー用に配列を追加 
     953            foreach($arradd as $val) { 
     954                $arrval[] = $val; 
     955            } 
     956        } 
     957 
     958        // INSERT文の実行 
     959        $ret = $this->conn->query($sqlup, $arrval); 
     960        return $ret; 
     961    } 
     962 
     963    // MAX文の実行 
     964    function max($table, $col, $where = "", $arrval = array()) { 
     965        if(strlen($where) <= 0) { 
     966            $sqlse = "SELECT MAX($col) FROM $table"; 
     967        } else { 
     968            $sqlse = "SELECT MAX($col) FROM $table WHERE $where"; 
     969        } 
     970        // MAX文の実行 
     971        $ret = $this->conn->getOne($sqlse, $arrval); 
     972        return $ret; 
     973    } 
     974 
     975    // MIN文の実行 
     976    function min($table, $col, $where = "", $arrval = array()) { 
     977        if(strlen($where) <= 0) { 
     978            $sqlse = "SELECT MIN($col) FROM $table"; 
     979        } else { 
     980            $sqlse = "SELECT MIN($col) FROM $table WHERE $where"; 
     981        } 
     982        // MIN文の実行 
     983        $ret = $this->conn->getOne($sqlse, $arrval); 
     984        return $ret; 
     985    } 
     986 
     987    // 特定のカラムの値を取得 
     988    function get($table, $col, $where = "", $arrval = array()) { 
     989        if(strlen($where) <= 0) { 
     990            $sqlse = "SELECT $col FROM $table"; 
     991        } else { 
     992            $sqlse = "SELECT $col FROM $table WHERE $where"; 
     993        } 
     994        // SQL文の実行 
     995        $ret = $this->conn->getOne($sqlse, $arrval); 
     996        return $ret; 
     997    } 
     998 
     999    function getone($sql, $arrval = array()) { 
     1000        // SQL文の実行 
     1001        $ret = $this->conn->getOne($sql, $arrval); 
     1002        return $ret; 
     1003 
     1004    } 
     1005 
     1006    // 一行を取得 
     1007    function getrow($table, $col, $where = "", $arrval = array()) { 
     1008        if(strlen($where) <= 0) { 
     1009            $sqlse = "SELECT $col FROM $table"; 
     1010        } else { 
     1011            $sqlse = "SELECT $col FROM $table WHERE $where"; 
     1012        } 
     1013        // SQL文の実行 
     1014        $ret = $this->conn->getRow($sqlse, $arrval); 
     1015 
     1016        return $ret; 
     1017    } 
     1018 
     1019    // 1列取得 
     1020    function getCol($table, $col, $where = "", $arrval = array()) { 
     1021        if (strlen($where) <= 0) { 
     1022            $sqlse = "SELECT $col FROM $table"; 
     1023        } else { 
     1024            $sqlse = "SELECT $col FROM $table WHERE $where"; 
     1025        } 
     1026        // SQL文の実行 
     1027        return $this->conn->getCol($sqlse, $col, $arrval); 
     1028    } 
     1029 
     1030    // レコードの削除 
     1031    function delete($table, $where = "", $arrval = array()) { 
     1032        if(strlen($where) <= 0) { 
     1033            $sqlde = "DELETE FROM $table"; 
     1034        } else { 
     1035            $sqlde = "DELETE FROM $table WHERE $where"; 
     1036        } 
     1037        $ret = $this->conn->query($sqlde, $arrval); 
     1038        return $ret; 
     1039    } 
     1040 
     1041    function nextval($table, $colname) { 
     1042        $sql = ""; 
     1043        // postgresqlとmysqlとで処理を分ける 
     1044        if (DB_TYPE == "pgsql") { 
     1045            $seqtable = $table . "_" . $colname . "_seq"; 
     1046            $sql = "SELECT NEXTVAL('$seqtable')"; 
     1047        }else if (DB_TYPE == "mysql") { 
     1048            $sql = "SELECT last_insert_id();"; 
     1049        } 
     1050        $ret = $this->conn->getOne($sql); 
     1051 
     1052        return $ret; 
     1053    } 
     1054 
     1055    function currval($table, $colname) { 
     1056        $sql = ""; 
     1057        if (DB_TYPE == "pgsql") { 
     1058            $seqtable = $table . "_" . $colname . "_seq"; 
     1059            $sql = "SELECT CURRVAL('$seqtable')"; 
     1060        }else if (DB_TYPE == "mysql") { 
     1061            $sql = "SELECT last_insert_id();"; 
     1062        } 
     1063        $ret = $this->conn->getOne($sql); 
     1064 
     1065        return $ret; 
     1066    } 
     1067 
     1068    function setval($table, $colname, $data) { 
     1069        $sql = ""; 
     1070        if (DB_TYPE == "pgsql") { 
     1071            $seqtable = $table . "_" . $colname . "_seq"; 
     1072            $sql = "SELECT SETVAL('$seqtable', $data)"; 
     1073            $ret = $this->conn->getOne($sql); 
     1074        }else if (DB_TYPE == "mysql") { 
     1075            $sql = "ALTER TABLE $table AUTO_INCREMENT=$data"; 
     1076            $ret = $this->conn->query($sql); 
     1077        } 
     1078 
     1079        return $ret; 
     1080    } 
     1081 
     1082    function query($n ,$arr = "", $ignore_err = false){ 
     1083        $result = $this->conn->query($n, $arr, $ignore_err); 
     1084        return $result; 
     1085    } 
     1086 
     1087    // auto_incrementを取得する 
     1088    function get_auto_increment($table_name){ 
     1089        // ロックする 
     1090        $this->query("LOCK TABLES $table_name WRITE"); 
     1091 
     1092        // 次のIncrementを取得 
     1093        $arrRet = $this->getAll("SHOW TABLE STATUS LIKE ?", array($table_name)); 
     1094        $auto_inc_no = $arrRet[0]["Auto_increment"]; 
     1095 
     1096        // 値をカウントアップしておく 
     1097        $this->conn->query("ALTER TABLE $table_name AUTO_INCREMENT=?" , $auto_inc_no + 1); 
     1098 
     1099        // 解除する 
     1100        $this->query('UNLOCK TABLES'); 
     1101 
     1102        return $auto_inc_no; 
     1103    } 
     1104} 
     1105 
     1106 
     1107$objDbConn = ""; 
     1108 
     1109/** 
     1110 * コネクションを取得する. 
     1111 * 
     1112 * (EC-CUBE からの移植) 
     1113 */ 
     1114class SC_DbConn{ 
     1115 
     1116    var $conn; 
     1117    var $dump; 
     1118    var $result; 
     1119    var $includePath; 
     1120    var $error_mail_to; 
     1121    var $error_mail_title; 
     1122    var $dsn; 
     1123    var $err_disp = true; 
     1124    var $dbFactory; 
     1125 
     1126 
     1127    // コンストラクタ 
     1128    function SC_DbConn($dsn = "", $err_disp = true, $new = false){ 
     1129 
     1130        // Debugモード指定 
     1131        $options['debug'] = true; 
     1132        // 既に接続されていないか、新規接続要望の場合は接続する。 
     1133        if(!isset($objDbConn->connection) || $new) { 
     1134            if($dsn != "") { 
     1135                $objDbConn = DB::connect($dsn, $options); 
     1136                $this->dsn = $dsn; 
     1137            } else { 
     1138                if(defined('DEFAULT_DSN')) { 
     1139                    $objDbConn = DB::connect(DEFAULT_DSN, $options); 
     1140                    $this->dsn = DEFAULT_DSN; 
     1141                } else { 
     1142                    return; 
     1143                } 
     1144            } 
     1145        } 
     1146 
     1147        $this->conn = $objDbConn; 
     1148        $this->error_mail_to = DB_ERROR_MAIL_TO; 
     1149        $this->error_mail_title = DB_ERROR_MAIL_SUBJECT; 
     1150        $this->err_disp = $err_disp; 
     1151    } 
     1152 
     1153    // クエリの実行 
     1154    function query($n ,$arr = "", $ignore_err = false){ 
     1155 
     1156        if ( $arr ) { 
     1157            $result = $this->conn->query($n, $arr); 
     1158        } else { 
     1159            $result = $this->conn->query($n); 
     1160        } 
     1161 
     1162        if ($this->conn->isError($result) && !$ignore_err){ 
     1163            $this->send_err_mail ($result, $n); 
     1164        } 
     1165 
     1166        $this->result = $result; 
     1167        return $this->result; 
     1168    } 
     1169 
     1170    // 一件のみ取得 
     1171    function getOne($n, $arr = ""){ 
     1172 
     1173        if ( $arr ) { 
     1174            $result = $this->conn->getOne($n, $arr); 
     1175        } else { 
     1176            $result = $this->conn->getOne($n); 
     1177        } 
     1178        if ($this->conn->isError($result)){ 
     1179            $this->send_err_mail ($result ,$n); 
     1180        } 
     1181        $this->result = $result; 
     1182 
     1183        return $this->result; 
     1184    } 
     1185 
     1186    function getRow($n, $arr = ""){ 
     1187 
     1188        if ( $arr ) { 
     1189            $result = $this->conn->getRow($n, $arr); 
     1190        } else { 
     1191            $result = $this->conn->getRow($n); 
     1192        } 
     1193        if ($this->conn->isError($result)){ 
     1194            $this->send_err_mail ($result ,$n); 
     1195        } 
     1196        $this->result = $result; 
     1197        return $this->result; 
     1198    } 
     1199 
     1200    function getCol($n, $col, $arr = "") { 
     1201 
     1202        if ($arr) { 
     1203            $result = $this->conn->getCol($n, $col, $arr); 
     1204        } else { 
     1205            $result = $this->conn->getCol($n, $col); 
     1206        } 
     1207        if ($this->conn->isError($result)) { 
     1208            $this->send_err_mail($result, $n); 
     1209        } 
     1210        $this->result = $result; 
     1211        return $this->result; 
     1212    } 
     1213 
     1214    // SELECT文の実行結果を全て取得 
     1215    function getAll($n, $arr = ""){ 
     1216 
     1217 
     1218        if(PEAR::isError($this->conn)) { 
     1219            if(ADMIN_MODE){ 
     1220                SC_Utils_Ex::sfErrorHeader("DBへの接続に失敗しました。:" . $this->dsn); 
     1221            }else{ 
     1222                SC_Utils_Ex::sfErrorHeader("DBへの接続に失敗しました。:"); 
     1223            } 
     1224            return 0; 
     1225        } 
     1226 
     1227        if ( $arr ){ 
     1228            $result = $this->conn->getAll($n, $arr, DB_FETCHMODE_ASSOC); 
     1229        } else { 
     1230            $result = $this->conn->getAll($n, DB_FETCHMODE_ASSOC); 
     1231        } 
     1232 
     1233        if ($this->conn->isError($result)){ 
     1234            $this->send_err_mail ($result, $n); 
     1235        } 
     1236        $this->result = $result; 
     1237 
     1238        return $this->result; 
     1239    } 
     1240 
     1241    function autoExecute($table_name, $fields_values, $sql_where = null){ 
     1242 
     1243        if ( $sql_where ) { 
     1244            $result = $this->conn->autoExecute( $table_name, $fields_values, DB_AUTOQUERY_UPDATE, $sql_where); 
     1245        } else { 
     1246            $result = $this->conn->autoExecute( $table_name, $fields_values, DB_AUTOQUERY_INSERT); 
     1247        } 
     1248 
     1249        if ($this->conn->isError($result)){ 
     1250            $this->send_err_mail ($result, $n); 
     1251        } 
     1252        $this->result = $result; 
     1253        return $this->result; 
     1254    } 
     1255 
     1256 
     1257    function prepare($n){ 
     1258        global $sql; 
     1259        $sql = $n; 
     1260        $result = $this->conn->prepare($n); 
     1261        $this->result = $result; 
     1262        return $this->result; 
     1263    } 
     1264 
     1265    function execute($n, $obj){ 
     1266        global $sql; 
     1267        $sql = $n; 
     1268        $result = $this->conn->execute($n, $obj); 
     1269        $this->result = $result; 
     1270        return $this->result; 
     1271    } 
     1272 
     1273    function reset(){ 
     1274        $this->conn->disconnect(); 
     1275    } 
     1276 
     1277    function send_err_mail($result, $sql){ 
     1278        $url = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; 
     1279 
     1280        $errmsg = $url."\n\n"; 
     1281        $errmsg.= "SERVER_ADDR:" . $_SERVER['SERVER_ADDR'] . "\n"; 
     1282        $errmsg.= "REMOTE_ADDR:" . $_SERVER['REMOTE_ADDR'] . "\n"; 
     1283        $errmsg.= "USER_AGENT:" . $_SERVER['HTTP_USER_AGENT'] . "\n\n"; 
     1284        $errmsg.= $sql . "\n"; 
     1285        $errmsg.= $result->message . "\n\n"; 
     1286        $errmsg.= $result->userinfo . "\n\n"; 
     1287 
     1288        $arrRbacktrace = array_reverse($result->backtrace); 
     1289 
     1290        foreach($arrRbacktrace as $backtrace) { 
     1291            if($backtrace['class'] != "") { 
     1292                $func = $backtrace['class'] . "->" . $backtrace['function']; 
     1293            } else { 
     1294                $func = $backtrace['function']; 
     1295            } 
     1296 
     1297            $errmsg.= $backtrace['file'] . " " . $backtrace['line'] . ":" . $func . "\n"; 
     1298        } 
     1299 
     1300        print('<pre>'); 
     1301        //print_r(htmlspecialchars($errmsg, ENT_QUOTES)); 
     1302        print_r($errmsg); 
     1303        print('</pre>'); 
     1304        exit(); 
     1305    } 
     1306 
     1307} 
     1308 
     1309?> 
     1310 
     1311}}}