Index: branches/version-2_5-dev/data/class/SC_Query.php
===================================================================
--- branches/version-2_5-dev/data/class/SC_Query.php	(revision 19805)
+++ branches/version-2_5-dev/data/class/SC_Query.php	(revision 20037)
@@ -791,6 +791,8 @@
      * @param string $name インデックス名
      * @param array $definition フィールド名など　通常のフィールド指定時は、$definition=array('fields' => array('フィールド名' => array()));
+     *               MySQLのtext型フィールドを指定する場合は $definition['length'] = 'text_field(NNN)' が必要
      */
     function createIndex($table, $name, $definition) {
+        $definition = $this->dbFactory->sfGetCreateIndexDefinition($table, $name, $definition);
         $objManager =& $this->conn->loadModule('Manager');
         return $objManager->createIndex($table, $name, $definition);
@@ -807,5 +809,16 @@
         return $objManager->dropIndex($table, $name);
     }
-    
+
+    /**
+     * テーブルの詳細情報を取得する。
+     *
+     * @param string $table テーブル名
+     * @return array テーブル情報の配列
+     */
+    function getTableInfo($table) {
+        $objManager =& $this->conn->loadModule('Reverse');
+        return $objManager->tableInfo($table, NULL);
+    }
+
     /**
      * 値を適切にクォートする.
Index: branches/version-2_5-dev/data/class/db/SC_DB_DBFactory.php
===================================================================
--- branches/version-2_5-dev/data/class/db/SC_DB_DBFactory.php	(revision 19805)
+++ branches/version-2_5-dev/data/class/db/SC_DB_DBFactory.php	(revision 20037)
@@ -156,4 +156,16 @@
      */
     function findTableNames($expression = "") { return array(); }
+
+    /**
+     * インデックス作成の追加定義を取得する
+     *
+     * 引数に部分一致するテーブル名を配列で返す.
+     *
+     * @param string $table 対象テーブル名
+     * @param string $name 対象カラム名
+     * @return array インデックス設定情報配列
+     */
+    function sfGetCreateIndexDefinition($table, $name, $definition) { return $definition; }
+
 }
 ?>
Index: branches/version-2_5-dev/data/class/db/dbfactory/SC_DB_DBFactory_MYSQL.php
===================================================================
--- branches/version-2_5-dev/data/class/db/dbfactory/SC_DB_DBFactory_MYSQL.php	(revision 20024)
+++ branches/version-2_5-dev/data/class/db/dbfactory/SC_DB_DBFactory_MYSQL.php	(revision 20037)
@@ -434,4 +434,28 @@
 
     }
+    
+    /**
+     * インデックス作成の追加定義を取得する
+     *
+     * 引数に部分一致するテーブル名を配列で返す.
+     *
+     * @param string $table 対象テーブル名
+     * @param string $name 対象カラム名
+     * @return array インデックス設定情報配列
+     */
+    function sfGetCreateIndexDefinition($table, $name, $definition) {
+        $objQuery =& SC_Query::getSingletonInstance();
+        $arrTblInfo = $objQuery->getTableInfo($table);
+        foreach($arrTblInfo as $fieldInfo) {
+            if(array_key_exists($fieldInfo['name'], $definition['fields'])) {
+                if($fieldInfo['nativetype'] == 'text') {
+                    // TODO: text型フィールドの場合に255文字以内決めうちでインデックス列のサイズとして
+                    //       指定して良いか確認は必要。
+                    $definition['fields'][$fieldInfo['name']]['length'] = '255';
+                }
+            }
+        }
+        return $definition;
+    }
 }
 ?>
Index: branches/version-2_5-dev/data/class/pages/admin/system/LC_Page_Admin_System_Editdb.php
===================================================================
--- branches/version-2_5-dev/data/class/pages/admin/system/LC_Page_Admin_System_Editdb.php	(revision 19805)
+++ branches/version-2_5-dev/data/class/pages/admin/system/LC_Page_Admin_System_Editdb.php	(revision 20037)
@@ -23,8 +23,8 @@
 
 // {{{ requires
