Index: branches/version-2_5-dev/data/class/pages/products/LC_Page_Products_List.php
===================================================================
--- branches/version-2_5-dev/data/class/pages/products/LC_Page_Products_List.php	(revision 18772)
+++ branches/version-2_5-dev/data/class/pages/products/LC_Page_Products_List.php	(revision 18773)
@@ -359,6 +359,5 @@
         
         // 対象商品IDの抽出
-        $arrProduct_id = $objQuery->getCol('vw_products_allclass AS allcls', 'DISTINCT product_id', $where, $arrval);
-        
+        $arrProduct_id = array_unique($objQuery->getCol('vw_products_allclass AS allcls', 'product_id', $where, $arrval));
         // 行数の取得
         $linemax = count($arrProduct_id);
Index: branches/version-2_5-dev/data/class/SC_Query.php
===================================================================
--- branches/version-2_5-dev/data/class/SC_Query.php	(revision 18701)
+++ branches/version-2_5-dev/data/class/SC_Query.php	(revision 18773)
@@ -22,6 +22,10 @@
  */
 
+require_once(realpath(dirname(__FILE__)) . "/../module/MDB2.php");
+
 /**
  * SQLの構築・実行を行う
+ *
+ * TODO エラーハンドリング, ロギング方法を見直す
  *
  * @author LOCKON CO.,LTD.
@@ -44,5 +48,23 @@
      */
     function SC_Query($dsn = "", $err_disp = true, $new = false) {
-        $this->conn = new SC_DBconn($dsn, $err_disp, $new);
+
+        if ($dsn == "") {
+            $dsn = DEFAULT_DSN;
+        }
+
+        // Debugモード指定
+        $options['debug'] = PEAR_DB_DEBUG;
+        // 持続的接続オプション
+        $options['persistent'] = PEAR_DB_PERSISTENT;
+
+        if ($new) {
+            $this->conn = MDB2::connect($dsn, $options);
+        } else {
+            $this->conn = MDB2::singleton($dsn, $options);
+        }
+
+        $this->conn->setCharset(CHAR_CODE);
+        $this->conn->setFetchMode(MDB2_FETCHMODE_ASSOC);
+        $this->dbFactory = SC_DB_DBFactory_Ex::getInstance();
         $this->where = "";
     }
@@ -54,5 +76,5 @@
      */
     function isError() {
-        if(PEAR::isError($this->conn->conn)) {
+        if(PEAR::isError($this->conn)) {
             return true;
         }
@@ -74,7 +96,6 @@
             $sqlse = "SELECT COUNT(*) FROM $table WHERE $where";
         }
-        // カウント文の実行
-        $ret = $this->conn->getOne($sqlse, $arrval);
-        return $ret;
+        $sqlse = $this->dbFactory->sfChangeMySQL($sqlse);
+        return $this->getOne($sqlse, $arrval);
     }
 
@@ -89,13 +110,11 @@
      * @return array|null
      */
