PHP 不僅擅長 MySQL,通過 OCI8 擴展也能高效連接 Oracle。本文涵蓋擴展安裝、多種連接字符串寫法、完整查詢示例與常見問題排查,助你快速落地 PHP-Oracle 開發。
php.ini,取消註釋:extension=php_oci8.dll(Windows)或 extension=oci8.so(Linux)。php_oci8.dll 複製到系統路徑(如 C:\Windows\System32)或設置 PATH 包含 PHP 目錄。ORACLE_HOME、LD_LIBRARY_PATH / PATH。$conn = oci_connect(
'username', 'password',
"(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.100)(PORT=1521))
(CONNECT_DATA=(SID=test)))"
);
$conn = oci_connect('username', 'password', '192.168.1.100/test');
// 格式:host/service_name 或 host:port/service_name
$conn = oci_connect('username', 'password', 'ORCL_ALIAS');
<?php
$conn = oci_connect('hr', 'hr', 'orcl');
if (!$conn) {
$e = oci_error();
die(htmlentities($e['message']));
}
$query = 'SELECT * FROM DEPARTMENTS';
$stid = oci_parse($conn, $query);
if (!$stid) {
$e = oci_error($conn);
die(htmlentities($e['message']));
}
$r = oci_execute($stid, OCI_DEFAULT); // 不自動提交
if (!$r) {
$e = oci_error($stid);
die(htmlentities($e['message']));
}
// 輸出 HTML 表格
print '<table border="1">';
while ($row = oci_fetch_array($stid, OCI_RETURN_NULLS)) {
print '<tr>';
foreach ($row as $item) {
print '<td>' . ($item !== null ? htmlentities($item) : ' ') . '</td>';
}
print '</tr>';
}
print '</table>';
oci_free_statement($stid);
oci_close($conn);
?>
| 函數 | 用途 |
|---|---|
oci_connect | 建立持久連接(同一進程復用) |
oci_pconnect | 強制持久連接,跨請求復用 |
oci_parse | 預編譯 SQL,防注入、提升性能 |
oci_execute | 執行語句,模式:OCI_DEFAULT(手動提交) / OCI_COMMIT_ON_SUCCESS |
oci_fetch_array | 取行,模式:OCI_ASSOC/OCI_NUM/OCI_BOTH+OCI_RETURN_NULLS |
oci_bind_by_name | 綁定變量,實現參數化查詢 |
oci_commit / oci_rollback | 事務控制 |
oci_close | 關閉非持久連接 |
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8 或升級客戶端。NLS_LANG=SIMPLIFIED CHINESE_CHINA.AL32UTF8(Linux 在啟動腳本中 export,Windows 在註冊表/系統變量)。oci_free_statement,長運行腳本定期 oci_close 重連。OFFSET ... FETCH NEXT 或傳統 ROWNUM 子查詢優化。oci_bind_by_name 實現參數化查詢,防 SQL 注入並利用執行計劃緩存。PHP 連接 Oracle 核心在於:正確安裝 Instant Client + OCI8、選用 EZConnect 簡化配置、善用預編譯與綁定變量、注意 NLS_LANG 編碼設置。掌握以上要點,即可在 PHP 中穩定高效操作 Oracle 數據庫。