= テストデータ生成スクリプト =
EC-CUBE 2.0.x 用のテストデータ生成スクリプトです.
cli 版の PHP を使用し, このスクリプトを実行することにより, テスト用の商品データを自動生成します.
* 実行時間の計測に PHP5 のみサポートされている関数を使用しています. PHP4 を使用した場合は, 実行時間の計測ができません.
* Pear::DB に依存していますので, include_path に Pear::DB が必要です.
* 下記の PHPコードをコピーして, !CreateEcCubeData.php というファイル名で保存して下さい.
* 先頭の #!/usr/local/bin/php というパスを環境に合わせて編集して下さい.
* define の値を環境に合わせて編集して下さい.
== 下記も参照 ==
[http://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=1743&post_id=5987&order=0&viewmode=flat&pid=5964&forum=4#forumpost5987 テストデータ生成スクリプトについて ]
* '''thanx''' ramrun さん
== 実行例 ==
{{{
% ./CreateEcCubeData.php
}}}
== !CreateEcCubeData.php ==
{{{
#!php
#!/usr/local/bin/php -q
objQuery->begin();
// カテゴリ生成
$objData->createCategories();
// 規格生成
$objData->createClassData();
// 商品生成
$objData->createProducts();
// 商品と規格の関連づけ
$objData->relateClass();
// 商品とカテゴリの関連づけ
$objData->relateProductsCategories();
//$objData->objQuery->rollback();
$objData->objQuery->commit();
$end = microtime(true);
print("データの生成が完了しました!\n");
printf("所要時間 %f 秒\n", $end - $start);
// }}}
// {{{ classes
/**
* EC-CUBE のデータを生成する
*/
class CreateEcCubeData {
/** SC_Query インスタンス */
var $objQuery;
/** 大カテゴリID の配列 */
var $arrCategory1 = array();
/** 中カテゴリID の配列 */
var $arrCategory2 = array();
/** 小カテゴリID の配列 */
var $arrCategory3 = array();
/** 規格1 */
var $arrClassCategory_id1 = array();
/** 規格2 */
var $arrClassCategory_id2 = array();
/**
* コンストラクタ.
*/
function CreateEcCubeData() {
$this->objQuery = new SC_Query();
}
/**
* カテゴリを生成する.
*
* 以下のように, ツリー状のカテゴリを生成する
*
* 大カテゴリ -- 中カテゴリ -- 小カテゴリ
* | |- 小カテゴリ
* | |- 小カテゴリ
* |
* |- 中カテゴリ -- 小カテゴリ
* |- 小カテゴリ
* |- 小カテゴリ
* @return void
*/
function createCategories() {
print("カテゴリを生成しています...\n");
$count = 0;
// 全カテゴリ共通の値
$sqlval['creator_id'] = 2;
$sqlval['create_date'] = "now()";
$sqlval['update_date'] = "now()";
$sqlval['del_flg'] = (string) "0";
// 大カテゴリを生成
for ($i = 0; $i < TOP_CATEGORIES_VOLUME; $i++) {
$sqlval['category_name'] = sprintf("Category%d00", $i);
$sqlval['parent_category_id'] = (string) "0";
$sqlval['level'] = 1;
$sqlval['rank'] = $this->lfGetTotalCategoryrank() - $count;
$this->objQuery->insert("dtb_category", $sqlval);
$category_id1 = $this->objQuery->currval("dtb_category",
"category_id");
$this->arrCategory1[] = $category_id1;
$count++;
print(".");
// 中カテゴリを生成
for ($j = 0; $j < MIDDLE_CATEGORIES_VOLUME; $j++) {
$sqlval['category_name'] = sprintf("Category%d%d0", $i,
$j + MIDDLE_CATEGORIES_VOLUME);
$sqlval['parent_category_id'] = (string) $category_id1;
$sqlval['level'] = 2;
$sqlval['rank'] = $this->lfGetTotalCategoryrank() - $count;
$this->objQuery->insert("dtb_category", $sqlval);
$category_id2 = $this->objQuery->currval("dtb_category",
"category_id");
$this->arrCategory2[] = $category_id2;
$count++;
print(".");
// 小カテゴリを生成
for ($k = 0; $k < SMALL_CATEGORIES_VOLUME; $k++) {
$sqlval['category_name'] = sprintf("Category%d%d%d",
$i, $j,
$k + SMALL_CATEGORIES_VOLUME);
$sqlval['parent_category_id'] = (string) $category_id2;
$sqlval['level'] = 3;
$sqlval['rank'] = $this->lfGetTotalCategoryrank() - $count;
$this->objQuery->insert("dtb_category", $sqlval);
$category_id3 = $this->objQuery->currval("dtb_category",
"category_id");
$this->arrCategory3[] = $category_id3;
$count++;
print(".");
}
}
}
print("\n");
}
/**
* 規格を生成する.
*
* @return void
*/
function createClassData() {
// 規格データ生成
print("規格データを生成しています...\n");
$this->createClass("Size");
$this->createClass("Color");
print("\n");
// 規格分類データ生成
print("規格分類データを生成しています...\n");
// 規格1
for ($i = 0; $i < CLASSCATEGORY1_VOLUME; $i++) {
$this->createClassCategory($this->arrSize[$i],
$this->arrclass_id[0], "size");
}
// 規格2
for ($i = 0; $i < CLASSCATEGORY2_VOLUME; $i++) {
$this->createClassCategory($this->arrSize[$i],
$this->arrclass_id[1], "color");
}
print("\n");
}
/**
* 商品と規格の関連づけを行う.
*
* @return void
*/
function relateClass() {
print("商品と規格の関連づけを行います...\n");
foreach ($this->arrProduct_id as $product_id) {
$this->createProductsClass($product_id);
}
print("\n");
}
/**
* 商品を生成する.
*
* @return void
*/
function createProducts() {
print("商品を生成しています...\n");
for ($i = 0; $i < PRODUCTS_VOLUME; $i++) {
$sqlval['name'] = sprintf("商品%d", $i);
$sqlval['status'] = 1;
$sqlval['product_flag'] = "10010";
$sqlval['point_rate'] = 1;
$sqlval['comment3'] = "コメント";
$sqlval['main_list_comment'] = "コメント";
$sqlval['main_list_image'] = "08311201_44f65122ee5fe.jpg";
$sqlval['main_comment'] = "コメント";
$sqlval['main_image'] = "08311202_44f6515906a41.jpg";
$sqlval['main_large_image'] = "08311203_44f651959bcb5.jpg";
$sqlval['sub_comment1'] = "コメント";
$sqlval['del_flg'] = (string) "0";
$sqlval['creator_id'] = 2;
$sqlval['create_date'] = "now()";
$sqlval['update_date'] = "now()";
$sqlval['deliv_date_id'] = 2;
$this->objQuery->insert("dtb_products", $sqlval);
$this->arrProduct_id[] = $this->objQuery->currval("dtb_products",
"product_id");
print("*");
}
}
/**
* 規格を生成する.
*
* @param $class_name string 規格名
* @return void
*/
function createClass($class_name) {
$sqlval['name'] = $class_name;
$sqlval['status'] = null;
$sqlval['rank'] = "~(SELECT CASE
WHEN max(rank) + 1 IS NULL THEN 1
ELSE max(rank) + 1
END
FROM dtb_class
WHERE del_flg = 0),";
$sqlval['creator_id'] = 2;
$sqlval['update_date'] = "now()";
$sqlval['del_flg'] = (string) "0";
$sqlval['product_id'] = null;
$this->objQuery->insert("dtb_class", $sqlval);
// class_idを取得
$this->arrclass_id[] = $this->objQuery->currval("dtb_class", "class_id");
print("+");
}
/**
* 規格分類を生成する.
*
* @param $classcategory_name string 規格名
* @return void
*/
function createClassCategory($classcategory_name, $class_id, $class_name) {
$sqlval['name'] = $classcategory_name;
$sqlval['class_id'] = $class_id;
$sqlval['status'] = null;
$sqlval['rank'] = sprintf("~(SELECT CASE
WHEN max(rank) + 1 IS NULL THEN 1
ELSE max(rank) + 1
END
FROM dtb_classcategory
WHERE del_flg = 0
AND class_id = %d),", $class_id);
$sqlval['creator_id'] = 2;
$sqlval['create_date'] = "now()";
$sqlval['update_date'] = "now()";
$sqlval['del_flg'] = (string) "0";
$this->objQuery->insert("dtb_classcategory", $sqlval);
switch ($class_name) {
case "size":
$this->arrClassCategory_id1[] =
$this->objQuery->currval("dtb_classcategory",
"classcategory_id");
break;
case "color":
$this->arrClassCategory_id2[] =
$this->objQuery->currval("dtb_classcategory",
"classcategory_id");
break;
default:
}
print("+");
}
/**
* 商品規格を生成する.
*
* @param integer $product_id 商品ID
* @return void
*/
function createProductsClass($product_id) {
printf("商品ID %d の商品規格を生成しています...\n", $product_id);
$sqlval['product_id'] = $product_id;
$sqlval['stock_unlimited'] = 1;
$sqlval['price01'] = 1000;
$sqlval['price02'] = 2000;
$sqlval['creator_id'] = 2;
$sqlval['create_date'] = "now()";
$sqlval['update_date'] = "now()";
$count = 0;
foreach ($this->arrClassCategory_id1 as $classCategory_id1) {
$sqlval['classcategory_id1'] = $classCategory_id1;
foreach ($this->arrClassCategory_id2 as $classCategory_id2) {
$sqlval['classcategory_id2'] = $classCategory_id2;
$sqlval['product_code'] = sprintf("商品コード%d", $count);
$this->objQuery->insert("dtb_products_class", $sqlval);
$count++;
print("#");
}
}
print("\n");
}
/**
* 商品とカテゴリの関連づけを行う.
*
* @return void
*/
function relateProductsCategories() {
print("商品とカテゴリの関連づけを行います...\n");
$this->createProductsCategories($this->arrCategory1, "大カテゴリ");
$this->createProductsCategories($this->arrCategory2, "中カテゴリ");
$this->createProductsCategories($this->arrCategory3, "小カテゴリ");
}
/**
* 商品カテゴリを生成する.
*
* @param array $arrCategory_id カテゴリID の配列
* @return void
*/
function createProductsCategories($arrCategory_id, $category_name) {
$count = 0;
printf("%s の商品カテゴリを生成しています...\n", $category_name);
foreach ($arrCategory_id as $category_id) {
$sqlval['category_id'] = $category_id;
foreach($this->arrProduct_id as $product_id) {
$sqlval['product_id'] = $product_id;
$sqlval['rank'] = $count;
$this->objQuery->insert("dtb_product_categories", $sqlval);
$count++;
print("$");
}
}
print("\n");
}
/** 規格1 */
var $arrSize = array("m11(29cm)"
,"m10 1/2(28.5cm)"
,"m10(28cm)"
,"m9 1/2(27.5cm)"
,"m9(27cm)"
,"m8 1/2(26.5cm)"
,"m8(26cm)"
,"43"
,"42"
,"41"
,"43(27.0cm?27.5cm)"
,"42(26.5cm?27.0cm)"
,"37(ladies 23.5?24cm)"
,"42(約27.5cm)"
,"41(約26.5cm)"
,"W36"
,"W34"
,"W32"
,"43"
,"42"
,"41"
,"m11"
,"m10"
,"m9.5"
,"m9"
,"m8"
,"FREE"
,"XS"
,"S"
,"M"
,"L"
,"XL"
,"25-27"
,"27-29"
,"W28"
,"W29"
,"W30"
,"W31"
,"W32"
,"W33"
,"W34"
,"W35"
,"W36"
,"4"
,"6"
,"8"
,"10"
,"12"
,"10cm"
,"12cm"
,"14cm"
,"16cm"
,"18cm"
,"20cm"
,"22cm"
,"24cm"
,"26cm"
,"28cm"
,"30cm"
,"32cm"
,"34cm"
,"36cm"
,"38cm"
,"40cm"
,"10g"
,"20g"
,"30g"
,"40g"
,"50g"
,"60g"
,"70g"
,"80g"
,"90g"
,"100g"
,"110g"
,"120g"
,"130g"
,"140g"
,"150g"
,"160g"
,"170g"
,"180g"
,"190g"
,"200g"
,"8inch"
,"10inch"
,"12inch"
,"14inch"
,"16inch"
,"18inch"
,"20inch"
,"22inch"
,"24inch"
,"26inch"
,"28inch"
,"30inch"
,"32inch"
,"34inch"
,"36inch"
,"38inch"
);
/** 規格2 */
var $arrColor = array("white"
,"whitesmoke"
,"snow"
,"ghostwhite"
,"mintcream"
,"azure"
,"ivory"
,"floralwhite"
,"aliceblue"
,"lavenderblush"
,"seashell"
,"honeydew"
,"lightyellow"
,"oldlace"
,"cornsilk"
,"linen"
,"lemonchiffon"
,"lavender"
,"beige"
,"lightgoldenrodyellow"
,"mistyrose"
,"papayawhip"
,"antiquewhite"
,"lightcyan"
,"cyan"
,"aqua"
,"darkcyan"
,"teal"
,"darkslategray"
,"turquoise"
,"paleturquoise"
,"mediumturquoise"
,"aquamarine"
,"gainsboro"
,"lightgray"
,"silver"
,"darkgray"
,"gray"
,"dimgray"
,"black"
,"powderblue"
,"lightblue"
,"lightskyblue"
,"skyblue"
,"darkturquoise"
,"deepskyblue"
,"dodgerblue"
,"royalblue"
,"cornflowerblue"
,"cadetblue"
,"lightsteelblue"
,"steelblue"
,"lightslategray"
,"slategray"
,"blue"
,"mediumblue"
,"darkblue"
,"navy"
,"midnightblue"
,"lightsalmon"
,"darksalmon"
,"salmon"
,"tomato"
,"lightcoral"
,"coral"
,"crimson"
,"red"
,"mediumorchid"
,"mediumpurple"
,"mediumslateblue"
,"slateblue"
,"blueviolet"
,"darkviolet"
,"darkorchid"
,"darkslateblue"
,"darkorchid"
,"thistle"
,"plum"
,"violet"
,"magenta"
,"fuchsia"
,"darkmagenta"
,"purple"
,"palegreen"
,"lightgreen"
,"lime"
,"limegreen"
,"forestgreen"
,"green"
,"darkgreen"
,"greenyellow"
,"chartreuse"
,"lawngreen"
,"yellowgreen"
,"olivedrab"
,"darkolivegreen"
,"mediumaquamarine"
,"mediumspringgreen"
,"springgreen"
,"darkseagreen"
);
/**
* 総カテゴリー数を計算し、dtb_categoryに代入するrankに使う
*/
function lfGetTotalCategoryrank(){
$TotalCategoryrank = (TOP_CATEGORIES_VOLUME * MIDDLE_CATEGORIES_VOLUME * SMALL_CATEGORIES_VOLUME) + (MIDDLE_CATEGORIES_VOLUME * TOP_CATEGORIES_VOLUME) + TOP_CATEGORIES_VOLUME;
return $TotalCategoryrank;
}
}
/**
* クエリを生成して実行する.
*
* (EC-CUBE からの移植)
*/
class SC_Query {
var $option;
var $where;
var $conn;
var $groupby;
var $order;
// コンストラクタ
/*
$err_disp:エラー表示を行うか
$new:新規に接続を行うか
*/
function SC_Query($dsn = "", $err_disp = true, $new = false) {
$this->conn = new SC_DbConn($dsn, $err_disp, $new);
$this->where = "";
return $this->conn;
}
// エラー判定
function isError() {
if(PEAR::isError($this->conn->conn)) {
return true;
}
return false;
}
// COUNT文の実行
function count($table, $where = "", $arrval = array()) {
if(strlen($where) <= 0) {
$sqlse = "SELECT COUNT(*) FROM $table";
} else {
$sqlse = "SELECT COUNT(*) FROM $table WHERE $where";
}
// カウント文の実行
$ret = $this->conn->getOne($sqlse, $arrval);
return $ret;
}
function select($col, $table, $where = "", $arrval = array()){
$sqlse = $this->getsql($col, $table, $where);
// DBに依存した SQL へ変換
$dbFactory = SC_DB_DBFactory::getInstance();
$sqlse = $dbFactory->sfChangeMySQL($sqlse);
$ret = $this->conn->getAll($sqlse, $arrval);
return $ret;
}
function getLastQuery($disp = true) {
$sql = $this->conn->conn->last_query;
if($disp) {
print($sql.";
\n");
}
return $sql;
}
function commit() {
$this->conn->query("COMMIT");
}
function begin() {
$this->conn->query("BEGIN");
}
function rollback() {
$this->conn->query("ROLLBACK");
}
function exec($str, $arrval = array()) {
$this->conn->query($str, $arrval);
}
function autoselect($col, $table, $arrwhere = array(), $arrcon = array()) {
$strw = "";
$find = false;
foreach ($arrwhere as $key => $val) {
if(strlen($val) > 0) {
if(strlen($strw) <= 0) {
$strw .= $key ." LIKE ?";
} else if(strlen($arrcon[$key]) > 0) {
$strw .= " ". $arrcon[$key]. " " . $key ." LIKE ?";
} else {
$strw .= " AND " . $key ." LIKE ?";
}
$arrval[] = $val;
}
}
if(strlen($strw) > 0) {
$sqlse = "SELECT $col FROM $table WHERE $strw ".$this->option;
} else {
$sqlse = "SELECT $col FROM $table ".$this->option;
}
$ret = $this->conn->getAll($sqlse, $arrval);
return $ret;
}
function getall($sql, $arrval = array()) {
$ret = $this->conn->getAll($sql, $arrval);
return $ret;
}
function getsql($col, $table, $where) {
if($where != "") {
// 引数の$whereを優先して実行する。
$sqlse = "SELECT $col FROM $table WHERE $where " . $this->groupby . " " . $this->order . " " . $this->option;
} else {
if($this->where != "") {
$sqlse = "SELECT $col FROM $table WHERE $this->where " . $this->groupby . " " . $this->order . " " . $this->option;
} else {
$sqlse = "SELECT $col FROM $table " . $this->groupby . " " . $this->order . " " . $this->option;
}
}
return $sqlse;
}
function setoption($str) {
$this->option = $str;
}
function setlimitoffset($limit, $offset = 0, $return = false) {
if (is_numeric($limit) && is_numeric($offset)){
$option = " LIMIT " . $limit;
$option.= " OFFSET " . $offset;
if($return){
return $option;
}else{
$this->option.= $option;
}
}
}
function setgroupby($str) {
$this->groupby = "GROUP BY " . $str;
}
function andwhere($str) {
if($this->where != "") {
$this->where .= " AND " . $str;
} else {
$this->where = $str;
}
}
function orwhere($str) {
if($this->where != "") {
$this->where .= " OR " . $str;
} else {
$this->where = $str;
}
}
function setwhere($str) {
$this->where = $str;
}
function setorder($str) {
$this->order = "ORDER BY " . $str;
}
function setlimit($limit){
if ( is_numeric($limit)){
$this->option = " LIMIT " .$limit;
}
}
function setoffset($offset) {
if ( is_numeric($offset)){
$this->offset = " OFFSET " .$offset;
}
}
// INSERT文の生成・実行
// $table :テーブル名
// $sqlval :列名 => 値の格納されたハッシュ配列
function insert($table, $sqlval) {
$strcol = '';
$strval = '';
$find = false;
if(count($sqlval) <= 0 ) return false;
foreach ($sqlval as $key => $val) {
$strcol .= $key . ',';
if(eregi("^Now\(\)$", $val)) {
$strval .= 'Now(),';
// 先頭に~があるとプレースホルダーしない。
} else if(ereg("^~", $val)) {
$strval .= ereg_replace("^~", "", $val);
} else {
$strval .= '?,';
if($val != ""){
$arrval[] = $val;
} else {
$arrval[] = NULL;
}
}
$find = true;
}
if(!$find) {
return false;
}
// 文末の","を削除
$strcol = ereg_replace(",$","",$strcol);
// 文末の","を削除
$strval = ereg_replace(",$","",$strval);
$sqlin = "INSERT INTO $table(" . $strcol. ") VALUES (" . $strval . ")";
// INSERT文の実行
$ret = $this->conn->query($sqlin, $arrval);
return $ret;
}
// INSERT文の生成・実行
// $table :テーブル名
// $sqlval :列名 => 値の格納されたハッシュ配列
function fast_insert($table, $sqlval) {
$strcol = '';
$strval = '';
$find = false;
foreach ($sqlval as $key => $val) {
$strcol .= $key . ',';
if($val != ""){
$eval = pg_escape_string($val);
$strval .= "'$eval',";
} else {
$strval .= "NULL,";
}
$find = true;
}
if(!$find) {
return false;
}
// 文末の","を削除
$strcol = ereg_replace(",$","",$strcol);
// 文末の","を削除
$strval = ereg_replace(",$","",$strval);
$sqlin = "INSERT INTO $table(" . $strcol. ") VALUES (" . $strval . ")";
// INSERT文の実行
$ret = $this->conn->query($sqlin);
return $ret;
}
// UPDATE文の生成・実行
// $table :テーブル名
// $sqlval :列名 => 値の格納されたハッシュ配列
// $where :WHERE文字列
function update($table, $sqlval, $where = "", $arradd = "", $addcol = "") {
$strcol = '';
$strval = '';
$find = false;
foreach ($sqlval as $key => $val) {
if(eregi("^Now\(\)$", $val)) {
$strcol .= $key . '= Now(),';
// 先頭に~があるとプレースホルダーしない。
} else if(ereg("^~", $val)) {
$strcol .= $key . "=" . ereg_replace("^~", "", $val) . ",";
} else {
$strcol .= $key . '= ?,';
if($val != ""){
$arrval[] = $val;
} else {
$arrval[] = NULL;
}
}
$find = true;
}
if(!$find) {
return false;
}
if($addcol != "") {
foreach($addcol as $key => $val) {
$strcol .= "$key = $val,";
}
}
// 文末の","を削除
$strcol = ereg_replace(",$","",$strcol);
// 文末の","を削除
$strval = ereg_replace(",$","",$strval);
if($where != "") {
$sqlup = "UPDATE $table SET $strcol WHERE $where";
} else {
$sqlup = "UPDATE $table SET $strcol";
}
if(is_array($arradd)) {
// プレースホルダー用に配列を追加
foreach($arradd as $val) {
$arrval[] = $val;
}
}
// INSERT文の実行
$ret = $this->conn->query($sqlup, $arrval);
return $ret;
}
// MAX文の実行
function max($table, $col, $where = "", $arrval = array()) {
if(strlen($where) <= 0) {
$sqlse = "SELECT MAX($col) FROM $table";
} else {
$sqlse = "SELECT MAX($col) FROM $table WHERE $where";
}
// MAX文の実行
$ret = $this->conn->getOne($sqlse, $arrval);
return $ret;
}
// MIN文の実行
function min($table, $col, $where = "", $arrval = array()) {
if(strlen($where) <= 0) {
$sqlse = "SELECT MIN($col) FROM $table";
} else {
$sqlse = "SELECT MIN($col) FROM $table WHERE $where";
}
// MIN文の実行
$ret = $this->conn->getOne($sqlse, $arrval);
return $ret;
}
// 特定のカラムの値を取得
function get($table, $col, $where = "", $arrval = array()) {
if(strlen($where) <= 0) {
$sqlse = "SELECT $col FROM $table";
} else {
$sqlse = "SELECT $col FROM $table WHERE $where";
}
// SQL文の実行
$ret = $this->conn->getOne($sqlse, $arrval);
return $ret;
}
function getone($sql, $arrval = array()) {
// SQL文の実行
$ret = $this->conn->getOne($sql, $arrval);
return $ret;
}
// 一行を取得
function getrow($table, $col, $where = "", $arrval = array()) {
if(strlen($where) <= 0) {
$sqlse = "SELECT $col FROM $table";
} else {
$sqlse = "SELECT $col FROM $table WHERE $where";
}
// SQL文の実行
$ret = $this->conn->getRow($sqlse, $arrval);
return $ret;
}
// 1列取得
function getCol($table, $col, $where = "", $arrval = array()) {
if (strlen($where) <= 0) {
$sqlse = "SELECT $col FROM $table";
} else {
$sqlse = "SELECT $col FROM $table WHERE $where";
}
// SQL文の実行
return $this->conn->getCol($sqlse, $col, $arrval);
}
// レコードの削除
function delete($table, $where = "", $arrval = array()) {
if(strlen($where) <= 0) {
$sqlde = "DELETE FROM $table";
} else {
$sqlde = "DELETE FROM $table WHERE $where";
}
$ret = $this->conn->query($sqlde, $arrval);
return $ret;
}
function nextval($table, $colname) {
$sql = "";
// postgresqlとmysqlとで処理を分ける
if (DB_TYPE == "pgsql") {
$seqtable = $table . "_" . $colname . "_seq";
$sql = "SELECT NEXTVAL('$seqtable')";
}else if (DB_TYPE == "mysql") {
$sql = "SELECT last_insert_id();";
}
$ret = $this->conn->getOne($sql);
return $ret;
}
function currval($table, $colname) {
$sql = "";
if (DB_TYPE == "pgsql") {
$seqtable = $table . "_" . $colname . "_seq";
$sql = "SELECT CURRVAL('$seqtable')";
}else if (DB_TYPE == "mysql") {
$sql = "SELECT last_insert_id();";
}
$ret = $this->conn->getOne($sql);
return $ret;
}
function setval($table, $colname, $data) {
$sql = "";
if (DB_TYPE == "pgsql") {
$seqtable = $table . "_" . $colname . "_seq";
$sql = "SELECT SETVAL('$seqtable', $data)";
$ret = $this->conn->getOne($sql);
}else if (DB_TYPE == "mysql") {
$sql = "ALTER TABLE $table AUTO_INCREMENT=$data";
$ret = $this->conn->query($sql);
}
return $ret;
}
function query($n ,$arr = "", $ignore_err = false){
$result = $this->conn->query($n, $arr, $ignore_err);
return $result;
}
// auto_incrementを取得する
function get_auto_increment($table_name){
// ロックする
$this->query("LOCK TABLES $table_name WRITE");
// 次のIncrementを取得
$arrRet = $this->getAll("SHOW TABLE STATUS LIKE ?", array($table_name));
$auto_inc_no = $arrRet[0]["Auto_increment"];
// 値をカウントアップしておく
$this->conn->query("ALTER TABLE $table_name AUTO_INCREMENT=?" , $auto_inc_no + 1);
// 解除する
$this->query('UNLOCK TABLES');
return $auto_inc_no;
}
}
$objDbConn = "";
/**
* コネクションを取得する.
*
* (EC-CUBE からの移植)
*/
class SC_DbConn{
var $conn;
var $dump;
var $result;
var $includePath;
var $error_mail_to;
var $error_mail_title;
var $dsn;
var $err_disp = true;
var $dbFactory;
// コンストラクタ
function SC_DbConn($dsn = "", $err_disp = true, $new = false){
// Debugモード指定
$options['debug'] = true;
// 既に接続されていないか、新規接続要望の場合は接続する。
if(!isset($objDbConn->connection) || $new) {
if($dsn != "") {
$objDbConn = DB::connect($dsn, $options);
$this->dsn = $dsn;
} else {
if(defined('DEFAULT_DSN')) {
$objDbConn = DB::connect(DEFAULT_DSN, $options);
$this->dsn = DEFAULT_DSN;
} else {
return;
}
}
}
$this->conn = $objDbConn;
$this->error_mail_to = DB_ERROR_MAIL_TO;
$this->error_mail_title = DB_ERROR_MAIL_SUBJECT;
$this->err_disp = $err_disp;
}
// クエリの実行
function query($n ,$arr = "", $ignore_err = false){
if ( $arr ) {
$result = $this->conn->query($n, $arr);
} else {
$result = $this->conn->query($n);
}
if ($this->conn->isError($result) && !$ignore_err){
$this->send_err_mail ($result, $n);
}
$this->result = $result;
return $this->result;
}
// 一件のみ取得
function getOne($n, $arr = ""){
if ( $arr ) {
$result = $this->conn->getOne($n, $arr);
} else {
$result = $this->conn->getOne($n);
}
if ($this->conn->isError($result)){
$this->send_err_mail ($result ,$n);
}
$this->result = $result;
return $this->result;
}
function getRow($n, $arr = ""){
if ( $arr ) {
$result = $this->conn->getRow($n, $arr);
} else {
$result = $this->conn->getRow($n);
}
if ($this->conn->isError($result)){
$this->send_err_mail ($result ,$n);
}
$this->result = $result;
return $this->result;
}
function getCol($n, $col, $arr = "") {
if ($arr) {
$result = $this->conn->getCol($n, $col, $arr);
} else {
$result = $this->conn->getCol($n, $col);
}
if ($this->conn->isError($result)) {
$this->send_err_mail($result, $n);
}
$this->result = $result;
return $this->result;
}
// SELECT文の実行結果を全て取得
function getAll($n, $arr = ""){
if(PEAR::isError($this->conn)) {
if(ADMIN_MODE){
SC_Utils_Ex::sfErrorHeader("DBへの接続に失敗しました。:" . $this->dsn);
}else{
SC_Utils_Ex::sfErrorHeader("DBへの接続に失敗しました。:");
}
return 0;
}
if ( $arr ){
$result = $this->conn->getAll($n, $arr, DB_FETCHMODE_ASSOC);
} else {
$result = $this->conn->getAll($n, DB_FETCHMODE_ASSOC);
}
if ($this->conn->isError($result)){
$this->send_err_mail ($result, $n);
}
$this->result = $result;
return $this->result;
}
function autoExecute($table_name, $fields_values, $sql_where = null){
if ( $sql_where ) {
$result = $this->conn->autoExecute( $table_name, $fields_values, DB_AUTOQUERY_UPDATE, $sql_where);
} else {
$result = $this->conn->autoExecute( $table_name, $fields_values, DB_AUTOQUERY_INSERT);
}
if ($this->conn->isError($result)){
$this->send_err_mail ($result, $n);
}
$this->result = $result;
return $this->result;
}
function prepare($n){
global $sql;
$sql = $n;
$result = $this->conn->prepare($n);
$this->result = $result;
return $this->result;
}
function execute($n, $obj){
global $sql;
$sql = $n;
$result = $this->conn->execute($n, $obj);
$this->result = $result;
return $this->result;
}
function reset(){
$this->conn->disconnect();
}
function send_err_mail($result, $sql){
$url = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$errmsg = $url."\n\n";
$errmsg.= "SERVER_ADDR:" . $_SERVER['SERVER_ADDR'] . "\n";
$errmsg.= "REMOTE_ADDR:" . $_SERVER['REMOTE_ADDR'] . "\n";
$errmsg.= "USER_AGENT:" . $_SERVER['HTTP_USER_AGENT'] . "\n\n";
$errmsg.= $sql . "\n";
$errmsg.= $result->message . "\n\n";
$errmsg.= $result->userinfo . "\n\n";
$arrRbacktrace = array_reverse($result->backtrace);
foreach($arrRbacktrace as $backtrace) {
if($backtrace['class'] != "") {
$func = $backtrace['class'] . "->" . $backtrace['function'];
} else {
$func = $backtrace['function'];
}
$errmsg.= $backtrace['file'] . " " . $backtrace['line'] . ":" . $func . "\n";
}
print('
'); //print_r(htmlspecialchars($errmsg, ENT_QUOTES)); print_r($errmsg); print(''); exit(); } } ?> }}}