-    function select($col, $table, $where = "", $arrval = array(), $fetchmode = DB_FETCHMODE_ASSOC) {
+    function select($col, $table, $where = "", $arrval = array(), $fetchmode = MDB2_FETCHMODE_ASSOC) {
         $sqlse = $this->getSql($col, $table, $where);
-        $ret = $this->conn->getAll($sqlse, $arrval, $fetchmode);
-        return $ret;
+        return $this->getAll($sqlse, $arrval, $fetchmode);
     }
 
     /**
      * 直前に実行されたSQL文を取得する.
-     * SC_DBconn::getLastQuery() を利用.
      *
      * @param boolean $disp trueの場合、画面出力を行う.
@@ -103,21 +122,26 @@
      */
     function getLastQuery($disp = true) {
-        return $this->conn->getLastQuery($disp);
+        $sql = $this->conn->last_query;
+        if($disp) {
+            print($sql.";<br />\n");
+        }
+        return $sql;
     }
 
     function commit() {
-        $this->conn->query("COMMIT");
+        $this->conn->commit();
     }
 
     function begin() {
-        $this->conn->query("BEGIN");
+        $this->conn->beginTransaction();
     }
 
     function rollback() {
-        $this->conn->query("ROLLBACK");
+        $this->conn->rollback();
     }
 
     function exec($str, $arrval = array()) {
-        $this->conn->query($str, $arrval);
+        // FIXME MDB2::exec() の実装であるべき
+        $this->query($str, $arrval);
     }
 
@@ -130,7 +154,16 @@
      * @return array データを含む2次元配列。失敗した場合に 0 または DB_Error オブジェクトを返します。
      */
-    function getAll($sql, $arrval = array(), $fetchmode = DB_FETCHMODE_ASSOC) {
-        $ret = $this->conn->getAll($sql, $arrval, $fetchmode);
-        return $ret;
+    function getAll($sql, $arrval = array(), $fetchmode = MDB2_FETCHMODE_ASSOC) {
+
+        $sql = $this->dbFactory->sfChangeMySQL($sql);
+
+        $sth = $this->conn->prepare($sql);
+        $affected = $sth->execute($arrval);
+
+        if (PEAR::isError($affected)) {
+            trigger_error($affected->getMessage(), E_USER_ERROR);
+        }
+
+        return $affected->fetchAll($fetchmode);
     }
 
@@ -154,4 +187,5 @@
     }
 
+    // TODO MDB2::setLimit() を使用する
     function setLimitOffset($limit, $offset = 0, $return = false) {
         if (is_numeric($limit) && is_numeric($offset)){
@@ -250,5 +284,5 @@
         $sqlin = "INSERT INTO $table(" . $strcol. ") VALUES (" . $strval . ")";
         // INSERT文の実行
-        $ret = $this->conn->query($sqlin, $arrval);
+        $ret = $this->query($sqlin, $arrval);
 
         return $ret;
@@ -306,5 +340,5 @@
 
         // UPDATE文の実行
-        return $this->conn->query($sqlup, $arrVal);
+        return $this->query($sqlup, $arrVal);
     }
 
@@ -330,7 +364,15 @@
 
     function getOne($sql, $arrval = array()) {
-        // SQL文の実行
-        $ret = $this->conn->getOne($sql, $arrval);
-        return $ret;
+
+        $sql = $this->dbFactory->sfChangeMySQL($sql);
+
+        $sth = $this->conn->prepare($sql);
+        $affected = $sth->execute($arrval);
+
+        if (PEAR::isError($affected)) {
+            trigger_error($affected->getMessage(), E_USER_ERROR);
+        }
+
+        return $affected->fetchOne();
     }
 
@@ -345,15 +387,32 @@
      * @return array array('カラム名' => '値', ...)の連想配列
      */
-    function getRow($table, $col, $where = "", $arrVal = array(), $fetchmode = DB_FETCHMODE_ASSOC) {
-        $sqlse = $this->getSql($col, $table, $where);
-        // SQL文の実行
-        return $this->conn->getRow($sqlse, $arrVal ,$fetchmode);
+    function getRow($table, $col, $where = "", $arrVal = array(), $fetchmode = MDB2_FETCHMODE_ASSOC) {
+
+        $sql = $this->getSql($col, $table, $where);
+        $sql = $this->dbFactory->sfChangeMySQL($sql);
+
+        $sth = $this->conn->prepare($sql);
+        $affected = $sth->execute($arrVal);
+
+        if (PEAR::isError($affected)) {
+            trigger_error($affected->getMessage(), E_USER_ERROR);
+        }
+
+        return $affected->fetchRow($fetchmode);
     }
 
     // 1列取得
     function getCol($table, $col, $where = "", $arrval = array()) {
-        $sqlse = $this->getSql($col, $table, $where);
-        // SQL文の実行
-        return $this->conn->getCol($sqlse, 0, $arrval);
+        $sql = $this->getSql($col, $table, $where);
+        $sql = $this->dbFactory->sfChangeMySQL($sql);
+
+        $sth = $this->conn->prepare($sql);
+        $affected = $sth->execute($arrval);
+
+        if (PEAR::isError($affected)) {
+            trigger_error($affected->getMessage(), E_USER_ERROR);
+        }
+
+        return $affected->fetchCol($col);
     }
 
@@ -372,5 +431,5 @@
             $sqlde = "DELETE FROM $table WHERE $where";
         }
-        $ret = $this->conn->query($sqlde, $arrval);
+        $ret = $this->query($sqlde, $arrval);
         return $ret;
     }
@@ -385,5 +444,5 @@
             $sql = "SELECT last_insert_id();";
         }
