在聊天室專案中,func.php 集中了多個實用的輔助函式,涵蓋隨機數產生、字串搜尋計數、字串重複、特殊字元轉義與 HTML 標籤過濾。本文逐一解析這些函式的實作細節與潛在問題。
suiji()函式接受最大值 $max,利用 microtime() 做種子,呼叫 rand() 產生隨機數,再按比例縮放至 0 ~ $max-1 區間,最後以 round() 四捨五入回傳整數。
function suiji($max) {
srand((double)microtime() * 1000000);
$x = rand();
$y = getrandmax();
$r = $x / $y * ($max - 1);
$r = round($r++);
return $r;
}
注意: PHP 4.2 版後已自動播種,srand() 不再必要;且 $r++ 在 round() 之後執行,回傳值實為四捨五入前的值,邏輯有誤,建議改用 mt_rand(0, $max-1)。
StrOccurs()意圖計算 $sFind 在 $sStr 中出現的次數,但實作邏輯錯誤:while(true) 迴圈內若找到子字串即 break,否則嘗試用 instr()(PHP 無此函式,應為 substr())切割字串並遞增計數,導致永遠只會回傳 0 或陷入無限迴圈。正確寫法應使用 substr_count() 或迴圈搭配 strpos()。
StrDupl()簡單實作:將 $sStr 重複 $iCnt 次並串接回傳。可直接使用內建 str_repeat() 取代。
DelQuot()將 |(chr(124))、單引號(chr(39))、雙引號(chr(34))分別替換為 HTML 實體 ¦、´、"。但回傳變數寫成 return s; 缺少 $ 符號,會導致錯誤。此外,´ 非標準單引號實體,建議統一用 ' 或 '。
DelTag()嘗試檢測字串是否包含 <TABLE>、<SCRIPT>、<BODY> 等標籤(不分大小寫),但邏輯混亂:$bNeed 初始為 "False",後續判斷條件 $bNeed != "True" || !strstr(...) 恆為真,導致 $bNeed 永遠被設為 "True",且函式缺少回傳值。若需過濾 HTML 標籤,建議使用 strip_tags() 或 htmlspecialchars()。
mt_rand、substr_count、str_repeat、htmlspecialchars、strip_tags)。$、不存在的函式 instr)。這些早期 PHP 專案常見的「自寫工具函式」雖具學習價值,但在現代開發中應優先採用標準庫與成熟套件,確保安全與效能。