[Svn-src-all:1426] [version-2_5-dev 20318] #476 (CSV出力項目設定(高度な設定)で、一部テーブルの項目一覧が表示されない) に伴う改修

AMUAMU admin @ mail.ec-cube.net
2011年 2月 22日 (火) 10:47:25 JST


Subversion committed to /home/svn/open 20318
http://svn.ec-cube.net/open_trac/changeset/20318
┌────────────────────────────┐
│更新者 :  AMUAMU                                       │
│更新日時:  2011-02-22 10:47:25 +0900 (火, 22  2月 2011)│
└────────────────────────────┘

Log:
--------------------------------------------------------
#476 (CSV出力項目設定(高度な設定)で、一部テーブルの項目一覧が表示されない) に伴う改修
#657 (CSVダウンロードの改善) の改修
#938 (CSV出力 高度な設定 SQL登録できない) の不具合修正
#939 (CSV出力 高度な設定 出力操作で「sfGetCSVData()に移行してね。」と表示) の不具合修正
#971 (リファクタリング [管理画面]コンテンツ管理(CSV出力項目設定)) の改修

Changed:                      [U:修正,A:追加,D:削除]
--------------------------------------------------------
U   branches/version-2_5-dev/data/Smarty/templates/admin/contents/csv.tpl
U   branches/version-2_5-dev/data/Smarty/templates/admin/contents/csv_sql.tpl
U   branches/version-2_5-dev/data/Smarty/templates/admin/contents/csv_sql_view.tpl
U   branches/version-2_5-dev/data/class/helper/SC_Helper_CSV.php
U   branches/version-2_5-dev/data/class/pages/admin/contents/LC_Page_Admin_Contents_CSV.php
U   branches/version-2_5-dev/data/class/pages/admin/contents/LC_Page_Admin_Contents_CsvSql.php

変更: branches/version-2_5-dev/data/Smarty/templates/admin/contents/csv.tpl
===================================================================
--- branches/version-2_5-dev/data/Smarty/templates/admin/contents/csv.tpl	2011-02-22 01:44:08 UTC (rev 20317)
+++ branches/version-2_5-dev/data/Smarty/templates/admin/contents/csv.tpl	2011-02-22 01:47:25 UTC (rev 20318)
@@ -43,13 +43,25 @@
     // FIXME 選択・非選択のボタンと比べて、位置ズレしている
     $('.ms2side__div .SelSort').hide();
 });
+
+function lfFormModeDefautSetSubmit(form, mode) {
+	if(!window.confirm('初期設定で登録しても宜しいですか')){
+		return;
+	}
+	return fnSetFormSubmit(form, 'mode', mode);
+}
 //-->
 </script>
 
 <form name="form1" id="form1" method="post" action="?">
 <input type="hidden" name="mode" value="confirm" />
-<input type="hidden" name="tpl_subno_csv" value="<!--{$tpl_subno_csv}-->" />
+<input type="hidden" name="<!--{$smarty.const.TRANSACTION_ID_NAME}-->" value="<!--{$transactionid}-->" />
+<input type="hidden" name="tpl_subno_csv" value="<!--{$tpl_subno_csv|h}-->" />
 <div id="admin-contents" class="contents-main">
+    <!--{if $tpl_is_update}-->
+    <span class="attention">※ 正常に更新されました。</span>
+    <!--{/if}-->
+    <span class="attention"><!--{$arrErr.tpl_subno_csv}--></span>
     <div class="ms2side__area">
         <span class="attention"><!--{$arrErr.output_list}--></span>
         <select multiple name="output_list[]" style="<!--{$arrErr.output_list|sfGetErrorColor}-->;" id="output_list" size="20">
@@ -60,6 +72,7 @@
     <div class="btn-area">
       <ul>
         <li><a class="btn-action" href="javascript:;" onclick="fnFormModeSubmit('form1', 'confirm', '', ''); return false;"><span class="btn-next">この内容で登録する</span></a></li>
+		<li><a class="btn-action" href="javascript:;" onclick="lfFormModeDefautSetSubmit('form1', 'defaultset', '', ''); return false;"><span class="btn-next">初期設定に戻して登録</span></a></li>
       </ul>
     </div>
 

変更: branches/version-2_5-dev/data/Smarty/templates/admin/contents/csv_sql.tpl
===================================================================
--- branches/version-2_5-dev/data/Smarty/templates/admin/contents/csv_sql.tpl	2011-02-22 01:44:08 UTC (rev 20317)
+++ branches/version-2_5-dev/data/Smarty/templates/admin/contents/csv_sql.tpl	2011-02-22 01:47:25 UTC (rev 20318)
@@ -41,18 +41,18 @@
 
 <form name="form1" id="form1" method="post" action="?">
 <input type="hidden" name="mode" value="confirm" />
-<input type="hidden" name="sql_id" value="<!--{$sql_id}-->" />
+<input type="hidden" name="sql_id" value="<!--{$arrForm.sql_id|h}-->" />
 <input type="hidden" name="csv_output_id" value="" />
-<input type="hidden" name="selectTable" value="" />
+<input type="hidden" name="select_table" value="" />
 <div id="admin-contents" class="contents-main">
   <h2>SQL一覧</h2>
 
   <!--{if $arrSqlList}-->
   <table id="contents-csv-sqllist" class="list center">
     <!--{foreach key=key item=item from=$arrSqlList}-->
-    <tr style="background-color:<!--{if $item.sql_id == $sql_id}--><!--{$smarty.const.SELECT_RGB}--><!--{else}-->#ffffff<!--{/if}-->;">
+    <tr style="background-color:<!--{if $item.sql_id == $arrForm.sql_id}--><!--{$smarty.const.SELECT_RGB}--><!--{else}-->#ffffff<!--{/if}-->;">
       <td>
-        <a href="?sql_id=<!--{$item.sql_id}-->" ><!--{$item.sql_name}--></a>
+        <a href="?sql_id=<!--{$item.sql_id}-->" ><!--{$item.sql_name|h}--></a>
       </td>
       <td>
         <div class="btn">
@@ -76,16 +76,16 @@
       <th>名称<span class="attention"> *</span></th>
       <td>
         <span class="attention"><!--{$arrErr.sql_name}--></span>
-        <input type="text" name="sql_name" value="<!--{$arrSqlData.sql_name|h}-->" maxlength="<!--{$smarty.const.STEXT_LEN}-->" style="<!--{if $arrErr.name != ""}-->background-color: <!--{$smarty.const.ERR_COLOR}-->;<!--{/if}-->" size="60" class="box60" />
+        <input type="text" name="sql_name" value="<!--{$arrForm.sql_name|h}-->" maxlength="<!--{$smarty.const.STEXT_LEN}-->" style="<!--{if $arrErr.name != ""}-->background-color: <!--{$smarty.const.ERR_COLOR}-->;<!--{/if}-->" size="60" class="box60" />
         <span class="attention"> (上限<!--{$smarty.const.STEXT_LEN}-->文字)</span>
       </td>
     </tr>
     <tr>
