2008年1月16日 星期三

用PHP串oracle資料庫

如何用PHP來串oracle資料庫呢?
這是我自從接了公司oracle DBA之後,
就成了我一直想要完成的工作課題之一。

基本上要抓oracle資料,除了在oracle主機直接用sqlplus進入,
還有就是用oracle的OEM WEB介面進入,
或是在windows 主機安裝oracle client軟體。

不然好像都要花錢買Third Party開發的軟體來用了!
由於我自已對自由軟體的喜好,也對PHP開發網頁資料庫有興趣,
因此,我決定用以PHP程式串ORACLE資料庫,來達成抓資料的目的。

安裝ORACLE 10G R2的功課,我算是已經PASS了。
接下來,就是設定讓PHP能串ORACLE!

先簡單介紹一下我的實作環境。
我用Fedora 8來做我的OS,
然後安裝了一個要測試用的ORACLE 10G R2資料庫,
在網頁和PHP的安裝部份,我選擇了用XAMPP這套整合了Apache+MySQL+PHP+ProFTP的軟體。
安裝XAMPP省去了不少設定一台LAMP主機的作業流程,可說是相當方便而且安全性也算不錯的選擇。

本來我在安裝好XAMPP之後,看到它似乎內建支援了串接oracle資料庫的函式庫。
以為按照以下連結網頁的說明做之後,就能串接oracle資料庫。
http://www.apachefriends.org/en/faq-xampp-linux.html#oci8

結果沒想到我找了份PHP測試原始碼 oci8test.php (內容如下)來試串接的結果,
發現在執行時,顯示出LD_LIBRARY_PATH的錯誤訊息。

"please check that LD_LIBRARY_PATH includes the directory with Oracle Instant Client libraries "

oci8test.php


串本地端資料庫主機的範例程式
+===================================+
<?php
$db_conn = ocilogon( "system", "npmisora" );
$cmdstr = "select ename, sal from scott.emp";
$parsed = ociparse($db_conn, $cmdstr);
ociexecute($parsed);
$nrows = ocifetchstatement($parsed, $results);
echo "<html><head><title>Oracle PHP Test</title></head><body>";
echo "<center><h2>Oracle PHP Test</h2><br>";
echo "<table border=1 cellspacing='0' width='50%'>\n";
echo "<tr>\n";
echo "<td><b>Name</b></td>\n<td><b>Salary</b></td>\n</tr>\n";

for ($i = 0; $i < $nrows; $i++ ){
echo "<tr>\n";
echo "<td>" . $results["ENAME"][$i] . "</td>";
echo "<td>$ " . number_format($results["SAL"][$i], 2). "</td>";
echo "</tr>\n";
}

echo "<tr><td colspan='2'> Number of Rows: $nrows</td></tr></table>";
echo "<br>If you see data, ";
echo " then it works!<br></center></body></html>\n";
?>

+===================================+

找了不少資料,我想是因為我雖然用XAMPP省去了一般在安裝apache和PHP時,
要加入定義使用oci8相關函式庫的過程,
但還是少了把oracle install client libraries定義到我主機的 LD_LIBRARY_PATH !

要怎麼解決呢?
首先要去OTN下載 oracle instant client的套件,
我用的是 oracle-instantclient-basic-10.2.0.3-1.i386.rpm ,
還有一個是 oracle-instantclient-devel-10.2.0.3-1.i386.rpm !

我的Fedora 8安裝好以上那兩個套件之後,
會在 /usr/lib/oracle/10.2.0.3/client/lib 產生oracle instant client 的相關函式元件。
接著,就是把 /usr/lib/oracle/10.2.0.3/client/lib 加進 LD_LIBRARY_PATH 。
因為我們通常是用root身份來啓動XAMPP的,所以我在root的.bash_profile加了兩行:
+===================================+

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/oracle/10.2.0.3/client/lib;
export LD_LIBRARY_PATH;

+===================================+
加好設定值之後,再重新啓動XAMPP!

回去再跑一次測試頁,哈哈哈!成功了。
不過這可是用了XAMPP的案例,有點偷吃步的感覺。
應該也用架LAMP的方式來試著串oracle資料庫,這樣的安裝流程才會比較透徹些。



修改一下程式,就能串遠端資料庫主機
+===================================+
<?php
$oraUser="system";
$oraPass="systempassword";
$oraDB="(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.254)(PORT=1521)))(CONNECT_DATA=(SID=ORALAB)))";
$db_conn = ocilogon($oraUser,$oraPass,$oraDB) or die( "ORACLE server is not ready.");
$sqlstr = "select * from scott.emp;";
$parsed = ociparse($db_conn, $sqlstr);
ociexecute($parsed);
$nrows = ocifetchstatement($parsed, $results);
echo " Number of Rows: $nrows \n";
echo " If you see data, then it works!";
?>

+===================================+

沒有留言:

搜尋此網誌

本站大事記

這個部落格(網站)內容以分享LINUX和延伸出的技術文章為主!
特別是為了工作和進修需要,搜集了不少網站連結。
希望對來這裡觀文的朋友們,有提供一些有用的資訊或文章。
但這裡的文章中,也包含個人的心情扎記和隨興言談……
若是當中沒有對上你的口味,請多包涵!

原「琳娜絲與希斯寇的邂逅」,改名為「愛上琳娜絲」!

原「琳娜絲與希斯寇的邂逅」,改名為「愛上琳娜絲」!
--原序文--
就是當LINUX遇上CISCO啦!他們的結合還能作什麼事…不就是讓這個世界的網路,串…串起來啊…不然你們那能上這網站看部落格!