-        $ret = $this->conn->getOne($sql);
+        $ret = $this->getOne($sql);
 
         return $ret;
@@ -398,5 +457,5 @@
             $sql = "SELECT last_insert_id();";
         }
-        $ret = $this->conn->getOne($sql);
+        $ret = $this->getOne($sql);
 
         return $ret;
@@ -408,15 +467,25 @@
             $seqtable = $table . "_" . $colname . "_seq";
             $sql = "SELECT SETVAL('$seqtable', $data)";
-            $ret = $this->conn->getOne($sql);
+            $ret = $this->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);
+            $ret = $this->query($sql);
+        }
+
+        return $ret;
+    }
+
+    // XXX 更新系には exec() を使用するべき
+    function query($n ,$arr = array(), $ignore_err = false){
+
+        $n = $this->dbFactory->sfChangeMySQL($n);
+
+        $sth = $this->conn->prepare($n);
+        $result = $sth->execute($arr);
+
+        if (PEAR::isError($result)) {
+            trigger_error($result->getMessage(), E_USER_ERROR);
+        }
+
         return $result;
     }
@@ -437,5 +506,5 @@
 
         // 値をカウントアップしておく
-        $this->conn->query("ALTER TABLE $table_name AUTO_INCREMENT=?" , $auto_inc_no + 1);
+        $this->query("ALTER TABLE $table_name AUTO_INCREMENT=?" , $auto_inc_no + 1);
 
         // 解除する
