先談比較容易處理的 PHP 語法
在 Oracle 資料庫系統中,連線方式有兩種區別:Service Name 與 SID,不要弄錯了。手上的開發環境以 Service Name 為例。
- 語法範例 (Oracle 11g 資料庫):
$db_id = "ORACLE-USER"; $db_pwd = "ORACLE-PASSWORD"; $oracle_db = "(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST=10.1.1.1)(PORT=1521) ) ) (CONNECT_DATA = (SERVICE_NAME=LODA) ) )"; /* Go, Using UTF-8 Encoding */ $conn = oci_connect($db_id, $db_pwd, $oracle_db, 'utf8'); $sql = "SELECT X,Y,Z FROM TABLE"; if( !$conn ) { print_r (oci_error()); /* ErrCode */ } else { try { $stid=oci_parse($conn, $sql); oci_execute($stid); /* Do Query */ while( $row = oci_fetch_array($stid, OCI_BOTH) ) { $X = $row['X']; /* Fetch result, encoding to BIG5 */ $Y_big5 = mb_convert_encoding ($row['Y'],"big5","utf-8"); } } catch (Exception $err) { echo $err->getMessage(); } } /* Connection release */ if($stid){ oci_free_statement($stid); } if($conn){ oci_close($conn); }
再來是卡關好幾次的環境設定
因為在 Windows 環境下使用了 Uniform Server 作為開發平臺,原以為只要在控制面板內啟用 php_oci8.dll 與 php_pdo_oci.dll 兩項延伸模組就大公告成,沒想到整臺炸掉了!關於連線 Oracle 資料庫所需的函式套件:
- 取得 Oracle Instant Client Package (例:instantclient-basic-nt-11.2.0.3.0.zip)
- 解壓縮後將:oci.dll、ociw32.dll、orannzsbb11.dll、oraociei11.dll 丟到 C:\Windows\System32 目錄下
- 啟用 php_oci8_11g.dll 與 php_pdo_oci.dll 兩項延伸模組
- 重新啟動 Apache 應該沒問題了
最後是 PHP-CLI 環境參數
透過瀏覽器檢索,資料可從 Oracle 中讀出並在網頁中顯示。但此次開發最終要丟進排程執行,所以直覺把 PHP script 餵給 PHP-CLI(即php.exe) 處理應該就行了...。沒想到 PHP-CLI 使用另組環境參數運作(炸),暗雷何其多。舉凡任何 oci_* 語法均是未定義:
Fatal error: Call to undefined function oci_connect()查詢 PHP-CLI 使用的環境參數並進行修正(此例為 php-cli.ini):
C:\UniServerZ\core\php54>php --ini Configuration File (php.ini) Path: C:\Windows Loaded Configuration File: C:\UniServerZ\core\php54\php-cli.ini Scan for additional .ini files in: (none) Additional .ini files parsed: (none)這邊很明顯,只要在設定內把 extension 補上去就沒問題了。
沒有留言:
張貼留言