-      <th align="center">SQL文<span class="attention"> *</span><br /> (SELECTは記述しないでください。)</td>
+      <th align="center">SQL文<span class="attention"> *</span><br /> (最初のSELECTは記述しないでください。)</td>
       <td align="left">
         <span class="attention"><!--{$arrErr.csv_sql}--></span>
         <div>
-          <textarea name="csv_sql" cols=75 rows=30 align="left" wrap=off style="<!--{if $arrErr.csv_sql != ""}-->background-color: <!--{$smarty.const.ERR_COLOR}-->;<!--{/if}-->"><!--{$arrSqlData.csv_sql}--></textarea>
+          <textarea name="csv_sql" cols=50 rows=20 align="left" wrap=off style="<!--{if $arrErr.csv_sql != ""}-->background-color: <!--{$smarty.const.ERR_COLOR}-->;<!--{/if}-->"><!--{$arrForm.csv_sql|h}--></textarea>
         </div>
       </td>
     </tr>
@@ -96,7 +96,7 @@
   </div>
   <div class="btn-area">
     <ul>
-      <li><a class="btn-action" href="javascript:;" name="subm" onclick="mode.value='confirm'; fnTargetSelf(); return false;"><span class="btn-next">この内容で登録する</span></a></li>
+      <li><a class="btn-action" href="javascript:;" name="subm" onclick="fnFormModeSubmit('form1', 'confirm', '', '')"><span class="btn-next">この内容で登録する</span></a></li>
     </ul>
   </div>
 
@@ -104,8 +104,8 @@
 
   <div id="contents-csv-sqltbl">
     <h3>テーブル一覧</h3>
-    <select name="arrTableList[]" size="20" style="width:325px; height:300px;" onChange="mode.value=''; selectTable.value=this.value; submit();" onDblClick="csv_sql.value = csv_sql.value +' , ' + this.value;">
-      <!--{html_options options=$arrTableList selected=$selectTable}-->
+    <select name="arrTableList[]" size="20" style="width:325px; height:300px;" onChange="mode.value=''; select_table.value=this.value; submit();" onDblClick="csv_sql.value = csv_sql.value +' , ' + this.value;">
+      <!--{html_options options=$arrTableList selected=$arrForm.select_table}-->
     </select>
   </div>
   <div id="contents-csv-sqlcol">

変更: branches/version-2_5-dev/data/Smarty/templates/admin/contents/csv_sql_view.tpl
===================================================================
--- branches/version-2_5-dev/data/Smarty/templates/admin/contents/csv_sql_view.tpl	2011-02-22 01:44:08 UTC (rev 20317)
+++ branches/version-2_5-dev/data/Smarty/templates/admin/contents/csv_sql_view.tpl	2011-02-22 01:47:25 UTC (rev 20318)
@@ -26,14 +26,19 @@
 <table class="form">
   <tr>
     <th>SQL文</th>
-    <td><!--{$sql|h|nl2br}--></td>
+    <td>SELECT <!--{$arrForm.csv_sql|h|nl2br}--></td>
   </tr>
   <tr>
     <th>エラー内容</th>
     <td>
+      <!--{if $arrErr}-->
+         <!--{foreach key=key item=item from=$arrErr key=key}-->
+            <!--{$item}-->
+         <!--{/foreach}-->
+      <!--{/if}-->
       <!--{if $sqlerr != ""}-->
         <!--{$sqlerr|h|nl2br}-->
-      <!--{else}-->
+      <!--{elseif !$arrErr}-->
         エラーはありません
       <!--{/if}-->
     </td>

変更: branches/version-2_5-dev/data/class/helper/SC_Helper_CSV.php
===================================================================
--- branches/version-2_5-dev/data/class/helper/SC_Helper_CSV.php	2011-02-22 01:44:08 UTC (rev 20317)
+++ branches/version-2_5-dev/data/class/helper/SC_Helper_CSV.php	2011-02-22 01:47:25 UTC (rev 20318)
@@ -231,17 +231,36 @@
             
         }
         // 固有処理ここまで
+        return $this->sfDownloadCsvFromSql($sql, $arrVal, $this->arrSubnavi[$csv_id], $arrOutput['disp_name'], $is_download);
+    }
 
+    /**
+     * SQL文からクエリ実行し CSVファイルを送信する
+     *
+     * @param integer $sql SQL文
+     * @param array $arrVal プリペアドステートメントの実行時に使用される配列。配列の要素数は、クエリ内のプレースホルダの数と同じでなければなりません。 
+     * @param string $file_head ファイル名の頭に付ける文字列
+     * @param array $arrHeader ヘッダ出力列配列
+     * @param boolean $is_download true:ダウンロード用出力までさせる false:CSVの内容を返す(旧方式、メモリを食います。)
+     * @return mixed $is_download = true時 成功失敗フラグ(boolean) 、$is_downalod = false時 string
+     */
+    function sfDownloadCsvFromSql($sql, $arrVal = array(), $file_head = 'csv', $arrHeader = array(), $is_download = false) {
+        $objQuery =& SC_Query::getSingletonInstance();
+
+        // 実行時間を制限しない
+        @set_time_limit(0);
         // ヘッダ構築
-        $header = $this->sfArrayToCSV($arrOutput['disp_name']);
-        $header = mb_convert_encoding($header, 'SJIS-Win');
-        $header .= "\r\n";
+        if(is_array($arrHeader)) {
+            $header = $this->sfArrayToCSV($arrHeader);
+            $header = mb_convert_encoding($header, 'SJIS-Win');
+            $header .= "\r\n";
+        }
 
         //テンポラリファイル作成
         // TODO: パフォーマンス向上には、ストリームを使うようにすると良い
-        //  環境要件がバージョン5.1以上になったら使うように変えても良いかと
+        //  環境要件がPHPバージョン5.1以上になったら使うように変えても良いかと
         //  fopen('php://temp/maxmemory:'. (5*1024*1024), 'r+');
-        $tmp_filename = tempnam(CSV_TEMP_REALDIR, $this->arrSubnavi[$csv_id] . '_csv');
+        $tmp_filename = tempnam(CSV_TEMP_REALDIR, $file_head . '_csv');
         $this->fpOutput = fopen($tmp_filename, "w+");
         fwrite($this->fpOutput, $header);
         $objQuery->doCallbackAll(array(&$this, 'cbOutputCSV'), $sql, $arrVal);
@@ -250,17 +269,18 @@
 
         if($is_download) {
             // CSVを送信する。
-            $this->lfDownloadCSVFile($tmp_filename,$this->arrSubnavi[$csv_id] . "_");
+            $this->lfDownloadCSVFile($tmp_filename, $file_head . "_");
             $res = true;
         }else{
             $res = SC_Utils_Ex::sfReadFile($tmp_filename);
         }
-        
+
         //テンポラリファイル削除
         unlink($tmp_filename);
         return $res;
     }
 
