OCI8 是 PHP 連接 Oracle 資料庫的標準擴展。本文展示一個完整的資料庫操作封裝類,涵蓋連接管理、查詢執行、結果集獲取、錯誤處理與資源釋放等核心功能。
<?php
class Oracle_db {
public $link;
public function __construct() {
$this->link = $this->connect();
if (!$this->link) {
die("Oracle 連接失敗: " . $this->error());
}
}
// 建立連接
public function connect() {
// oci_connect(使用者, 密碼, 連接字串, 字元集)
return oci_connect('demo', 'demo', 'localhost/xe', 'AL32UTF8');
}
// 執行 SQL 陳述式
public function execute($sql) {
$stid = oci_parse($this->link, $sql);
if (!$stid) {
return array(false, false);
}
$result = oci_execute($stid);
return array($stid, $result);
}
// 取得單行關聯陣列
public function fetch_assoc($stid) {
return oci_fetch_assoc($stid);
}
// 取得單筆記錄並釋放語句
public function fetch_one($stid) {
$arr = $this->fetch_assoc($stid);
$this->free($stid);
return $arr;
}
// 取得所有記錄並釋放語句
public function fetch_all($stid) {
$arr = array();
while ($row = $this->fetch_assoc($stid)) {
$arr[] = $row;
}
$this->free($stid);
return $arr;
}
// 取得影響列數
public function num_rows($stmt) {
return oci_num_rows($stmt);
}
// 取得錯誤資訊
public function error() {
return oci_error($this->link);
}
// 釋放語句資源
public function free($stid) {
return oci_free_statement($stid);
}
// 伺服器版本
public function server_version() {
return oci_server_version($this->link);
}
// 客戶端版本
public function client_version() {
return oci_client_version();
}
// 解構時關閉連接
public function __destruct() {
if ($this->link) {
oci_close($this->link);
}
}
}
?>
<?php
require_once 'Oracle_db.class.php';
$db = new Oracle_db();
// 查詢範例
list($stid, $success) = $db->execute("SELECT * FROM users WHERE status = 1");
if ($success) {
$users = $db->fetch_all($stid);
foreach ($users as $user) {
echo "ID: {$user['ID']}, Name: {$user['NAME']}<br>";
}
} else {
echo "查詢失敗: " . $db->error();
}
// 插入範例
list($stid, $success) = $db->execute(
"INSERT INTO logs (msg, created_at) VALUES ('測試訊息', SYSDATE)"
);
if ($success) {
echo "新增成功,影響列數: " . $db->num_rows($stid);
}
?>
host/service_name 或 //host:port/service_name,支援 EZConnect 語法AL32UTF8 避免中文亂碼oci_bind_by_name() 防止 SQL 注入oci_error() 可接受 connection、statement 或無參數,回傳陣列含 code、message、offset、sqltextoci_pconnect()此封裝類提供了基本的 CRUD 操作介面,實際專案可延伸加入交易控制、預處理語句快取、查詢日誌等進階功能。