<{includeq
不再支援改為<{include
<{includeq
<{include
<{xoAdminIcons
後面的檔案需加上引號
<{xoAdminIcons home.png}>
<{xoAdminIcons 'home.png'}>
<{php}><{/php}>
的用法不再支援,需改寫之
<{php}>
<{block
不再支援,改為<{xoBlock
<{block
<{xoBlock
<{xoAppUrl 'xxx.php'}>
及<{xoImgUrl 'xxx.png'}>
要加上引號,或改回 <{$xoops_url}>/xxx.php
、 <{$xoops_imageurl}>/xxx.png
更好,可跨檔取代(用正則表達式(Regular Expression)模式)比較快
<\{xoAppUrl ([^}]*)\}>
<{$xoops_url}>/$1
<\{xoImgUrl ([^}]*)\}>
<{$xoops_imageurl}>/$1
<{assign}>
的變數和值,若是字串,都要加引號,可跨檔取代值的部份(用正則表達式(Regular Expression)模式)比較快:
<\{assign var=([^ ]+) value=([^"$'\[\]truefalsenull0-9 ][^ ]*)\}>
<{assign var=$1 value="$2"}>
<\{assign var=([^"' ]+) value=([^ ]+)\}>
<{assign var="$1" value=$2}>
<\{if\s+\$([a-zA-Z_][a-zA-Z0-9_]*)\}>
<{if $$$1|default:false}>
<\{if\s+(\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(?:\.[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)*)\}>
<{if $1|default:false}>
<\{assign\s+var="([a-zA-Z_][a-zA-Z0-9_]*)"\s+value=\$([a-zA-Z_][a-zA-Z0-9_]*)\}>
<{assign var="$1" value=$$$2|default:''}>
<\{(\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}>
<{$1|default:''}>
<{foreach}>
的from和item的值(變數名稱)不可相同,找到請修改之,可跨檔取代值的部份(用正則表達式(Regular Expression)模式)比較快:
<\{foreach\s+(?:(?:item=([\w]+)\s+from=\$\1)|(?:from=\$(\w+)(?:\s+key=\w+)?\s+item=\2))
$modversion['version'] = $_SESSION['xoops_version'] >= 20511 ? '5.0.0-Stable' : '5.0';
<?php
use XoopsModules\Tadtools\Utility;
$xoops_version = Utility::get_version('xoops');
$modversion['version'] = $xoops_version >= 20511 ? '2.0.0-Stable' : '2.0';
// Define Stylesheet and JScript
$xoTheme->addStylesheet(XOOPS_URL . '/modules/tadtools/css/iconize.css');
$xoTheme->addStylesheet(XOOPS_URL . '/modules/tadtools/css/font-awesome/css/font-awesome.css');
$xoTheme->addStylesheet(XOOPS_URL . "/modules/tadtools/css/xoops_adm{$_SESSION['bootstrap']}.css");
$xoTheme->addStylesheet(XOOPS_URL . '/modules/' . $xoopsModule->getVar('dirname') . '/css/module.css');
$xoTheme->addStylesheet(XOOPS_URL . '/modules/' . $xoopsModule->getVar('dirname') . '/css/admin.css');
// echo '<div align="center"><a href="https://xoops.org" target="_blank"><img src="../images/admin/xoopsmicrobutton.gif" alt="XOOPS" title="XOOPS"></a></div>';
// echo "<div class='center smallsmall italic pad5'><strong>" . $xoopsModule->getVar('name') . "</strong> is maintained by the <a class='tooltip' rel='external' href='https://xoops.org/' title='Visit XOOPS Community'>XOOPS Community</a></div>";
xoops_cp_footer();
$myts->addSlashes(
$xoopsDB->escape(
Utility::query($sql, $types = '', array $params = array(), $throwExceptions = true, $debug = true)
的物件,可以用參數化的方式來執行資料庫,更為安全。使用此方法,請勿過濾變數(例如:用 $xoopsDB->escape()
或$myts->addSlashes()
來過濾變數)。範例:
$sql = 'SELECT * FROM `' . $xoopsDB->prefix('tad_faq_cate') . '` WHERE `fcsn`=? AND `enable`=?';
$result = Utility::query($sql, 'ii', [$fcsn, $enable]) or Utility::web_error($sql, __FILE__, __LINE__);
$data = $xoopsDB->fetchArray($result);
$sql
是prepare語句,參數部份用 ?
取代,不要有引號
$types
是參數格式類型,數字為 i
,字串為 s
,浮點數為 d
,二進位資料為 b
$params
是參數,陣列格式。$sql 有幾個 ?
就要對應幾個變數。
若想移除事先的過濾變數,可跨檔取代(用正則表達式(Regular Expression)模式)比較快
(\$\w+)\s*=\s*\$xoopsDB->escape\((.*?)\);
$1 = $2;
可以用AI協助處理(比較省事),亦可至這裡來處理: XOOPS 資料庫語法參數化 AI 工具:
你是一個PHP開發者,要修改MySQL資料庫 SQL 語句,以下是具體的需求:
原始的 SQL 語句範例如下:
$sql = "select count(*) from " . $xoopsDB->prefix("priv_msgs") . " where to_userid ='$uid' and enable=1 and read_msg='{$msg}' group by `to_userid`";
$result = $xoopsDB->queryF($sql) or Utility::web_error($sql, __FILE__, __LINE__);;
需根據以下條件進行修改:
1.將 $xoopsDB->query() 或 $xoopsDB->queryF() 方法一律修改為 Utility::query()。
2.將 SQL 語句中的變數的部份(如 $uid、$msg)改為參數化查詢(用?佔位符取代變數),並使用 Utility::query() 來傳入1或3個參數:
(1)第一個參數是 SQL 語句。(必要)
(2)第二個參數是變數類型格式字串,需根據第三個參數中的陣列元素,其值的型態字串用 s,整數用 i 來組成字串。(有用?佔位符取代變數時才需要此參數)
(3)第三個參數是一個包含變數值的陣列,依序對應到 SQL 語句中的 ? 佔位符。(有用?佔位符取代變數時才需要此參數)
3.資料庫欄位名稱與資料表名稱,加上反引號(`)以避免保留字問題。
4.在 SQL 語句中,用 ? 替換原本的變數值,並移除該變數值的引號。
5.使用? 佔位符後,若SQL語句中已經沒有單引號,則將雙引號改為單引號,以統一 SQL 語句的引號風格。
6.貼上來的程式語法若有 $result = 這部分,不要遺漏 $result = 這部分,若沒有,也別自行加上去
7.將 SQL 指令(如 SELECT, WHERE, GROUP BY 等)變為大寫。
最終結果應該如以下範例所示:
$sql = 'SELECT COUNT(*) FROM `' . $xoopsDB->prefix('priv_msgs') . '` WHERE `to_userid` =? AND `enable`=1 AND `read_msg`=? GROUP BY `to_userid`';
$result = Utility::query($sql, 'is', [$uid, $msg]) or Utility::web_error($sql, __FILE__, __LINE__);;
之後所有貼上來的程式語法,請都依據此規則進行修改,並直接顯示修改後結果即可,不需要加上任何說明。
Wcag::amend()
的物件方法來進行無障礙調整
use XoopsModules\Tadtools\Wcag;
$description = Wcag::amend($_POST['description']);
有些沒有套用樣板的檔案(例如用來做ajax處理的檔案),在開除錯時,該區域也會出現除錯訊息,可以在檔案中加入以下兩行強制關閉之。
error_reporting(0);
$xoopsLogger->activated = false;
@count
<{if $columns}><{$columns|@count}><{/if}>
請簡化PHP寫法,程式碼越少越好,簡化時,一律從0開始即可,亦即不需要顯示索引值,直接顯示簡化後結果,無須額外說明。
<?php
require_once dirname(dirname(__DIR__)) . '/mainfile.php';
require_once __DIR__ . '/function.php';
require_once __DIR__ . '/interface.php';
<?php
//判斷是否對該模組有管理權限
if (!isset($_SESSION['tad_blocks_adm'])) {
$_SESSION['tad_blocks_adm'] = ($xoopsUser) ? $xoopsUser->isAdmin() : false;
}
$interface_menu[_MD_TAD_BLOCKS_MY_BLOCKS] = "index.php";
$interface_icon[_MD_TAD_BLOCKS_MY_BLOCKS] = "fa-cube";
if ($_SESSION['tad_blocks_adm'] or $_SERVER['PHP_SELF'] == '/admin.php') {
$interface_menu[_MD_TADBLOCKS_BLOCKS] = "blocks.php";
$interface_icon[_MD_TADBLOCKS_BLOCKS] = "fa-cubes";
}
有interface.php或interface_menu.php,後台才能正確列出前台路徑,網路地圖也才能正確擷取。
or $_SERVER['PHP_SELF'] == '/admin.php'
,以便讓後台也可以讀取