source: branches/version-2_13-dev/data/class/pages/admin/contents/LC_Page_Admin_Contents_CsvSql.php @ 23124

Revision 23124, 16.7 KB checked in by kimoto, 11 years ago (diff)

#2043 typo修正・ソース整形・ソースコメントの改善 for 2.13.0
PHP4的な書き方の修正

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-httpd-php; charset=UTF-8
RevLine 
[16449]1<?php
2/*
[16582]3 * This file is part of EC-CUBE
4 *
[22206]5 * Copyright(c) 2000-2013 LOCKON CO.,LTD. All Rights Reserved.
[16449]6 *
7 * http://www.lockon.co.jp/
[16582]8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
[16449]22 */
23
[20534]24require_once CLASS_EX_REALDIR . 'page_extends/admin/LC_Page_Admin_Ex.php';
[16449]25
26/**
27 * CSV 出力項目設定(高度な設定)のページクラス.
28 *
29 * @package Page
30 * @author LOCKON CO.,LTD.
31 * @version $Id$
32 */
[22856]33class LC_Page_Admin_Contents_CsvSql extends LC_Page_Admin_Ex
[22567]34{
[16449]35    /**
36     * Page を初期化する.
37     *
38     * @return void
39     */
[23124]40    public function init()
[22567]41    {
[16449]42        parent::init();
43        $this->tpl_mainpage = 'contents/csv_sql.tpl';
44        $this->tpl_subno = 'csv';
45        $this->tpl_subno_csv = 'csv_sql';
[20538]46        $this->tpl_mainno = 'contents';
[20911]47        $this->tpl_maintitle = 'コンテンツ管理';
[16449]48        $this->tpl_subtitle = 'CSV出力設定';
49    }
50
51    /**
52     * Page のプロセス.
53     *
54     * @return void
55     */
[23124]56    public function process()
[22567]57    {
[19661]58        $this->action();
59        $this->sendResponse();
60    }
61
62    /**
63     * Page のアクション.
64     *
65     * @return void
66     */
[23124]67    public function action()
[22567]68    {
[20970]69        // パラメーター管理クラス
[20501]70        $objFormParam = new SC_FormParam_Ex();
[20970]71        // パラメーター設定
[20318]72        $this->lfInitParam($objFormParam);
73        $objFormParam->setParam($_POST);
74        $objFormParam->setParam($_GET);
75        $objFormParam->convParam();
76        $this->arrForm = $objFormParam->getHashArray();
[21441]77        switch ($this->getMode()) {
[21526]78            // データの登録
79            case 'confirm':
80                $this->arrErr = $this->lfCheckConfirmError($objFormParam);
81                if (SC_Utils_Ex::isBlank($this->arrErr)) {
82                    // データの更新
83                    $this->arrForm['sql_id'] = $this->lfUpdData($objFormParam->getValue('sql_id'), $objFormParam->getDbArray());
84                    // 完了メッセージ表示
85                    $this->tpl_onload = "alert('登録が完了しました。');";
86                }
87                break;
88            // 確認画面
89            case 'preview':
90                $this->arrErr = $this->lfCheckPreviewError($objFormParam);
91                if (SC_Utils_Ex::isBlank($this->arrErr)) {
92                    $this->sqlerr = $this->lfCheckSQL($objFormParam->getValue('csv_sql'));
93                }
94                $this->setTemplate('contents/csv_sql_view.tpl');
[23124]95
[21526]96                return;
97
98            // 新規作成
99            case 'new_page':
100                // リロード
[20318]101                SC_Response_Ex::reload();
[21526]102                break;
103            // データ削除
104            case 'delete':
105                $this->arrErr = $this->lfCheckDeleteError($objFormParam);
106                if (SC_Utils_Ex::isBlank($this->arrErr)) {
107                    $this->lfDelData($objFormParam->getValue('sql_id'));
108                    SC_Response_Ex::reload();
[21743]109                    SC_Response_Ex::actionExit();
[21526]110                }
111                break;
112            // CSV出力
113            case 'csv_output':
114                $this->arrErr = $this->lfCheckOutputError($objFormParam);
115                if (SC_Utils_Ex::isBlank($this->arrErr)) {
116                    $this->lfDoCsvOutput($objFormParam->getValue('csv_output_id'));
[21743]117                    SC_Response_Ex::actionExit();
[21526]118                }
119                break;
120            default:
121                $this->arrErr = $objFormParam->checkError();
122                if (SC_Utils_Ex::isBlank($this->arrErr)) {
123                    // 設定内容を取得する
124                    $this->arrForm = $this->lfGetSqlData($objFormParam);
125                    // カラム一覧を取得する
126                    $this->arrColList = $this->lfGetColList($objFormParam->getValue('select_table'));
127                }
128                break;
[16449]129        }
130
131        // 登録済みSQL一覧取得
[20318]132        $this->arrSqlList = $this->lfGetSqlList();
133        // テーブル一覧を取得する
134        $this->arrTableList = $this->lfGetTableList();
135    }
[16449]136
[20318]137    /**
138     * パラメーター情報の初期化
139     *
[23124]140     * @param  array $objFormParam フォームパラメータークラス
[20318]141     * @return void
142     */
[23124]143    public function lfInitParam(&$objFormParam)
[22567]144    {
[21480]145        $objFormParam->addParam('SQL ID', 'sql_id', INT_LEN, 'n', array('NUM_CHECK','MAX_LENGTH_CHECK'));
[21515]146        $objFormParam->addParam('CSV出力対象SQL ID', 'csv_output_id', INT_LEN, 'n', array('NUM_CHECK','MAX_LENGTH_CHECK'), '', false);
147        $objFormParam->addParam('選択テーブル', 'select_table', STEXT_LEN, 'KVa', array('GRAPH_CHECK','MAX_LENGTH_CHECK'), '', false);
[21480]148        $objFormParam->addParam('名称', 'sql_name', STEXT_LEN, 'KVa', array('MAX_LENGTH_CHECK','SPTAB_CHECK'));
[21481]149        $objFormParam->addParam('SQL文', 'csv_sql', '30000', 'KVa', array('MAX_LENGTH_CHECK','SPTAB_CHECK'));
[20318]150    }
[20540]151
[20318]152    /**
153     * SQL登録エラーチェック
154     *
[23124]155     * @param  array $objFormParam フォームパラメータークラス
[20318]156     * @return array エラー配列
157     */
[23124]158    public function lfCheckConfirmError(&$objFormParam)
[22567]159    {
[20318]160        // パラメーターの基本チェック
161        $arrErr = $objFormParam->checkError();
162        // 拡張エラーチェック
[20503]163        $objErr = new SC_CheckError_Ex($objFormParam->getHashArray());
[21516]164        $objErr->doFunc(array('名称', 'sql_name'), array('EXIST_CHECK'));
165        $objErr->doFunc(array('SQL文', 'csv_sql', '30000'), array('EXIST_CHECK', 'MAX_LENGTH_CHECK'));
166        $objErr->doFunc(array('SQL文には読み込み関係以外のSQLコマンドおよび";"記号', 'csv_sql', $this->lfGetSqlDenyList()), array('PROHIBITED_STR_CHECK'));
[21441]167        if (!SC_Utils_Ex::isBlank($objErr->arrErr)) {
[20318]168            $arrErr = array_merge($arrErr, $objErr->arrErr);
[16449]169        }
[20318]170        // SQL文自体の確認、エラーが無い時のみ実行
[21441]171        if (SC_Utils_Ex::isBlank($arrErr)) {
[20318]172            $sql_error = $this->lfCheckSQL($objFormParam->getValue('csv_sql'));
[21441]173            if (!SC_Utils_Ex::isBlank($sql_error)) {
[21514]174                $arrErr['csv_sql'] = '※ SQL文が不正です。SQL文を見直してください';
[20318]175            }
176        }
[22856]177
[20318]178        return $arrErr;
179    }
[16449]180
[20318]181    /**
182     * SQL確認エラーチェック
183     *
[23124]184     * @param  array $objFormParam フォームパラメータークラス
[20318]185     * @return array エラー配列
186     */
[23124]187    public function lfCheckPreviewError(&$objFormParam)
[22567]188    {
[20318]189        // パラメーターの基本チェック
190        $arrErr = $objFormParam->checkError();
191        // 拡張エラーチェック
[20503]192        $objErr = new SC_CheckError_Ex($objFormParam->getHashArray());
[21514]193        $objErr->doFunc( array('SQL文', 'csv_sql', '30000'), array('EXIST_CHECK', 'MAX_LENGTH_CHECK'));
[21480]194        $objErr->doFunc( array('SQL文には読み込み関係以外のSQLコマンドおよび";"記号', 'csv_sql', $this->lfGetSqlDenyList()), array('PROHIBITED_STR_CHECK'));
[21441]195        if (!SC_Utils_Ex::isBlank($objErr->arrErr)) {
[20318]196            $arrErr = array_merge($arrErr, $objErr->arrErr);
[16449]197        }
[22856]198
[20318]199        return $arrErr;
200    }
[16449]201
[20318]202    /**
203     * SQL設定 削除エラーチェック
204     *
[23124]205     * @param  array $objFormParam フォームパラメータークラス
[20318]206     * @return array エラー配列
207     */
[23124]208    public function lfCheckDeleteError(&$objFormParam)
[22567]209    {
[20318]210        // パラメーターの基本チェック
211        $arrErr = $objFormParam->checkError();
212        // 拡張エラーチェック
[20503]213        $objErr = new SC_CheckError_Ex($objFormParam->getHashArray());
[21514]214        $objErr->doFunc( array('SQL ID', 'sql_id'), array('EXIST_CHECK'));
[21441]215        if (!SC_Utils_Ex::isBlank($objErr->arrErr)) {
[20318]216            $arrErr = array_merge($arrErr, $objErr->arrErr);
[16449]217        }
[22856]218
[20318]219        return $arrErr;
220    }
[16449]221
[20318]222    /**
223     * SQL設定 CSV出力エラーチェック
224     *
[23124]225     * @param  array $objFormParam フォームパラメータークラス
[20318]226     * @return array エラー配列
227     */
[23124]228    public function lfCheckOutputError(&$objFormParam)
[22567]229    {
[20318]230        // パラメーターの基本チェック
231        $arrErr = $objFormParam->checkError();
232        // 拡張エラーチェック
[20503]233        $objErr = new SC_CheckError_Ex($objFormParam->getHashArray());
[21514]234        $objErr->doFunc( array('CSV出力対象SQL ID', 'csv_output_id'), array('EXIST_CHECK'));
[21441]235        if (!SC_Utils_Ex::isBlank($objErr->arrErr)) {
[20318]236            $arrErr = array_merge($arrErr, $objErr->arrErr);
[16449]237        }
[22856]238
[20318]239        return $arrErr;
[16449]240    }
241
242    /**
243     * テーブル一覧を取得する.
244     *
[20318]245     * @return array テーブル名一覧
[16449]246     */
[23124]247    public function lfGetTableList()
[22567]248    {
[20507]249        $objQuery =& SC_Query_Ex::getSingletonInstance();
[20318]250        // 実テーブル上のカラム設定を見に行く仕様に変更 ref #476
251        $arrTable = $objQuery->listTables();
[21441]252        if (SC_Utils_Ex::isBlank($arrTable)) {
[20318]253            return array();
254        }
255        $arrRet = array();
[21441]256        foreach ($arrTable as $table) {
257            if (substr($table, 0, 4) == 'dtb_') {
[20318]258                $arrRet[ $table ] = 'データテーブル: ' . $table;
[23124]259            } elseif (substr($table, 0, 4) == 'mtb_') {
[20970]260                $arrRet[ $table ] = 'マスターテーブル: ' . $table;
[20318]261            }
262        }
[22856]263
[16449]264        return $arrRet;
265    }
266
267    /**
268     * テーブルのカラム一覧を取得する.
269     *
[23124]270     * @param  string $selectTable テーブル名
271     * @return array  カラム一覧の配列
[16449]272     */
[23124]273    public function lfGetColList($table)
[22567]274    {
[21441]275        if (SC_Utils_Ex::isBlank($table)) {
[20318]276            return array();
277        }
[20507]278        $objQuery =& SC_Query_Ex::getSingletonInstance();
[20318]279        // 実テーブル上のカラム設定を見に行く仕様に変更 ref #476
280        $arrColList = $objQuery->listTableFields($table);
281        $arrColList= SC_Utils_Ex::sfArrCombine($arrColList, $arrColList);
[22856]282
[20318]283        return $arrColList;
[16449]284    }
285
286    /**
287     * 登録済みSQL一覧を取得する.
288     *
[23124]289     * @param  string $where  Where句
290     * @param  array  $arrVal 絞り込みデータ
291     * @return array  取得結果の配列
[16449]292     */
[23124]293    public function lfGetSqlList($where = '' , $arrVal = array())
[22567]294    {
[20507]295        $objQuery =& SC_Query_Ex::getSingletonInstance();
[21481]296        $table = 'dtb_csv_sql';
[20318]297        $objQuery->setOrder('sql_id');
[22856]298
[20318]299        return $objQuery->select('*', $table, $where, $arrVal);
300    }
[16449]301
[20318]302    /**
303     * 入力されたSQL文が正しく実行出来るかのチェックを行う.
304     *
305     * @param string SQL文データ(頭にSELECTは入れない)
306     * @return string エラー内容
307     */
[23124]308    public function lfCheckSQL($sql)
[22567]309    {
[20318]310        // FIXME: 意図的に new SC_Query しています。 force_runをtrueにする必要があるので.本当はqueryの引数で制御したい。ref SC_Query
[21514]311        $objQuery = new SC_Query_Ex('', true);
312        $err = '';
313        $sql = 'SELECT ' . $sql . ' ';
[20318]314        $objErrMsg = $objQuery->query($sql);
[21441]315        if (PEAR::isError($objErrMsg)) {
[20318]316            $err = $objErrMsg->message . "\n" . $objErrMsg->userinfo;
[16449]317        }
[22856]318
[20318]319        return $err;
[16449]320    }
321
322    /**
[20318]323     * SQL詳細設定情報呼び出し (編集中データがある場合はそれを保持する)
[16449]324     *
[23124]325     * @param  array $objFormParam フォームパラメータークラス
[20318]326     * @return mixed 表示用パラメーター
[16449]327     */
[23124]328    public function lfGetSqlData(&$objFormParam)
[22567]329    {
[20318]330        // 編集中データがある場合
[21684]331        if (!SC_Utils_Ex::isBlank($objFormParam->getValue('sql_name'))
332            || !SC_Utils_Ex::isBlank($objFormParam->getValue('csv_sql'))
333        ) {
[20318]334            return $objFormParam->getHashArray();
[16449]335        }
[21033]336        $sql_id = $objFormParam->getValue('sql_id');
[21441]337        if (!SC_Utils_Ex::isBlank($sql_id)) {
[21033]338            $arrData = $this->lfGetSqlList('sql_id = ?', array($sql_id));
[23124]339
[20318]340            return $arrData[0];
341        }
[22856]342
[20318]343        return array();
[16449]344    }
345
346    /**
[20318]347     * DBにデータを保存する.
[16449]348     *
[23124]349     * @param  integer $sql_id 出力するデータのSQL_ID
[20318]350     * @return void
[16449]351     */
[23124]352    public function lfDoCsvOutput($sql_id)
[22567]353    {
[20318]354        $arrData = $this->lfGetSqlList('sql_id = ?', array($sql_id));
[21515]355        $sql = 'SELECT ' . $arrData[0]['csv_sql'] . ' ';
[20318]356
357        // TODO: ヘッダ取得 SQL内にLIMIT文がある場合はLIMIT句は追加しないので重いかも
[20507]358        $objQuery =& SC_Query_Ex::getSingletonInstance();
[20318]359
360        $arrHeader = array();
[21514]361        if (!preg_match('/ LIMIT /', $sql)) {
362            $head_sql = $sql . ' LIMIT 0';
[21441]363        } else {
[20318]364            $head_sql = $sql;
[16449]365        }
[20318]366        $arrData = $objQuery->getQueryDefsFields($head_sql, array(), true);
[21441]367        if (!SC_Utils_Ex::isBlank($arrData)) {
368            foreach ($arrData as $key => $val) {
[20318]369                $arrHeader[] = $key;
370            }
371        }
372        $objCSV = new SC_Helper_CSV_Ex();
[20538]373        $objCSV->sfDownloadCsvFromSql($sql, array(), 'contents', $arrHeader, true);
[21743]374        SC_Response_Ex::actionExit();
[16449]375    }
376
377    /**
378     * DBにデータを保存する.
379     *
[23124]380     * @param  integer $sql_id    更新するデータのSQL_ID
381     * @param  array   $arrSqlVal 更新データの配列
[16449]382     * @return integer $sql_id SQL_IDを返す
383     */
[23124]384    public function lfUpdData($sql_id, $arrSqlVal)
[22567]385    {
[20507]386        $objQuery =& SC_Query_Ex::getSingletonInstance();
[21481]387        $table = 'dtb_csv_sql';
[21185]388        $arrSqlVal['update_date'] = 'CURRENT_TIMESTAMP';
[20318]389        if (SC_Utils_Ex::sfIsInt($sql_id)) {
390            //データ更新
[21514]391            $where = 'sql_id = ?';
[20318]392            $objQuery->update($table, $arrSqlVal, $where, array($sql_id));
[21441]393        } else {
[20318]394            //新規作成
395            $sql_id = $objQuery->nextVal('dtb_csv_sql_sql_id');
396            $arrSqlVal['sql_id'] = $sql_id;
[21185]397            $arrSqlVal['create_date'] = 'CURRENT_TIMESTAMP';
[20318]398            $objQuery->insert($table, $arrSqlVal);
[16449]399        }
[22856]400
[16449]401        return $sql_id;
402    }
403
404    /**
405     * 登録済みデータを削除する.
406     *
[23124]407     * @param  integer $sql_id 削除するデータのSQL_ID
[20318]408     * @return boolean 実行結果 true:成功
[16449]409     */
[23124]410    public function lfDelData($sql_id)
[22567]411    {
[20507]412        $objQuery =& SC_Query_Ex::getSingletonInstance();
[21481]413        $table = 'dtb_csv_sql';
[21514]414        $where = 'sql_id = ?';
[21441]415        if (SC_Utils_Ex::sfIsInt($sql_id)) {
[20318]416            $objQuery->delete($table, $where, array($sql_id));
[23124]417
[20318]418            return true;
[16449]419        }
[22856]420
[20318]421        return false;
422    }
[16449]423
[20318]424    /**
425     * SQL文に含めることを許可しないSQLキーワード
426     * 基本的にEC-CUBEのデータを取得するために必要なコマンドしか許可しない。複数クエリも不可
427     *
428     * FIXME: キーワードの精査。危険な部分なのでプログラム埋め込みで実装しました。mtb化の有無判断必要。
429     *
430     * @return array 不許可ワード配列
431     */
[23124]432    public function lfGetSqlDenyList()
[22567]433    {
[20318]434        $arrList = array(';'
435            ,'CREATE\s'
436            ,'INSERT\s'
437            ,'UPDATE\s'
438            ,'DELETE\s'
439            ,'ALTER\s'
440            ,'ABORT\s'
441            ,'ANALYZE\s'
442            ,'CLUSTER\s'
443            ,'COMMENT\s'
444            ,'COPY\s'
445            ,'DECLARE\s'
446            ,'DISCARD\s'
447            ,'DO\s'
448            ,'DROP\s'
449            ,'EXECUTE\s'
450            ,'EXPLAIN\s'
451            ,'GRANT\s'
452            ,'LISTEN\s'
453            ,'LOAD\s'
454            ,'LOCK\s'
455            ,'NOTIFY\s'
456            ,'PREPARE\s'
457            ,'REASSIGN\s'
458//            ,'REINDEX\s'      // REINDEXは許可で良いかなと
459            ,'RELEASE\sSAVEPOINT'
460            ,'RENAME\s'
461            ,'REST\s'
462            ,'REVOKE\s'
463            ,'SAVEPOINT\s'
464            ,'SET\s'
465            ,'SHOW\s'
466            ,'START\sTRANSACTION'
467            ,'TRUNCATE\s'
468            ,'UNLISTEN\s'
469            ,'VACCUM\s'
470            ,'HANDLER\s'
471            ,'LOAD\sDATA\s'
472            ,'LOAD\sXML\s'
473            ,'REPLACE\s'
474            ,'OPTIMIZE\s'
475            ,'REPAIR\s'
476            ,'INSTALL\sPLUGIN\s'
477            ,'UNINSTALL\sPLUGIN\s'
478            ,'BINLOG\s'
479            ,'KILL\s'
480            ,'RESET\s'
481            ,'PURGE\s'
482            ,'CHANGE\sMASTER'
483            ,'START\sSLAVE'
484            ,'STOP\sSLAVE'
485            ,'MASTER\sPOS\sWAIT'
486            ,'SIGNAL\s'
487            ,'RESIGNAL\s'
488            ,'RETURN\s'
489            ,'USE\s'
490            ,'HELP\s'
491            );
[22856]492
[20318]493        return $arrList;
[16449]494    }
495}
Note: See TracBrowser for help on using the repository browser.