這個 mysql 類別封裝了連線管理、查詢執行、資料抓取、寫入操作、表結構檢查等核心功能,並內建SQL 關鍵字過濾與XSS 防護,適合中小型專案快速開發。
function __construct($hostname, $username, $userpwd, $database, $pconnect=false, $charset='utf8') { $this->pconnect = $pconnect; $this->dblink = $pconnect ? mysql_pconnect($hostname, $username, $userpwd) : mysql_connect($hostname, $username, $userpwd); if (!$this->dblink) fatal_error("資料庫連線失敗!"); mysql_unbuffered_query("SET NAMES {$charset}"); if ($this->version() > '5.0.1') { mysql_unbuffered_query("SET SQL_MODE = ''"); } mysql_select_db($database) or fatal_error("無法選擇資料庫!"); }
類別屬性定義了危險模式替換規則:
private $search = array( '/union\s*(/\*.*\*/)?\s*select/i', '/load_file\s*(/\*.*\*/)?\s*\(/i', '/into\s*(/\*.*\*/)?\s*outfile/i' ); private $replace = array( 'union select', 'load_file (', 'into outfile' );
⚠️ 注意:此為正則替換式過濾,屬「黑名單機制」,無法防禦所有變形攻擊。生產環境強烈建議改用 PDO 預處理語句。
function query($sql, $unbuffered=false) { $this->rs = $unbuffered ? mysql_unbuffered_query($sql, $this->dblink) : mysql_query($sql, $this->dblink); if (!$this->rs) fatal_error("SQL 執行錯誤: " . mysql_error()); return $this->rs; } function fetch_all($sql) { $this->query($sql); $result = array(); while ($rows = mysql_fetch_array($this->rs, MYSQL_ASSOC)) { $result[] = $rows; } mysql_free_result($this->rs); return $this->filter_pass($result); // 經過 XSS 過濾 }
function insert($tbname, $varray, $replace=false) { $varray = $this->escape($varray); // 內建 real_escape_string + 關鍵字過濾 $tb_fields = $this->get_fields($tbname); // 獲取真實欄位列表 foreach ($varray as $key => $value) { if (in_array($key, $tb_fields)) { // 僅允許存在的欄位 $fields[] = "`{$key}`"; $values[] = is_string($value) ? "'{$value}'" : $value; } } // 組裝並執行 SQL... }
get_fields($table):獲取指定表所有欄位名get_table_status($database):獲取資料庫所有表狀態(大小、引擎、行數等)get_tables():列出所有表名create_model_table() / create_table():快速建立內容/會員模型表create_fields():動態新增欄位filter_pass()支援白名單標籤(allowed_htmltags)與事件屬性黑名單(onload、onclick 等 100+ 危險屬性),對陣列遞迴處理,適合富文本內容淨化。
PHP 7.0+ 已移除 mysql_* 擴展。建議重構為 PDO 版本:
class Database { private $pdo; public function __construct($dsn, $user, $pass) { $this->pdo = new PDO($dsn, $user, $pass, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false // 真實預處理 ]); } public function query($sql, $params = []) { $stmt = $this->pdo->prepare($sql); $stmt->execute($params); return $stmt; } // 其餘方法改用 $stmt->fetchAll() 等... }