本文整理一款輕量級 MySQL 操作類,源自 Discuz! 核心資料庫層簡化版,支援持久連線、字元集自動設定、SQL 錯誤攔截、查詢計數、Unbuffered 查詢等實用功能,適合中小型專案快速整合。
<?php
/**
* dbQuery - 精簡版 MySQL 操作類
* 參考 Discuz! 核心 DB 層簡化
*/
class dbQuery {
public $querynum = 0;
public $link = null;
/**
* 連線資料庫
* @param string $dbhost 主機
* @param string $dbuser 用戶
* @param string $dbpw 密碼
* @param string $dbname 資料庫
* @param int $pconnect 是否持久連線
*/
public function connect($dbhost, $dbuser, $dbpw, $dbname = '', $pconnect = 0) {
$func = $pconnect ? 'mysql_pconnect' : 'mysql_connect';
if (!($this->link = @$func($dbhost, $dbuser, $dbpw))) {
$this->halt('Can not connect to MySQL server');
}
// MySQL 4.1+ 字元集設定
if ($this->version() > '4.1') {
global $dbcharset;
if ($dbcharset) {
mysql_query("SET character_set_connection=$dbcharset, character_set_results=$dbcharset, character_set_client=binary", $this->link);
mysql_query("SET NAMES '$dbcharset'", $this->link);
}
// MySQL 5.0.1+ sql_mode
if ($this->version() > '5.0.1') {
mysql_query("SET sql_mode=''", $this->link);
}
}
if ($dbname) {
mysql_select_db($dbname, $this->link);
}
}
public function select_db($dbname) {
return mysql_select_db($dbname, $this->link);
}
public function fetch_array($query, $result_type = MYSQL_ASSOC) {
return mysql_fetch_array($query, $result_type);
}
/**
* 執行 SQL 查詢
* @param string $sql
* @param string $type 'UNBUFFERED'|'SILENT'|''
* @return resource|false
*/
public function query($sql, $type = '') {
$func = ($type == 'UNBUFFERED' && function_exists('mysql_unbuffered_query'))
? 'mysql_unbuffered_query' : 'mysql_query';
if (!($query = $func($sql, $this->link)) && $type != 'SILENT') {
$this->halt('MySQL Query Error', $sql);
}
$this->querynum++;
return $query;
}
public function affected_rows() { return mysql_affected_rows($this->link); }
public function error() { return $this->link ? mysql_error($this->link) : mysql_error(); }
public function errno() { return intval($this->link ? mysql_errno($this->link) : mysql_errno()); }
public function result($query, $row) { return @mysql_result($query, $row); }
public function num_rows($query) { return mysql_num_rows($query); }
public function num_fields($query) { return mysql_num_fields($query); }
public function free_result($query) { return mysql_free_result($query); }
public function insert_id() {
$id = mysql_insert_id($this->link);
return $id >= 0 ? $id : $this->result($this->query("SELECT LAST_INSERT_ID()"), 0);
}
public function fetch_row($query) { return mysql_fetch_row($query); }
public function fetch_fields($query) { return mysql_fetch_field($query); }
public function version() { return mysql_get_server_info($this->link); }
public function close() { return mysql_close($this->link); }
/**
* 錯誤中斷輸出
*/
public function halt($message = '', $sql = '') {
echo $message . ' ' . $sql;
exit;
}
}
?>
<?php
require_once 'dbQuery.class.php';
$db = new dbQuery();
$db->connect('localhost', 'root', 'password', 'mydb', 0); // 0=非持久
// 查詢
$sql = "SELECT uid, username, email FROM members WHERE status=1 LIMIT 10";
$query = $db->query($sql);
while ($row = $db->fetch_array($query)) {
echo "{$row['username']} <{$row['email']}>
";
}
$db->free_result($query);
// 寫入
$ins = "INSERT INTO logs (action, uid, dateline) VALUES ('login', 1001, " . time() . ")";
$db->query($ins);
echo "新增 ID: " . $db->insert_id();
// 統計
echo "本頁查詢次數: " . $db->querynum;
$db->close();
?>
| 特性 | 說明 |
|---|---|
| 自動字元集 | 偵測 MySQL ≥ 4.1 自動送出 SET NAMES,解決中文亂碼 |
| sql_mode 清空 | MySQL ≥ 5.0.1 自動關閉嚴格模式,相容舊 SQL 寫法 |
| Unbuffered 查詢 | 大量資料匯出時設 UNBUFFERED 減少記憶體佔用 |
| SILENT 模式 | 不中斷執行,自行檢查 errno()/error() |
| 查詢計數 | $db->querynum 可用於效能監控與除錯 |
PHP 7.0+ 已移除 `mysql_*` 擴充套件。新專案請改用:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=mydb;charset=utf8mb4', 'root', 'password', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]);
// 查詢
$stmt = $pdo->query("SELECT * FROM members WHERE status=1 LIMIT 10");
foreach ($stmt as $row) { /* ... */ }
// 預處理寫入
$stmt = $pdo->prepare("INSERT INTO logs (action, uid, dateline) VALUES (?, ?, ?)");
$stmt->execute(['login', 1001, time()]);
echo "新增 ID: " . $pdo->lastInsertId();
?>
此類別適合維護 PHP 5.x 舊專案;現代開發請直接採用 PDO 或 mysqli,享受預處理語句、異常處理、多資料庫支援等現代特性。