diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml
index eea9090ba0..8b1e40cdbb 100644
--- a/.github/workflows/e2e-tests.yml
+++ b/.github/workflows/e2e-tests.yml
@@ -108,6 +108,11 @@ jobs:
FORCE_COLOR: 1
run: yarn ${PATTERN} e2e-tests/${GROUP}
+ - name: Print error log
+ if: always()
+ continue-on-error: true
+ run: docker compose exec ec-cube tail -n 100 data/logs/error.log
+
- name: Upload evidence
if: failure()
uses: actions/upload-artifact@v4
diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml
index 09a8bcea83..ce77157935 100644
--- a/.github/workflows/unit-tests.yml
+++ b/.github/workflows/unit-tests.yml
@@ -80,6 +80,11 @@ jobs:
- name: Run to PHPUnit SessionFactory
run: docker compose exec -T ec-cube php data/vendor/bin/phpunit tests/class/SC_SessionFactoryTest.php
+ - name: Print error log
+ if: always()
+ continue-on-error: true
+ run: docker compose exec ec-cube tail -n 100 data/logs/error.log
+
- name: Upload logs
if: failure()
uses: actions/upload-artifact@v4
diff --git a/data/Smarty/templates/admin/system/subnavi.tpl b/data/Smarty/templates/admin/system/subnavi.tpl
index 6f0f59b5e9..19a9982e61 100644
--- a/data/Smarty/templates/admin/system/subnavi.tpl
+++ b/data/Smarty/templates/admin/system/subnavi.tpl
@@ -30,5 +30,4 @@
class="on" id="navi-system-adminarea">管理画面設定
class="on" id="navi-system-system">システム情報
class="on" id="navi-system-log">EC-CUBE ログ表示
- class="on" id="navi-system-editdb">高度なデータベース管理
diff --git a/data/class/SC_View.php b/data/class/SC_View.php
index bab1244bc6..27cc188dd6 100644
--- a/data/class/SC_View.php
+++ b/data/class/SC_View.php
@@ -40,7 +40,6 @@ public function __construct()
public function init()
{
- // include_phpの利用のためSmartyBCを呼び出す、ホントはinclude_phpをなくしたいそうすれば、blank.tplもなくせる
$this->_smarty = new \Smarty\Smarty();
$this->_smarty->setLeftDelimiter('');
@@ -74,6 +73,7 @@ public function init()
$this->_smarty->registerPlugin('function', 'sfIsHTTPS', ['SC_Utils_Ex', 'sfIsHTTPS']);
$this->_smarty->registerPlugin('function', 'sfSetErrorStyle', ['SC_Utils_Ex', 'sfSetErrorStyle']);
$this->_smarty->registerPlugin('function', 'printXMLDeclaration', ['GC_Utils_Ex', 'printXMLDeclaration']);
+ $this->_smarty->muteUndefinedOrNullWarnings();
$this->_smarty->default_modifiers = ['script_escape'];
if (ADMIN_MODE == '1') {
diff --git a/data/class/pages/admin/system/LC_Page_Admin_System_Editdb.php b/data/class/pages/admin/system/LC_Page_Admin_System_Editdb.php
deleted file mode 100644
index 50de0ba67b..0000000000
--- a/data/class/pages/admin/system/LC_Page_Admin_System_Editdb.php
+++ /dev/null
@@ -1,212 +0,0 @@
-tpl_mainpage = 'system/editdb.tpl';
- $this->tpl_subno = 'editdb';
- $this->tpl_mainno = 'system';
- $this->tpl_maintitle = 'システム設定';
- $this->tpl_subtitle = '高度なデータベース管理';
- }
-
- /**
- * Page のプロセス.
- *
- * @return void
- */
- public function process()
- {
- $this->action();
- $this->sendResponse();
- }
-
- /**
- * Page のアクション.
- *
- * @return void
- */
- public function action()
- {
- $objFormParam = new SC_FormParam_Ex();
-
- // パラメーターの初期化
- $this->initForm($objFormParam, $_POST);
-
- switch ($this->getMode()) {
- case 'confirm' :
- $message = $this->lfDoChange($objFormParam);
- if (!is_array($message) && $message != '') {
- $this->tpl_onload = $message;
- }
- break;
- default:
- break;
- }
-
- // インデックスの現在値を取得
- $this->arrForm = $this->lfGetIndexList();
- }
-
- /**
- * フォームパラメーター初期化
- *
- * @param SC_FormParam_Ex $objFormParam
- * @param array $arrParams $_POST値
- *
- * @return void
- */
- public function initForm(&$objFormParam, &$arrParams)
- {
- $objFormParam->addParam('モード', 'mode', INT_LEN, 'n', ['ALPHA_CHECK', 'MAX_LENGTH_CHECK']);
- $objFormParam->addParam('テーブル名', 'table_name');
- $objFormParam->addParam('カラム名', 'column_name');
- $objFormParam->addParam('インデックス', 'indexflag');
- $objFormParam->addParam('インデックス(変更後)', 'indexflag_new');
- $objFormParam->setParam($arrParams);
- }
-
- /**
- * @param SC_FormParam_Ex $objFormParam
- */
- public function lfDoChange(&$objFormParam)
- {
- $objQuery = SC_Query_Ex::getSingletonInstance();
- $arrTarget = $this->lfGetTargetData($objFormParam);
- $message = '';
- if (is_array($arrTarget) && count($arrTarget) == 0) {
- $message = "window.alert('変更対象となるデータはありませんでした。');";
-
- return $message;
- } elseif (!is_array($arrTarget) && $arrTarget != '') {
- return $arrTarget; // window.alert が返ってきているはず。
- }
-
- // 変更対象の設定変更
- foreach ($arrTarget as $item) {
- $index_name = $item['table_name'].'_'.$item['column_name'].'_key';
- $arrField = ['fields' => [$item['column_name'] => []]];
- if ($item['indexflag_new'] == '1') {
- $objQuery->createIndex($item['table_name'], $index_name, $arrField);
- } else {
- $objQuery->dropIndex($item['table_name'], $index_name);
- }
- }
- $message = "window.alert('インデックスの変更が完了しました。');";
-
- return $message;
- }
-
- /**
- * @param SC_FormParam_Ex $objFormParam
- */
- public function lfGetTargetData(&$objFormParam)
- {
- $objQuery = SC_Query_Ex::getSingletonInstance();
- $arrIndexFlag = $objFormParam->getValue('indexflag');
- $arrIndexFlagNew = $objFormParam->getValue('indexflag_new');
- $arrTableName = $objFormParam->getValue('table_name');
- $arrColumnName = $objFormParam->getValue('column_name');
- $arrTarget = [];
- $message = '';
-
- // 変更されている対象を走査
- for ($i = 1; $i <= count($arrIndexFlag); $i++) {
- // 入力値チェック
- $param = [
- 'indexflag' => $arrIndexFlag[$i],
- 'indexflag_new' => $arrIndexFlagNew[$i],
- 'table_name' => $arrTableName[$i],
- 'column_name' => $arrColumnName[$i],
- ];
- $objErr = new SC_CheckError_Ex($param);
- $objErr->doFunc(['インデックス('.$i.')', 'indexflag', INT_LEN], ['NUM_CHECK']);
- $objErr->doFunc(['インデックス変更後('.$i.')', 'indexflag_new', INT_LEN], ['NUM_CHECK']);
- $objErr->doFunc(['インデックス変更後('.$i.')', 'indexflag_new', INT_LEN], ['NUM_CHECK']);
- $objErr->doFunc(['テーブル名('.$i.')', 'table_name', STEXT_LEN], ['GRAPH_CHECK', 'EXIST_CHECK', 'MAX_LENGTH_CHECK']);
- $objErr->doFunc(['カラム名('.$i.')', 'column_name', STEXT_LEN], ['GRAPH_CHECK', 'EXIST_CHECK', 'MAX_LENGTH_CHECK']);
- $arrErr = $objErr->arrErr;
- if (count($arrErr) != 0) {
- // 通常の送信ではエラーにならないはずです。
- $message = "window.alert('不正なデータがあったため処理を中断しました。');";
-
- return $message;
- }
- if ($param['indexflag'] != $param['indexflag_new']) {
- // 入力値がデータにある対象テーブルかのチェック
- if ($objQuery->exists('dtb_index_list', 'table_name = ? and column_name = ?', [$param['table_name'], $param['column_name']])) {
- $arrTarget[] = $param;
- }
- }
- }
-
- return $arrTarget;
- }
-
- /**
- * インデックス設定を行う一覧を返す関数
- *
- * @return array
- */
- public function lfGetIndexList()
- {
- // データベースからインデックス設定一覧を取得する
- $objQuery = SC_Query_Ex::getSingletonInstance();
- $objQuery->setOrder('table_name, column_name');
- $arrIndexList = $objQuery->select('table_name , column_name , recommend_flg, recommend_comment', 'dtb_index_list');
-
- $table = '';
- $arrIndexes = [];
- foreach ($arrIndexList as $key => $arrIndex) {
- // テーブルに対するインデックス一覧を取得
- if ($table !== $arrIndex['table_name']) {
- $table = $arrIndex['table_name'];
- $arrIndexes = $objQuery->listTableIndexes($table);
- }
- // インデックスが設定されているかを取得
- $idx_name = $table.'_'.$arrIndex['column_name'].'_key';
- if (is_array($arrIndexes) && array_search($idx_name, $arrIndexes) === false) {
- $arrIndexList[$key]['indexflag'] = '';
- } else {
- $arrIndexList[$key]['indexflag'] = '1';
- }
- }
-
- return $arrIndexList;
- }
-}
diff --git a/html/admin/system/editdb.php b/html/admin/system/editdb.php
deleted file mode 100644
index 0aea5a39b1..0000000000
--- a/html/admin/system/editdb.php
+++ /dev/null
@@ -1,28 +0,0 @@
-init();
-$objPage->process();