為什麼選 phplib DB 類?
- PHP 3 時代經典,實現了早期 PHP 缺失的 Session 功能
- 文件極小、加載極快、語法貼近原生
mysql_*
- 大量存量項目仍在使用,維護技能有價值
新增文件
comm/db_mysql.inc.php:phplib 數據庫類(原 .inc 改 .inc.php 防直接訪問洩露)
comm/csub.inc.php:中文截取函數 csubstr()
DB_Sql 類核心 API
| 成員 | 類型 | 說明 |
$Host | 屬性 | 數據庫主機 |
$Database | 屬性 | 數據庫名 |
$User | 屬性 | 用戶名 |
$Password | 屬性 | 密碼 |
connect() | 方法 | 建立連接,返回連接 ID |
query($sql) | 方法 | 執行查詢,返回查詢 ID |
next_record() | 方法 | 移動到下一行,返回布爾值 |
f($field) | 方法 | 獲取當前行字段值 |
num_rows() | 方法 | 結果集行數 |
free() | 方法 | 釋放結果集資源 |
改造後的 index.php 關鍵邏輯
<?php
include_once("./comm/Smarty.class.php");
include_once("./comm/db_mysql.inc.php");
$smarty = new Smarty();
// ... Smarty 配置同前 ...
// 數據庫連接
$db = new DB_Sql();
$db->Host = "localhost";
$db->Database = "News";
$db->User = "root";
$db->Password = "";
$db->connect();
$categories = array('ch'=>'國內新聞', 'in'=>'國際新聞', 'mu'=>'娛樂新聞');
foreach ($categories as $key => $title) {
$db->query("SELECT iNewsID, vcNewsTitle FROM tb_news_$key ORDER BY iNewsID DESC LIMIT 5");
$list = array();
while ($db->next_record()) {
$list[] = array(
'iNewsID' => $db->f('iNewsID'),
'vcNewsTitle' => $db->f('vcNewsTitle')
);
}
$smarty->assign("news_$key", $list);
$smarty->assign("title_$key", $title);
}
$smarty->display("index.tpl");
?>
中文截取函數 csubstr()
function csubstr($string, $start, $length) {
// 實現按字符(非字節)截取中文字符串
// 避免 substr 截半個漢字產生亂碼
// ... 具體實現略 ...
}
對比總結
| 維度 | 原生 mysql_* | phplib DB_Sql |
| 代碼風格 | 過程式 | 面向對象封裝 |
| 資源管理 | 手動 | 封裝 free() |
| 中文處理 | 需自行處理 | 配合 csubstr() |
| 適用場景 | 教學/極簡項目 | 存量項目維護/輕量框架 |
phplib DB 類為過渡期產物,新項目請直接使用 PDO/MySQLi。