+
     // CSV出力データを作成する。(レビュー)
     function lfGetReviewCSV($where, $option, $arrval) {
 

変更: branches/version-2_5-dev/data/class/pages/admin/contents/LC_Page_Admin_Contents_CSV.php
===================================================================
--- branches/version-2_5-dev/data/class/pages/admin/contents/LC_Page_Admin_Contents_CSV.php	2011-02-22 01:44:08 UTC (rev 20317)
+++ branches/version-2_5-dev/data/class/pages/admin/contents/LC_Page_Admin_Contents_CSV.php	2011-02-22 01:47:25 UTC (rev 20318)
@@ -47,9 +47,13 @@
         $this->tpl_mainpage = 'contents/csv.tpl';
         $this->tpl_subnavi = 'contents/subnavi.tpl';
         $this->tpl_subno = 'csv';
-
         $this->tpl_mainno = "contents";
         $this->tpl_subtitle = 'CSV出力設定';
+
+        $objCSV = new SC_Helper_CSV_Ex();
+        $this->arrSubnavi = $objCSV->arrSubnavi; // 別名
+        $this->tpl_subno_csv = $objCSV->arrSubnavi[1]; //デフォルト
+        $this->arrSubnaviName = $objCSV->arrSubnaviName; // 表示名
     }
 
     /**
@@ -68,80 +72,114 @@
      * @return void
      */
     function action() {
-        $objSess = new SC_Session();
-        $objCSV = new SC_Helper_CSV_Ex();
-
-        $this->arrSubnavi = $objCSV->arrSubnavi;
-        $this->tpl_subno_csv = $objCSV->arrSubnavi[1];
-        $this->arrSubnaviName = $objCSV->arrSubnaviName;
-
         // 認証可否の判定
-        $objSess = new SC_Session();
-        SC_Utils_Ex::sfIsSuccess($objSess);
+        SC_Utils_Ex::sfIsSuccess(new SC_Session());
 
-        $get_tpl_subno_csv = isset($_GET['tpl_subno_csv'])
-                                     ? $_GET['tpl_subno_csv'] : "";
-
-        // GETで値が送られている場合にはその値を元に画面表示を切り替える
-        if ($get_tpl_subno_csv != ""){
-            // 送られてきた値が配列に登録されていなければTOPを表示
-            if (in_array($get_tpl_subno_csv,$this->arrSubnavi)){
-                $subno_csv = $get_tpl_subno_csv;
-            }else{
-                $subno_csv = $this->arrSubnavi[1];
+        // 不正アクセスチェック 
+        if ($_SERVER["REQUEST_METHOD"] == "POST") {
+            if (!SC_Helper_Session_Ex::isValidToken()) {
+                SC_Utils_Ex::sfDispError(INVALID_MOVE_ERRORR);
             }
-        } else {
-            // GETで値がなければPOSTの値を使用する
-            if (isset($_POST['tpl_subno_csv'])
-                && $_POST['tpl_subno_csv'] != "") {
-
-                $subno_csv = $_POST['tpl_subno_csv'];
-            }else{
-                $subno_csv = $this->arrSubnavi[1];
-            }
         }
+        // トランザクションID
+        $this->transactionid = SC_Helper_Session_Ex::getToken();
 
-        // subnoの番号を取得
-        $subno_id = array_keys($this->arrSubnavi,$subno_csv);
-        $subno_id = $subno_id[0];
+        // パラメータ管理クラス
+        $objFormParam = new SC_FormParam();
+        // パラメータ設定
+        $this->lfInitParam($objFormParam);
+        $objFormParam->setParam($_POST);
+        $objFormParam->setParam($_GET);
+        $objFormParam->convParam();
 
-        // データの登録
+        // CSV_IDの読み込み
+        $this->tpl_subno_csv = $objFormParam->getValue('tpl_subno_csv');
+        $this->tpl_csv_id = $this->lfGetCsvId($this->tpl_subno_csv);
+
         switch ($this->getMode()) {
         case 'confirm':
-            // エラーチェック
-            $this->arrErr = $this->lfCheckError($_POST['output_list']);
-
-            if (count($this->arrErr) <= 0){
-                // データの更新
-                $this->lfUpdCsvOutput($subno_id, $_POST['output_list']);
-
-                // 画面のリロード
-                $this->objDisplay->reload(array("tpl_subno_csv" => $subno_csv));
+            // 入力パラメーターチェック
+            $this->arrErr = $objFormParam->checkError();
+            if(SC_Utils_Ex::isBlank($this->arrErr)) {
+                // 更新
+                $this->tpl_is_update = $this->lfUpdCsvOutput($this->tpl_csv_id, $objFormParam->getValue('output_list'));
             }
             break;
+        case 'defaultset':
+            //初期値に戻す
+            $this->tpl_is_update = $this->lfSetDefaultCsvOutput($this->tpl_csv_id);
+            break;
         default:
             break;
         }
+        $this->arrSelected = $this->lfGetSelected($this->tpl_csv_id);
+        $this->arrOptions = $this->lfGetOptions($this->tpl_csv_id);
+        $this->tpl_subtitle .= ' - ' . $this->arrSubnaviName[ $this->tpl_csv_id ];
+    }
 
-        // 出力項目の取得
-        $arrSelected = SC_Utils_Ex::sfSwapArray($objCSV->sfGetCsvOutput($subno_id, 'status = 1'));
+    /**
+     * パラメーター情報の初期化
+     *
+     * @param array $objFormParam フォームパラメータークラス
+     * @return void
+     */
+    function lfInitParam(&$objFormParam) {
+        $objFormParam->addParam('編集種別', 'tpl_subno_csv', STEXT_LEN, 'a', array("ALNUM_CHECK", "MAX_LENGTH_CHECK"), 'product');
+        $objFormParam->addParam('出力設定リスト', 'output_list', INT_LEN, 'n', array("NUM_CHECK", "MAX_LENGTH_CHECK", "EXIST_CHECK"));
+        //デフォルト値で上書き
+        $objFormParam->setParam(array('tpl_subno_csv' => 'product'));
+    }
 
-        if (!isset($arrSelected['no'])) $arrSelected['no'] = array();
+    /**
+     * CSVカラム設定の読み込み
+     *
+     * @param integer $csv_id CSV ID
+     * @param integer $csv_status_flg 読み込む対象のフラグ CSV_COLUMN_STATUS_FLG_ENABLE or ''
+     * @return array SwapArrayしたカラム設定
+     */
+    function lfGetCSVColumn($csv_id, $csv_status_flg = '', $order ='rank, no') {
+        $objCSV = new SC_Helper_CSV_Ex();
+        if(SC_Utils_Ex::sfIsInt($csv_id)) {
+            if($csv_status_flg !="") {
+                $arrData = $objCSV->sfGetCsvOutput($csv_id, 'status = ?' , array($csv_status_flg), $order);
+            }else{
+                $arrData = $objCSV->sfGetCsvOutput($csv_id, '', array(), $order);
+            }
+            $arrData = SC_Utils_Ex::sfSwapArray($arrData);
+        }else{
+            $arrData = array();
+        }
+        return $arrData;
+    }
 
-        $this->arrSelected = $arrSelected['no'];
+    /**
+     * 選択済みカラム列情報を取得
+     *
+     * @param integer $csv_id CSV ID
+     * @return array 選択済みカラム列情報
+     */
+    function lfGetSelected($csv_id) {
+        $arrData = $this->lfGetCSVColumn($csv_id, CSV_COLUMN_STATUS_FLG_ENABLE);
+        if (!isset($arrData['no'])) {
+            $arrData['no'] = array();
+        }
+        return $arrData['no'];
+    }
 
-        // 全項目の取得
-        $arrOptions = SC_Utils_Ex::sfSwapArray($objCSV->sfGetCsvOutput($subno_id));
-
-        if (!isset($arrOptions['no'])) $arrOptions['no'] = array();
-        if (!isset($arrOptions['disp_name'])) $arrOptions['disp_name'] = array();
-
-        $arrOptions = SC_Utils_Ex::sfarrCombine($arrOptions['no'], $arrOptions['disp_name']);
-
-        $this->arrOptions = $arrOptions;
-
-        $this->SubnaviName = $this->arrSubnaviName[$subno_id];
-        $this->tpl_subno_csv = $subno_csv;
+    /**
+     * カラム列情報と表示名情報を取得
+     *
+     * @param integer $csv_id CSV ID
+     * @return array 選択済みカラム列情報
+     */
+    function lfGetOptions($csv_id) {
+        $arrData = $this->lfGetCSVColumn($csv_id);
+        if (!isset($arrData['no'])) {
+            $arrData['no'] = array();
+            $arrData['disp_name'] = array();
+        }
+        $arrData = SC_Utils_Ex::sfArrCombine($arrData['no'], $arrData['disp_name']);
+        return $arrData;
     }
 
    /**
@@ -153,28 +191,67 @@
         parent::destroy();
     }
 
+    /**
+     * CSV名からCSV_IDを取得する。
+     *
+     * @param string $subno_csv CSV名
+     * @return integer CSV_ID
+     */
+    function lfGetCsvId($subno_csv) {
+        $objCSV = new SC_Helper_CSV_Ex();
+        $arrKey = array_keys($objCSV->arrSubnavi,$subno_csv);
+        $csv_id = $arrKey[0];
+        if(!SC_Utils_Ex::sfIsInt($csv_id)) {
+            //初期値取りだし
+            $arrKey = array_keys($objCSV->arrSubnavi);
+            $csv_id = $arrKey[0];
+        }
+        return $csv_id;
+    }
+
+    /**
+     * CSV出力項目設定を初期化する
+     *
+     * @param integer $csv_id CSV_ID
+     * @return boolean 成功:true
+     */
+    function lfSetDefaultCsvOutput($csv_id) {
+        $arrData = $this->lfGetCSVColumn($csv_id, '', $order = 'no');
+        if (!isset($arrData['no'])) {
+            $arrData['no'] = array();
+        }
+        return $this->lfUpdCsvOutput($csv_id, $arrData['no']);
+    }
+
+    /**
+     * CSV出力項目設定を更新する処理
+     *
+     * @param integer $csv_id CSV_ID
+     * @param array $arrData 有効にするCSV列データ配列
+     * @return boolean 成功:true
+     */
     function lfUpdCsvOutput($csv_id, $arrData = array()){
-        $objQuery = new SC_Query();
-
+        $objQuery =& SC_Query::getSingletonInstance();
         // ひとまず、全部使用しないで更新する
-        $upd_sql = "UPDATE dtb_csv SET status = 2, rank = NULL, update_date = now() WHERE csv_id = ?";
-        $objQuery->query($upd_sql, array($csv_id));
+        $table = "dtb_csv";
+        $where = "csv_id = ?";
+        $arrWhereVal = array($csv_id);
+        $arrUpdVal = array( 'status' => '2', 'rank' => NULL, 'update_date' => 'now()' );
 
+        $objQuery->begin();
+        $objQuery->update($table, $arrUpdVal, $where, $arrWhereVal);
         // 使用するものだけ、再更新する。
         if (is_array($arrData)) {
+            $where .= " AND no = ?";
+            $arrUpdVal = array('status' => '1');
             foreach($arrData as $key => $val){
-                $upd_sql = "UPDATE dtb_csv SET status = 1, rank = ? WHERE csv_id = ? AND no = ? ";
-                $objQuery->query($upd_sql, array($key+1, $csv_id, $val));
+                $arrWhereVal = array($csv_id, $val);
+                $arrUpdVal['rank'] = $key + 1;
+                $objQuery->update($table, $arrUpdVal, $where, $arrWhereVal);
             }
         }
+        $objQuery->commit();
+        return true;
     }
-
-    Function Lfcheckerror($data){
-        $objErr = new SC_CheckError();
-        $objErr->doFunc( array("出力項目", "output_list"), array("EXIST_CHECK") );
-
-        return $objErr->arrErr;
-
-    }
 }
 ?>

変更: branches/version-2_5-dev/data/class/pages/admin/contents/LC_Page_Admin_Contents_CsvSql.php
===================================================================
--- branches/version-2_5-dev/data/class/pages/admin/contents/LC_Page_Admin_Contents_CsvSql.php	2011-02-22 01:44:08 UTC (rev 20317)
+++ branches/version-2_5-dev/data/class/pages/admin/contents/LC_Page_Admin_Contents_CsvSql.php	2011-02-22 01:47:25 UTC (rev 20318)
@@ -67,159 +67,171 @@
      * @return void
      */
     function action() {
-        $objDbFactory = SC_DB_DBFactory_Ex::getInstance();
-
         // 認証可否の判定
-        $objSess = new SC_Session();
-        SC_Utils_Ex::sfIsSuccess($objSess);
+        SC_Utils_Ex::sfIsSuccess(new SC_Session());
 
-        if (!isset($_POST['sql_id'])) $_POST['sql_id'] = "";
-        if (!isset($_GET['sql_id'])) $_GET['sql_id'] = "";
-        if (!isset($_POST['selectTable'])) $_POST['selectTable'] = "";
+        // パラメータ管理クラス
+        $objFormParam = new SC_FormParam();
+        // パラメータ設定
+        $this->lfInitParam($objFormParam);
+        $objFormParam->setParam($_POST);
+        $objFormParam->setParam($_GET);
+        $objFormParam->convParam();
+        $this->arrForm = $objFormParam->getHashArray();
 
-        // SQL_IDの取得
-        if ($_POST['sql_id'] != "") {
-            $sql_id = $_POST['sql_id'];
-        }elseif($_GET['sql_id'] != ""){
-            $sql_id = $_GET['sql_id'];
-        }else{
-            $sql_id = "";
-        }
-
-        $mode = $this->getMode();
-
-        switch($mode) {
-            // データの登録
+        switch($this->getMode()) {
+        // データの登録
         case "confirm":
-            // エラーチェック
-            $this->arrErr = $this->lfCheckError($_POST);
-
-            if (count($this->arrErr) <= 0){
+            $this->arrErr = $this->lfCheckConfirmError($objFormParam);
+            if(SC_Utils_Ex::isBlank($this->arrErr)) {
                 // データの更新
-                $sql_id = $this->lfUpdData($sql_id, $_POST);
+                $this->arrForm['sql_id'] = $this->lfUpdData($objFormParam->getValue('sql_id'), $objFormParam->getDbArray());
                 // 完了メッセージ表示
                 $this->tpl_onload = "alert('登録が完了しました。');";
             }
             break;
-
-            // 確認画面
+        // 確認画面
         case "preview":
-            // SQL文表示
-            $sql = "SELECT \n" . $_POST['csv_sql']; // FIXME
-            $this->sql = $sql;
-
-            // エラー表示
-            $objErrMsg = $this->lfCheckSQL($_POST);
-            if ($objErrMsg != "") {
-                $errMsg = $objErrMsg->message . "\n" . $objErrMsg->userinfo;
+            $this->arrErr = $this->lfCheckPreviewError($objFormParam);
+            if(SC_Utils_Ex::isBlank($this->arrErr)) {
+                $this->sqlerr = $this->lfCheckSQL($objFormParam->getValue('csv_sql'));
             }
-
-            $this->sqlerr = isset($errMsg) ? $errMsg : "" ;
-
-            // 画面の表示
             $this->setTemplate('contents/csv_sql_view.tpl');
             return;
             break;
-
-            // 新規作成
+        // 新規作成
         case "new_page":
-            $this->objDisplay->reload(array(), true);
-            exit;
+            // リロード
+            SC_Response_Ex::reload();
             break;
-
-            // データ削除
+        // データ削除
         case "delete":
-            $this->lfDelData($sql_id);
-            $this->objDisplay->reload(array(), true);
-            exit;
+            $this->arrErr = $this->lfCheckDeleteError($objFormParam);
+            if(SC_Utils_Ex::isBlank($this->arrErr)) {
+                $this->lfDelData($objFormParam->getValue('sql_id'));
+                SC_Response_Ex::reload();
+                exit;
+            }
             break;
-
+        // CSV出力
         case "csv_output":
-            // CSV出力データ取得
-            $arrCsvData = $this->lfGetSqlList(" WHERE sql_id = ?", array($_POST['csv_output_id']));
-
-            $objQuery = new SC_Query();
-
-            $arrCsvOutputData = $objQuery->getAll("SELECT " . $arrCsvData[0]['csv_sql']);
-
-            if (count($arrCsvOutputData) > 0) {
-
-                $arrKey = array_keys(SC_Utils_Ex::sfSwapArray($arrCsvOutputData));
-                $i = 0;
-                $header = "";
-                foreach($arrKey as $data) {
-                    if ($i != 0) $header .= ",";
-                    $header .= $data;
-                    $i ++;
-                }
-                $header .= "\n";
-
-                $data = SC_Utils_Ex::getCSVData($arrCsvOutputData, $arrKey);
-                // CSV出力
-                SC_Utils_Ex::sfCSVDownload($header.$data);
+            $this->arrErr = $this->lfCheckOutputError($objFormParam);
+            if(SC_Utils_Ex::isBlank($this->arrErr)) {
+                $this->lfDoCsvOutput($objFormParam->getValue('csv_output_id'));
                 exit;
-            }else{
-                $this->tpl_onload = "alert('出力データがありません。');";
-                $sql_id = "";
-                $_POST="";
             }
             break;
+        default:
+            $this->arrErr = $objFormParam->checkError();
+            if(SC_Utils_Ex::isBlank($this->arrErr)) {
+                // 設定内容を取得する
+                $this->arrForm = $this->lfGetSqlData($objFormParam);
+                // カラム一覧を取得する
+                $this->arrColList = $this->lfGetColList($objFormParam->getValue('select_table'));
+            }
+            break;
         }
 
-        // mode が confirm 以外のときは完了メッセージは出力しない
-        if ($mode != "confirm" and $mode != "csv_output") {
-            $this->tpl_onload = "";
-        }
-
         // 登録済みSQL一覧取得
-        $arrSqlList = $this->lfGetSqlList();
+        $this->arrSqlList = $this->lfGetSqlList();
+        // テーブル一覧を取得する
+        $this->arrTableList = $this->lfGetTableList();
+    }
 
-        // 編集用SQLデータの取得
-        if ($sql_id != "") {
-            $arrSqlData = $this->lfGetSqlList(" WHERE sql_id = ?", array($sql_id));
+    /**
+     * パラメーター情報の初期化
+     *
+     * @param array $objFormParam フォームパラメータークラス
+     * @return void
+     */
+    function lfInitParam(&$objFormParam) {
+        $objFormParam->addParam('SQL ID', 'sql_id', INT_LEN, 'n', array("NUM_CHECK","MAX_LENGTH_CHECK"));
+        $objFormParam->addParam('CSV出力対象SQL ID', 'csv_output_id', INT_LEN, 'n', array("NUM_CHECK","MAX_LENGTH_CHECK"), "", false);
+        $objFormParam->addParam('選択テーブル', 'select_table', STEXT_LEN, 'KVa', array("GRAPH_CHECK","MAX_LENGTH_CHECK"), "", false);
+        $objFormParam->addParam('名称', 'sql_name', STEXT_LEN, 'KVa', array("MAX_LENGTH_CHECK","SPTAB_CHECK"));
+        $objFormParam->addParam('SQL文', 'csv_sql', "30000", 'KVa', array("MAX_LENGTH_CHECK","SPTAB_CHECK"));
+    }
+    
+    /**
+     * SQL登録エラーチェック
+     *
+     * @param array $objFormParam フォームパラメータークラス
+     * @return array エラー配列
+     */
+    function lfCheckConfirmError(&$objFormParam) {
+        // パラメーターの基本チェック
+        $arrErr = $objFormParam->checkError();
+        // 拡張エラーチェック
+        $objErr = new SC_CheckError($objFormParam->getHashArray());
+        $objErr->doFunc( array("名称", "sql_name"), array("EXIST_CHECK") );
+        $objErr->doFunc( array("SQL文", "csv_sql", "30000"), array("EXIST_CHECK", "MAX_LENGTH_CHECK") );
+        $objErr->doFunc( array('SQL文には読み込み関係以外のSQLコマンドおよび";"記号', 'csv_sql', $this->lfGetSqlDenyList()), array("PROHIBITED_STR_CHECK"));
+        if(!SC_Utils_Ex::isBlank($objErr->arrErr)) {
+            $arrErr = array_merge($arrErr, $objErr->arrErr);
         }
+        // SQL文自体の確認、エラーが無い時のみ実行
+        if(SC_Utils_Ex::isBlank($arrErr)) {
+            $sql_error = $this->lfCheckSQL($objFormParam->getValue('csv_sql'));
+            if(!SC_Utils_Ex::isBlank($sql_error)) {
+                $arrErr["csv_sql"] = "※ SQL文が不正です。SQL文を見直してください";
+            }
+        }
+        return $arrErr;
+    }
 
-        // テーブル一覧を取得する
-        $arrTableList = $this->lfGetTableList();
-        $arrTableList = SC_Utils_Ex::sfSwapArray($arrTableList);
-
-        // 現在選択されているテーブルを取得する
-        if ($_POST['selectTable'] == ""){
-            $selectTable = $arrTableList['table_name'][0];
-        }else{
-            $selectTable = $_POST['selectTable'];
+    /**
+     * SQL確認エラーチェック
+     *
+     * @param array $objFormParam フォームパラメータークラス
+     * @return array エラー配列
+     */
+    function lfCheckPreviewError(&$objFormParam) {
+        // パラメーターの基本チェック
+        $arrErr = $objFormParam->checkError();
+        // 拡張エラーチェック
+        $objErr = new SC_CheckError($objFormParam->getHashArray());
+        $objErr->doFunc( array("SQL文", "csv_sql", "30000"), array("EXIST_CHECK", "MAX_LENGTH_CHECK") );
+        $objErr->doFunc( array('SQL文には読み込み関係以外のSQLコマンドおよび";"記号', 'csv_sql', $this->lfGetSqlDenyList()), array("PROHIBITED_STR_CHECK"));
+        if(!SC_Utils_Ex::isBlank($objErr->arrErr)) {
+            $arrErr = array_merge($arrErr, $objErr->arrErr);
         }
+        return $arrErr;
+    }
 
-        // カラム一覧を取得する
-        $arrColList = $this->lfGetColumnList($selectTable);
-        $arrColList =  SC_Utils_Ex::sfSwapArray($arrColList);
-
-        // 表示させる内容を編集
-        foreach ($arrTableList['description'] as $key => $val) {
-            $arrTableList['description'][$key] = $arrTableList['table_name'][$key] . ":" . $arrTableList['description'][$key];
+    /**
+     * SQL設定 削除エラーチェック
+     *
+     * @param array $objFormParam フォームパラメータークラス
+     * @return array エラー配列
+     */
+    function lfCheckDeleteError(&$objFormParam) {
+        // パラメーターの基本チェック
+        $arrErr = $objFormParam->checkError();
+        // 拡張エラーチェック
+        $objErr = new SC_CheckError($objFormParam->getHashArray());
+        $objErr->doFunc( array("SQL ID", "sql_id"), array("EXIST_CHECK") );
+        if(!SC_Utils_Ex::isBlank($objErr->arrErr)) {
+            $arrErr = array_merge($arrErr, $objErr->arrErr);
         }
-        foreach ($arrColList['description'] as $key => $val) {
-            $arrColList['description'][$key] = $arrColList['column_name'][$key] . ":" . $arrColList['description'][$key];
-        }
+        return $arrErr;
+    }
 
-
-        $arrDiff = array_diff($objDbFactory->sfGetColumnList($selectTable), $arrColList["column_name"]);
-        $arrColList["column_name"] = array_merge($arrColList["column_name"], $arrDiff);
-        $arrColList["description"] = array_merge($arrColList["description"], $arrDiff);
-
-        // テンプレートに出力するデータをセット
-        $this->arrSqlList = $arrSqlList;	// SQL一覧
-        $this->arrTableList = SC_Utils_Ex::sfarrCombine($arrTableList['table_name'], $arrTableList['description']);	// テーブル一覧
-        $this->arrColList = SC_Utils_Ex::sfarrCombine($arrColList['column_name'],$arrColList['description']);			// カラム一覧
-        $this->selectTable = $selectTable;	// 選択されているテーブル
-        $this->sql_id = $sql_id;			// 選択されているSQL
-
-        // POSTされたデータをセットする
-        if (isset($_POST['sql_name']) && isset($_POST['csv_sql'])){
-            $arrSqlData[0]['sql_name'] = isset($_POST['sql_name']) ? $_POST['sql_name'] : "";
-            $arrSqlData[0]['csv_sql'] = isset($_POST['csv_sql']) ? $_POST['csv_sql'] : "";
+    /**
+     * SQL設定 CSV出力エラーチェック
+     *
+     * @param array $objFormParam フォームパラメータークラス
+     * @return array エラー配列
+     */
+    function lfCheckOutputError(&$objFormParam) {
+        // パラメーターの基本チェック
+        $arrErr = $objFormParam->checkError();
+        // 拡張エラーチェック
+        $objErr = new SC_CheckError($objFormParam->getHashArray());
+        $objErr->doFunc( array("CSV出力対象SQL ID", "csv_output_id"), array("EXIST_CHECK") );
+        if(!SC_Utils_Ex::isBlank($objErr->arrErr)) {
+            $arrErr = array_merge($arrErr, $objErr->arrErr);
         }
-        $this->arrSqlData = $arrSqlData[0];	// 選択されているSQLデータ
+        return $arrErr;
     }
 
     /**
@@ -234,16 +246,25 @@
     /**
      * テーブル一覧を取得する.
      *
-     * @return void
+     * @return array テーブル名一覧
      */
     function lfGetTableList(){
-        $objQuery = new SC_Query();
-        $arrRet = array();		// 結果取得用
-
-        $sql = "";
-        $sql .= "SELECT table_name, description FROM dtb_table_comment WHERE column_name IS NULL ORDER BY table_name";
-        $arrRet = $objQuery->getAll($sql);
-
+        $objQuery =& SC_Query::getSingletonInstance();
+        // 実テーブル上のカラム設定を見に行く仕様に変更 ref #476
+        $arrTable = $objQuery->listTables();
+        if(SC_Utils_Ex::isBlank($arrTable)) {
+            return array();
+        }
+        $arrRet = array();
+        foreach($arrTable as $table) {
+            if(substr($table, 0, 4) == 'dtb_') {
+                $arrRet[ $table ] = 'データテーブル: ' . $table;
+            }else if(substr($table, 0, 4) == 'mtb_') {
+                $arrRet[ $table ] = 'マスタテーブル: ' . $table;
+            }else if(substr($table, 0, 3) == 'vw_') {
+                $arrRet[ $table ] = 'ビュー: ' . $table;
+            }
+        }
         return $arrRet;
     }
 
@@ -253,137 +274,122 @@
      * @param string $selectTable テーブル名
      * @return array カラム一覧の配列
      */
-    function lfGetColumnList($selectTable){
-        $objQuery = new SC_Query();
-        $arrRet = array();		// 結果取得用
-        $sql = "";
-        $sql .= " SELECT column_name, description FROM dtb_table_comment WHERE table_name = ? AND column_name IS NOT NULL";
-        $arrRet = $objQuery->getAll($sql, array($selectTable));
-
-        return $arrRet;
+    function lfGetColList($table){
+        if(SC_Utils_Ex::isBlank($table)) {
+            return array();
+        }
+        $objQuery =& SC_Query::getSingletonInstance();
+        // 実テーブル上のカラム設定を見に行く仕様に変更 ref #476
+        $arrColList = $objQuery->listTableFields($table);
+        $arrColList= SC_Utils_Ex::sfArrCombine($arrColList, $arrColList);
+        return $arrColList;
     }
 
     /**
      * 登録済みSQL一覧を取得する.
      *
      * @param string $where Where句
-     * @param array $arrData 絞り込みデータ
+     * @param array $arrVal 絞り込みデータ
      * @return array 取得結果の配列
      */
-    function lfGetSqlList($where = "" , $arrData = array()){
-        $objQuery = new SC_Query();
-        $arrRet = array();		// 結果取得用
+    function lfGetSqlList($where = "" , $arrVal = array()){
+        $objQuery =& SC_Query::getSingletonInstance();
+        $table = "dtb_csv_sql";
+        $objQuery->setOrder('sql_id');
+        return $objQuery->select('*', $table, $where, $arrVal);
+    }
 
-        $sql = "";
-        $sql .= " SELECT";
-        $sql .= "     sql_id,";
-        $sql .= "     sql_name,";
-        $sql .= "     csv_sql,";
-        $sql .= "     update_date,";
-        $sql .= "     create_date";
-        $sql .= " FROM";
-        $sql .= "     dtb_csv_sql";
-
-        // Where句の指定があれば結合する
-        if ($where != "") {
-            $sql .= " $where ";
-        }else{
-            $sql .= " ORDER BY sql_id ";
+    /**
+     * 入力されたSQL文が正しく実行出来るかのチェックを行う.
+     *
+     * @param string SQL文データ(頭にSELECTは入れない)
+     * @return string エラー内容
+     */
+    function lfCheckSQL($sql){
+        // FIXME: 意図的に new SC_Query しています。 force_runをtrueにする必要があるので.本当はqueryの引数で制御したい。ref SC_Query
+        $objQuery = new SC_Query("", true);
+        $err = "";
+        $sql = "SELECT " . $sql . " ";
+        $objErrMsg = $objQuery->query($sql);
+        if (PEAR::isError($objErrMsg)){
+            $err = $objErrMsg->message . "\n" . $objErrMsg->userinfo;
         }
-        $sql .= " ";
-
-        // データを引数で渡されている場合にはセットする
-        if (count($arrData) > 0) {
-            $arrRet = $objQuery->getAll($sql, $arrData);
-        }else{
-            $arrRet = $objQuery->getAll($sql);
-        }
-
-        return $arrRet;
+        return $err;
     }
 
     /**
-     * 入力項目のエラーチェックを行う.
+     * SQL詳細設定情報呼び出し (編集中データがある場合はそれを保持する)
      *
-     * @param array POSTデータ
-     * @return array エラー内容の配列
+     * @param array $objFormParam フォームパラメータークラス
+     * @return mixed 表示用パラメーター
      */
-    function lfCheckError($data){
-        $objErr = new SC_CheckError();
-        $objErr->doFunc( array("名称", "sql_name"), array("EXIST_CHECK") );
-        $objErr->doFunc( array("SQL文", "csv_sql", "30000"), array("EXIST_CHECK", "MAX_LENGTH_CHECK") );
-
-        // SQLの妥当性チェック
-        if ($objErr->arrErr['csv_sql'] == "") {
-            $objsqlErr = $this->lfCheckSQL($data);
-            if ($objsqlErr != "") {
-                $objErr->arrErr["csv_sql"] = "SQL文が不正です。SQL文を見直してください";
-            }
+    function lfGetSqlData(&$objFormParam) {
+        // 編集中データがある場合
+        if(!SC_Utils_Ex::isBlank($objFormParam->getValue('sql_name'))
+                or !SC_Utils_Ex::isBlank($objFormParam->getValue('csv_sql'))) {
+            return $objFormParam->getHashArray();
         }
-
-        return $objErr->arrErr;
+        $csv_id = $objFormParam->getValue('csv_id');
+        if(!SC_Utils_Ex::isBlank($csv_id)) {
+            $arrData = $this->lfGetSqlList('csv_id = ?', array($csv_id));
+            return $arrData[0];
+        }
+        return array();
     }
 
     /**
-     * 入力されたSQL文が正しいかチェックを行う.
+     * DBにデータを保存する.
      *
-     * @param array POSTデータ
-     * @return array エラー内容
+     * @param integer $sql_id 出力するデータのSQL_ID
+     * @return void
      */
-    function lfCheckSQL($data){
-        $err = "";
-        $objQuery = new SC_Query();
-        $sql = "SELECT " . $data['csv_sql'] . " ";
-        $ret = $objQuery->query($sql);
-        if (PEAR::isError($ret)){
-            $err = $ret;
+    function lfDoCsvOutput($sql_id) {
+        $arrData = $this->lfGetSqlList('sql_id = ?', array($sql_id));
+        $sql = "SELECT " . $arrData[0]['csv_sql'] . " ";
+
+        // TODO: ヘッダ取得 SQL内にLIMIT文がある場合はLIMIT句は追加しないので重いかも
+        $objQuery =& SC_Query::getSingletonInstance();
+
+        $arrHeader = array();
+        if(!preg_match("/ LIMIT /", $sql)) {
+            $head_sql = $sql . " LIMIT 0";
+        }else{
+            $head_sql = $sql;
         }
-
-        return $err;
+        $arrData = $objQuery->getQueryDefsFields($head_sql, array(), true);
+        if(!SC_Utils_Ex::isBlank($arrData)) {
+            foreach($arrData as $key => $val) {
+                $arrHeader[] = $key;
+            }
+        }
+        require_once(CLASS_EX_REALDIR . "helper_extends/SC_Helper_CSV_Ex.php");
+        $objCSV = new SC_Helper_CSV_Ex();
+        $objCSV->sfDownloadCsvFromSql($sql, array(), "contents", $arrHeader, true);
+        exit;
     }
 
     /**
      * DBにデータを保存する.
      *
      * @param integer $sql_id 更新するデータのSQL_ID
-     * @param array $arrData 更新データの配列
+     * @param array $arrSqlVal 更新データの配列
      * @return integer $sql_id SQL_IDを返す
      */
-    function lfUpdData($sql_id = "", $arrData = array()){
-        $objQuery = new SC_Query();		// DB操作オブジェクト
-        $sql = "";						// データ取得SQL生成用
-        $arrRet = array();				// データ取得用(更新判定)
-        $arrVal = array();				// データ更新
-
-        // sql_id が指定されている場合にはUPDATE
-        if ($sql_id != "") {
-            // 存在チェック
-            $arrSqlData = $this->lfGetSqlList(" WHERE sql_id = ?", array($sql_id));
-            if (count($arrSqlData) > 0) {
-                // データ更新
-                $sql = "UPDATE dtb_csv_sql SET sql_name = ?, csv_sql = ?, update_date = now() WHERE sql_id = ? ";
-                $arrVal= array($arrData['sql_name'], $arrData['csv_sql'], $sql_id);
-            }else{
-                // データの新規作成
-                $sql_id = "";
-                $sql = "INSERT INTO dtb_csv_sql (sql_id, sql_name, csv_sql, create_date, update_date) values (?, ?, ?, now(), now()) ";
-                $arrVal= array($objQuery->nextVal('dtb_csv_sql_sql_id'), $arrData['sql_name'], $arrData['csv_sql']);
-
-            }
+    function lfUpdData($sql_id, $arrSqlVal){
+        $objQuery =& SC_Query::getSingletonInstance();
+        $table = "dtb_csv_sql";
+        $arrSqlVal['update_date'] = 'now()';
+        if (SC_Utils_Ex::sfIsInt($sql_id)) {
+            //データ更新
+            $where = "sql_id = ?";
+            $objQuery->update($table, $arrSqlVal, $where, array($sql_id));
         }else{
-            // データの新規作成
-            $sql = "INSERT INTO dtb_csv_sql (sql_id, sql_name, csv_sql, create_date, update_date) values (?, ?, ?, now(), now()) ";
-            $arrVal= array($objQuery->nextVal('dtb_csv_sql_sql_id'), $arrData['sql_name'], $arrData['csv_sql']);
+            //新規作成
+            $sql_id = $objQuery->nextVal('dtb_csv_sql_sql_id');
+            $arrSqlVal['sql_id'] = $sql_id;
+            $arrSqlVal['create_date'] = 'now()';
+            $objQuery->insert($table, $arrSqlVal);
         }
-        // SQL実行
-        $arrRet = $objQuery->query($sql,$arrVal);
-
-        // 新規作成時は$sql_idを取得
-        if ($sql_id == "") {
-            $arrNewData = $this->lfGetSqlList(" ORDER BY create_date DESC");
-            $sql_id = $arrNewData[0]['sql_id'];
-        }
-
         return $sql_id;
     }
 
@@ -392,25 +398,87 @@
      * 登録済みデータを削除する.
      *
      * @param integer $sql_id 削除するデータのSQL_ID
-     * @return bool 実行結果 TRUE:成功 FALSE:失敗
+     * @return boolean 実行結果 true:成功
      */
-    function lfDelData($sql_id = ""){
-        $objQuery = new SC_Query();		// DB操作オブジェクト
-        $sql = "";						// データ取得SQL生成用
-        $Ret = false;					// 実行結果
-
-        // sql_id が指定されている場合のみ実行
-        if ($sql_id != "") {
-            // データの削除
-            $sql = "DELETE FROM dtb_csv_sql WHERE sql_id = ? ";
-            // SQL実行
-            $ret = $objQuery->query($sql,array($sql_id));
-        }else{
-            $ret = false;
+    function lfDelData($sql_id){
+        $objQuery =& SC_Query::getSingletonInstance();
+        $table = "dtb_csv_sql";
+        $where = "sql_id = ?";
+        if(SC_Utils_Ex::sfIsInt($sql_id)) {
+            $objQuery->delete($table, $where, array($sql_id));
+            return true;
         }
+        return false;
+    }
 
-        // 結果を返す
-        return $ret;
+    /**
+     * SQL文に含めることを許可しないSQLキーワード
+     * 基本的にEC-CUBEのデータを取得するために必要なコマンドしか許可しない。複数クエリも不可
+     *
+     * FIXME: キーワードの精査。危険な部分なのでプログラム埋め込みで実装しました。mtb化の有無判断必要。
+     *
+     * @return array 不許可ワード配列
+     */
+    function lfGetSqlDenyList() {
+        $arrList = array(';'
+            ,'CREATE\s'
+            ,'INSERT\s'
+            ,'UPDATE\s'
+            ,'DELETE\s'
+            ,'ALTER\s'
+            ,'ABORT\s'
+            ,'ANALYZE\s'
+            ,'CLUSTER\s'
+            ,'COMMENT\s'
+            ,'COPY\s'
+            ,'DECLARE\s'
+            ,'DISCARD\s'
+            ,'DO\s'
+            ,'DROP\s'
+            ,'EXECUTE\s'
+            ,'EXPLAIN\s'
+            ,'GRANT\s'
+            ,'LISTEN\s'
+            ,'LOAD\s'
+            ,'LOCK\s'
+            ,'NOTIFY\s'
+            ,'PREPARE\s'
+            ,'REASSIGN\s'
+//            ,'REINDEX\s'      // REINDEXは許可で良いかなと
+            ,'RELEASE\sSAVEPOINT'
+            ,'RENAME\s'
+            ,'REST\s'
+            ,'REVOKE\s'
+            ,'SAVEPOINT\s'
+            ,'SET\s'
+            ,'SHOW\s'
+            ,'START\sTRANSACTION'
+            ,'TRUNCATE\s'
+            ,'UNLISTEN\s'
+            ,'VACCUM\s'
+            ,'HANDLER\s'
+            ,'LOAD\sDATA\s'
+            ,'LOAD\sXML\s'
+            ,'REPLACE\s'
+            ,'OPTIMIZE\s'
+            ,'REPAIR\s'
+            ,'INSTALL\sPLUGIN\s'
+            ,'UNINSTALL\sPLUGIN\s'
+            ,'BINLOG\s'
+            ,'KILL\s'
+            ,'RESET\s'
+            ,'PURGE\s'
+            ,'CHANGE\sMASTER'
+            ,'START\sSLAVE'
+            ,'STOP\sSLAVE'
+            ,'MASTER\sPOS\sWAIT'
+            ,'SIGNAL\s'
+            ,'RESIGNAL\s'
+            ,'RETURN\s'
+            ,'USE\s'
+            ,'HELP\s'
+            );
+        return $arrList;
     }
 }
 ?>




Svn-src-all メーリングリストの案内