class MySQL {
private $host, $user, $pwd, $db, $charset;
private $conn, $result, $sql;
private $bulletin = true; // 錯誤寫入日誌
private $show_error = true; // 畫面顯示錯誤
private $is_error = false; // 錯誤是否中止
public function __construct($host,$user,$pwd,$db,$charset='utf8') { ... }
public function connect() { ... } // 支援 pconnect
public function query($sql) { ... }
// CRUD 簡化
public function select($table,$cols,$cond) { ... }
public function insert($table,$cols,$vals) { ... }
public function update($table,$set,$cond) { ... }
public function delete($table,$cond) { ... }
// 結果集取得
public function fetch_array() { return mysql_fetch_array($this->result); }
public function fetch_assoc() { return mysql_fetch_assoc($this->result); }
public function fetch_row() { return mysql_fetch_row($this->result); }
public function fetch_object() { return mysql_fetch_object($this->result); }
// 工具
public function insert_id() { return mysql_insert_id(); }
public function affected_rows() { return mysql_affected_rows(); }
public function num_rows() { return mysql_num_rows($this->result); }
public function free() { mysql_free_result($this->result); }
public function __destruct() { $this->free(); mysql_close($this->conn); }
}
show_error() 將 SQL、錯誤訊息、客戶 IP、時間寫入 error/YYYY-MM-DD.txt,支援目錄自動建立、檔案鎖定寫入。SET NAMES $charset。$conn='pconn' 切換 mysql_pconnect。$db = new MySQL('localhost','root','pass','mydb');
$db->select('users','*',"status=1");
while ($row = $db->fetch_assoc()) {
echo $row['username'] . "\n";
}
$db->insert('logs', 'msg,time', "'login', NOW()");
echo "新增 ID: " . $db->insert_id();
mysql_* 函數已於 PHP 7.0 移除。新專案請直接使用 mysqli 或 PDO。遷移重點:
mysql_connect → new mysqli(...) 或 new PDO(...)。prepare/bind/execute。get_result() + fetch_assoc() (mysqli) 或 fetch() (PDO)。MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT 或 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION。此類展示了經典「資料庫存取層」封裝模式:連線管理、CRUD 封裝、錯誤觀測、資源生命週期。雖底層 API 已淘汰,但架構思想仍具參考價值,可直接移植至 PDO/Mysqli 實作中。