-require_once(CLASS_REALDIR . "pages/LC_Page.php");
+require_once CLASS_REALDIR . "pages/admin/LC_Page_Admin.php";
 
 /**
- * システム情報 のページクラス.
+ * 高度なデータベース管理 のページクラス.
  *
  * @package Page
@@ -32,5 +32,5 @@
  * @version $Id: LC_Page_Admin_System_Editdb.php 18701 2010-06-14 08:30:18Z nanasess $
  */
-class LC_Page_Admin_System_Editdb extends LC_Page {
+class LC_Page_Admin_System_Editdb extends LC_Page_Admin {
 
     // }}}
@@ -44,4 +44,5 @@
     function init() {
         parent::init();
+        
         $this->tpl_mainpage = 'system/editdb.tpl';
         $this->tpl_subnavi  = 'system/subnavi.tpl';
@@ -58,11 +59,10 @@
     function initForm() {
         $objForm = new SC_FormParam();
-        $objForm->addParam('mode', 'mode', INT_LEN, '', array('ALPHA_CHECK', 'MAX_LENGTH_CHECK'));
-        $objForm->addParam('table_name', 'テーブル名');
-        $objForm->addParam('column_name', 'カラム名');
-        $objForm->addParam('indexflag', 'インデックス');
-	$objForm->addParam('indexflag_new', 'インデックス（変更後）');
-	
-	$objForm->setParam($_POST);
+        $objForm->addParam('モード', 'mode', INT_LEN, 'n', array('ALPHA_CHECK', 'MAX_LENGTH_CHECK'));
+        $objForm->addParam('テーブル名', 'table_name');
+        $objForm->addParam('カラム名', 'column_name');
+        $objForm->addParam('インデックス', 'indexflag');
+        $objForm->addParam('インデックス（変更後）', 'indexflag_new');
+        $objForm->setParam($_POST);
         $this->objForm = $objForm;
     }
@@ -74,58 +74,29 @@
      */
     function process() {
+        $this->action();
+        $this->sendResponse();
+    }
 
+    /**
+     * Page のアクション.
+     *
+     * @return void
+     */
+    function action() {
         SC_Utils_Ex::sfIsSuccess(new SC_Session);
-        $objView = new SC_AdminView();
-	$objSiteInfo = new SC_SiteInfo();
-        $objQuery = new SC_Query();
-        $objDb = new SC_Helper_DB_Ex();
-        $objProduct = new SC_Product();
 
-	//インデックスの値を取得
-	$this->arrForm = $this->lfGetIndexList();
+        //フォームの値を取得
+        $this->initForm();
 
-	//フォームの値を取得
-        $this->initForm();
-	
         switch($this->objForm->getValue('mode')) {
-	//確認画面へ
-	case 'confirm' :
-	    //POSTの値と配列の値を比較
-	    // TODO: $_POSTを使わないように修正する。
-            $arrIndexFlag  = $_POST['indexflag'];
-            $arrIndexFlagNewIndex  = $_POST['indexflag_new'];
-
-            $arrIndexFlagNew = array();
-            for($i = 0; $i < count($arrIndexFlag); $i++) {
-                if(array_search($i, $arrIndexFlagNewIndex) !== false) {
-                    $arrIndexFlagNew[] = true;
-                } else {
-                    $arrIndexFlagNew[] = false;
-		}
+        case 'confirm' :
+            $this->lfDoChange();
+            break;
+        default:
+            break;
 	    }
 
-            $objQuery = new SC_Query();
-	    foreach($arrIndexFlag as $key => $val){
-		if($val != $arrIndexFlagNew[$key]) {
-                    //値が異なっていた場合、インデックスのアップデートをかける
-                    $index_name = $_POST["table_name"][$key] . "_" . $_POST["column_name"][$key] . "_key";
-                    if($arrIndexFlagNew[$key] == false) {
-                        $objQuery->dropIndex($_POST["table_name"][$key], $index_name);
-                    } else {
-                        $objQuery->createIndex($_POST["table_name"][$key], $index_name, array('fields' => array($_POST["column_name"][$key] => array())));
-                    }
-
-                    // フォームに引継ぐ
-                    $this->arrForm[$key]["indexflag"] = true;
-		}
-	    }
-	    
-	    $this->tpl_onload = "window.alert('インデックスの変更が完了しました。');";
-        default:
-        break;
-        }
-
-        $objView->assignobj($this);
-        $objView->display(MAIN_FRAME);
+        //インデックスの現在値を取得
+        $this->arrForm = $this->lfGetIndexList();
     }
 
@@ -139,4 +110,61 @@
     }
     
+    function lfGetTargetData() {
+        $objQuery = new SC_Query();
+        $arrIndexFlag = $this->objForm->getValue('indexflag');
+        $arrIndexFlagNew = $this->objForm->getValue('indexflag_new');
+        $arrTableName = $this->objForm->getValue('table_name');
+        $arrColumnName =$this->objForm->getValue('column_name');
+        $arrTarget = array();
+        // 変更されている対象を走査
+        for($i = 1; $i <= count($arrIndexFlag); $i++) {
+            //入力値チェック
+            $param = array('indexflag' => $arrIndexFlag[$i],
+                            'indexflag_new' => $arrIndexFlagNew[$i],
+                            'table_name' => $arrTableName[$i],
+                            'column_name' => $arrColumnName[$i]);
+            $objErr = new SC_CheckError($param);
+            $objErr->doFunc(array("インデックス(" . $i . ")", 'indexflag', INT_LEN), array("NUM_CHECK"));
+            $objErr->doFunc(array("インデックス変更後(" . $i . ")", 'indexflag_new', INT_LEN), array("NUM_CHECK"));
+            $objErr->doFunc(array("インデックス変更後(" . $i . ")", 'indexflag_new', INT_LEN), array("NUM_CHECK"));
+            $objErr->doFunc(array("テーブル名(" . $i . ")", 'table_name', STEXT_LEN), array("GRAPH_CHECK", "EXIST_CHECK", "MAX_LENGTH_CHECK"));
+            $objErr->doFunc(array("カラム名(" . $i . ")", 'column_name', STEXT_LEN), array("GRAPH_CHECK", "EXIST_CHECK", "MAX_LENGTH_CHECK"));
+            $arrErr = $objErr->arrErr;
+            if(count($arrErr) != 0) {
+                // 通常の送信ではエラーにならないはずです。
+                $this->tpl_onload = "window.alert('不正なデータがあったため処理を中断しました。');";
+                return;
+            }
+            if($param['indexflag'] != $param['indexflag_new']) {
+                // 入力値がデータにある対象テーブルかのチェック
+                if($objQuery->count('dtb_index_list', 'table_name = ? and column_name = ?', array($param['table_name'], $param['column_name']))) {
+                    $arrTarget[] = $param;
+                }
+            }
+        }
+        return $arrTarget;
+    }
+
+    function lfDoChange() {
+        $objQuery = new SC_Query();
+        $arrTarget = $this->lfGetTargetData();
+        if(count($arrTarget) == 0) {
+            $this->tpl_onload = "window.alert('変更対象となるデータはありませんでした。');";
+            return;
+        }
+
+        // 変更対象の設定変更
+        foreach($arrTarget as $item) {
+            $index_name = $item['table_name'] . '_' . $item['column_name'] . "_key";
+            $arrField = array( 'fields' => array($item['column_name'] => array()));
+            if($item['indexflag_new'] == '1') {
+                $objQuery->createIndex($item['table_name'], $index_name, $arrField);
+            }else{
+                $objQuery->dropIndex($item['table_name'], $index_name);
+            }
+        }
+        $this->tpl_onload = "window.alert('インデックスの変更が完了しました。');";
+    }
+
     /**
      * インデックス設定を行う一覧を返す関数
@@ -158,13 +186,12 @@
                 $arrIndexes = $objQuery->listTableIndexes($table);
             }
- 
             // インデックスが設定されているかを取得
-            if(array_search($table . "_" . $arrIndex["column_name"] . "_key", $arrIndexes) === false) {
-                $arrIndexList[$key]["indexflag"] = false;
+            $idx_name = $table . "_" . $arrIndex["column_name"] . "_key";
+            if(array_search($idx_name, $arrIndexes) === false) {
+                $arrIndexList[$key]["indexflag"] = '';
             } else {
-                $arrIndexList[$key]["indexflag"] = true;
+                $arrIndexList[$key]["indexflag"] = '1';
             }
         }
-    
         return $arrIndexList;
     }