Index: branches/version-2_5-dev/data/class/SC_DbConn.php
===================================================================
--- branches/version-2_5-dev/data/class/SC_DbConn.php	(revision 18763)
+++ 	(revision )
@@ -1,275 +1,0 @@
-<?php
-/*
- * This file is part of EC-CUBE
- *
- * Copyright(c) 2000-2010 LOCKON CO.,LTD. All Rights Reserved.
- *
- * http://www.lockon.co.jp/
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- */
-
-$current_dir = realpath(dirname(__FILE__));
-require_once($current_dir . "/../module/MDB2.php");
-
-$g_arr_objDbConn = array();
-
-class SC_DbConn {
-
-    var $conn;
-    var $result;
-    var $includePath;
-    var $dsn;
-    var $err_disp = true;
-    var $dbFactory;
-
-
-    // コンストラクタ
-    function SC_DbConn($dsn = "", $err_disp = true, $new = false){
-        global $g_arr_objDbConn;
-
-        // Debugモード指定
-        $options['debug'] = PEAR_DB_DEBUG;
-        // 持続的接続オプション
-        $options['persistent'] = PEAR_DB_PERSISTENT;
-
-        if (strlen($dsn) >= 1) {
-            $this->dsn = $dsn;
-        } elseif (defined('DEFAULT_DSN')) {
-            $this->dsn = DEFAULT_DSN;
-        } else {
-            // XXX 以前の仕様を継承しているが、意図が良く分からない。(2010/03/03 Seasoft 塚田)
-            return;
-        }
-
-        // 既に接続されていないか、新規接続要望の場合は接続する。
-        if (!isset($g_arr_objDbConn[$this->dsn]) || !isset($g_arr_objDbConn[$this->dsn]->connection)) {
-            $new = true;
-        }
-
-        if ($new) {
-            // TODO singleton の方が良いかも
-            $this->conn = MDB2::connect($this->dsn, $options);
-            $g_arr_objDbConn[$this->dsn] = $this->conn;
-
-            // TODO MDB2::setCharset() を使った方が良い?
-            if (DB_TYPE == 'mysql') {
-                $g_arr_objDbConn[$this->dsn]->query('SET NAMES utf8'); // FIXME mysql_set_charset を使える環境では、その方が良さそう (2010/03/03 Seasoft 塚田)
-                $g_arr_objDbConn[$this->dsn]->query("SET SESSION sql_mode = 'ANSI'");
-            }
-        } else {
-            $this->conn = $g_arr_objDbConn[$this->dsn];
-        }
-
-        $this->conn->setFetchMode(MDB2_FETCHMODE_ASSOC);
-        $this->err_disp = $err_disp;
-        $this->dbFactory = SC_DB_DBFactory_Ex::getInstance();
-    }
-
-    // クエリの実行
-    function query($n ,$arr = array(), $ignore_err = false){
-        // mysqlの場合にはビュー表を変換する
-        if (DB_TYPE == "mysql") $n = $this->dbFactory->sfChangeMySQL($n);
-
-        $sth = $this->conn->prepare($n);
-        if ( $arr ) {
-            $result = $sth->execute($arr);
-        } else {
-            $result = $sth->execute();
-        }
-
-        if ($this->conn->isError($result) && !$ignore_err){
-            $this->send_err_mail($result, $n);
-        }
-
-        $this->result = $result;
-        return $this->result;
-    }
-
-    // 一件のみ取得
-    function getOne($n, $arr = array()){
-
-        // mysqlの場合にはビュー表を変換する
-        if (DB_TYPE == "mysql") $n = $this->dbFactory->sfChangeMySQL($n);
-
-        $sth = $this->conn->prepare($n);
-        if ( $arr ) {
-            $affected = $sth->execute($arr);
-        } else {
-            $affected = $sth->execute();
-        }
-
-        if ($this->conn->isError($affected)){
-            $this->send_err_mail($affected ,$n);
-        }
-        $this->result = $affected->fetchOne();
-        return $this->result;
-    }
-    
-    /**
-     * クエリを実行し、最初の行を返す
-     *
-     * @param string $sql SQL クエリ
-     * @param array $arrVal プリペアドステートメントの実行時に使用される配列。配列の要素数は、クエリ内のプレースホルダの数と同じでなければなりません。 
-     * @param integer $fetchmode 使用するフェッチモード。デフォルトは DB_FETCHMODE_ASSOC。
-     * @return array データを含む1次元配列。失敗した場合に DB_Error オブジェクトを返します。
-     */
-    function getRow($sql, $arrVal = array(), $fetchmode = MDB2_FETCHMODE_ASSOC) {
-        
-        // mysqlの場合にはビュー表を変換する
-        if (DB_TYPE == "mysql") $sql = $this->dbFactory->sfChangeMySQL($sql);
-
-        $sth = $this->conn->prepare($sql);
-        if ($arrVal) {
-            $affected = $sth->execute($arrVal);
-        } else {
-            $affected = $sth->execute();
-        }
-        if ($this->conn->isError($affected)) {
-            $this->send_err_mail($affected, $sql);
-        }
-        $this->result = $affected->fetchRow($fetchmode);
-        
-        return $this->result;
-    }
-
-    function getCol($n, $col, $arr = array()) {
-
-        // mysqlの場合にはビュー表を変換する
-        if (DB_TYPE == "mysql") $n = $this->dbFactory->sfChangeMySQL($n);
-
-        $sth = $this->conn->prepare($n);
-        if ($arr) {
-            $affected = $sth->execute($arr);
-        } else {
-            $affected = $sth->execute();
-        }
-        if ($this->conn->isError($affected)) {
-            $this->send_err_mail($affected, $n);
-        }
-        $this->result = $affected->fetchCol($col);
-        return $this->result;
-    }
-
-    /**
-     * クエリを実行し、全ての行を返す
-     *
-     * @param string $sql SQL クエリ
-     * @param array $arrVal プリペアドステートメントの実行時に使用される配列。配列の要素数は、クエリ内のプレースホルダの数と同じでなければなりません。 
-     * @param integer $fetchmode 使用するフェッチモード。デフォルトは DB_FETCHMODE_ASSOC。
-     * @return array データを含む2次元配列。失敗した場合に 0 または DB_Error オブジェクトを返します。
-     */
-    function getAll($sql, $arrVal = array(), $fetchmode = MDB2_FETCHMODE_ASSOC) {
-
-        // mysqlの場合にはビュー表を変換する
-        if (DB_TYPE == "mysql") $sql = $this->dbFactory->sfChangeMySQL($sql);
-
-        // XXX このエラー処理はここで行なうべきなのか疑問。また、戻り値も疑問(なお、変更時はドキュメントも変更を)。
-        if (PEAR::isError($this->conn)) {
-            if (ADMIN_MODE) {
-                SC_Utils_Ex::sfErrorHeader("DBへの接続に失敗しました。:" . $this->dsn);
-            } else {
-                SC_Utils_Ex::sfErrorHeader("DBへの接続に失敗しました。:");
-            }
-            return 0;
-        }
-
-        $sth = $this->conn->prepare($sql);
-
-        if ($arrVal) { // FIXME 判定が曖昧
-            $affected = $sth->execute($arrVal);
-        } else {
-            $affected = $sth->execute();
-        }
-
-        if ($this->conn->isError($affected)) {
-            $this->send_err_mail($affected, $sql);
-        }
-        $this->result = $affected->fetchAll($fetchmode);
-
-        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($pearResult, $sql){
-
-        $errmsg = $sql . "\n\n";
-
-        // PEAR エラーを伴う場合
-        if (!is_null($pearResult)) {
-            $errmsg .= $pearResult->message . "\n\n";
-            $errmsg .= $pearResult->userinfo . "\n\n";
-            $errmsg .= SC_Utils_Ex::sfBacktraceToString($pearResult->backtrace);
-        }
-        // (上に該当せず)バックトレースを生成できる環境(一般的には PHP 4 >= 4.3.0, PHP 5)の場合
-        else if (function_exists("debug_backtrace")) {
-            $errmsg .= SC_Utils_Ex::sfBacktraceToString(array_slice(debug_backtrace(), 2));
-        }
-
-        GC_Utils_Ex::gfPrintLog($errmsg);
-        trigger_error($errmsg, E_USER_ERROR);
-        exit();
-    }
-
-    /**
-     * 直前に実行されたSQL文を取得する.
-     *
-     * @param boolean $disp trueの場合、画面出力を行う.
-     * @return string SQL文
-     */
-    function getLastQuery($disp = true) {
-        $sql = $this->conn->last_query;
-        if($disp) {
-            print($sql.";<br />\n");
-        }
-        return $sql;
-    }
-}
-?>
Index: branches/version-2_5-dev/data/require_classes.php
===================================================================
--- branches/version-2_5-dev/data/require_classes.php	(revision 18743)
+++ branches/version-2_5-dev/data/require_classes.php	(revision 18773)
@@ -27,5 +27,4 @@
 require_once(CLASS_EX_PATH . "db_extends/SC_DB_DBFactory_Ex.php");
 require_once(CLASS_PATH . "SC_View.php");
-require_once(CLASS_PATH . "SC_DbConn.php");
 require_once(CLASS_PATH . "SC_Session.php");
 require_once(CLASS_PATH . "SC_Query.php");
Index: branches/version-2_5-dev/data/include/module.inc
===================================================================
--- branches/version-2_5-dev/data/include/module.inc	(revision 17672)
+++ branches/version-2_5-dev/data/include/module.inc	(revision 18773)
@@ -29,5 +29,4 @@
 
 // {{{ requires
-require_once CLASS_PATH . 'SC_DbConn.php';
 require_once CLASS_PATH . 'SC_Query.php';
 require_once CLASS_EX_PATH . 'db_extends/SC_DB_DBFactory_Ex.php';
Index: branches/version-2_5-dev/test/class/SC_Query_Test.php
===================================================================
--- branches/version-2_5-dev/test/class/SC_Query_Test.php	(revision 18769)
+++ branches/version-2_5-dev/test/class/SC_Query_Test.php	(revision 18773)
@@ -132,5 +132,5 @@
 
         $this->expected = array(1, 2);
-        $this->actual = $this->objQuery->getCol("test_table", "column1, column2",  "id < ?",  array(3));
+        $this->actual = $this->objQuery->getCol("test_table", "column1",  "id < ?",  array(3));
 
         $this->verify();
