摘要: 本文主要介紹了PHP連接Oracle數據庫過程中的常見問題,以及PHP、Oracle的配置環境,PHP操作Oracle數據庫的具體過程。
關鍵詞: PHPOracle數據庫操作技巧
一、配置環境
訪問Oracle 8以上的數據庫時,我們需要用到Oracle 8 Call-Interface(OCI 8)。這個擴展模塊需要Oracle 8的客戶端函數庫,因此要想連接遠程Oracle數據庫,我們還需要安裝Oracle的客戶端軟件。(該客戶端軟件可以到Oracle網站http://www.oracle.com上免費下載。)
我們可以這樣配置環境:首先,確認安裝了Oracle 8i客戶端,然后用Net 8 Assistant(客戶端軟件提供)建立一個服務命名,注意服務名是Oracle數據庫的sid,可查詢initsid文件里的server_names得到。接著,在php.ini中把“;extension=php_oci8.dll”前面的注釋符號“;”去掉,使php能夠加載支持Oracle的模塊,并把“php_oci8.dll”拷貝到windows 2000 server安裝目錄下的system 32子目錄中,如“d:\\winnt\\system32”。最后,完成上述操作后,重新啟動計算機。
二、用PHP操縱Oracle的LOB類型的數據
對PHP程序員來講,使用PHP操縱Oracle的LOB類型的數據時,最令人頭痛的莫過于使用LOB處理圖片了。下面我分別介紹一下使用PHP操作BLOB和CLOB的一些技巧。
1.PHP操作BLOB
先建立一個表用于保存圖片,用戶上傳的圖片文件存放到BLOB中。
CREATE TABLE PICTURES (
ID NUMBER,IMGTYPE,VARCHAR2(60),
DESCRIPTION VARCHAR2(100),
PICTURE BLOB);
如果要實現ID的自動增加,再建一個SEQUENCE:
CREATE SEQUENCE PIC_SEQ;
(1)PHP程序——插入部分:
$conn=OCILogon($username,$password,$sid);
在這里要注意兩點:一是用EMPTY_BLOB()函數。這是Oracle的內部函數,返回一個LOB的定位符。在插入LOB時,我們只能用這個辦法先生成一個空的LOB定位符,然后對這個定位符進行操作。EMPTY_BLOB()函數是針對BLOB類型的,對應于CLOB的是EMPTY_CLOB()。二是RETURNING后面的部分,將picture返回,讓PHP的OCI函數能夠處理。
$stmt=OCIparse($Conn,″INSERI INTO PICTURES Lid description,picture)
VALUES(pic-seq NEXTVAL,‘$description’,‘$Lob-uploodtype’,EMPTY_BLOB())
RETURNING picture INTO:PICTURE”);//生成一個本地LOB對象的描述符。
$lob=OCINewDescriptor($conn,OCI_D_LOB);
將生成的LOB對象綁定到前面SQL語句返回的定位符上。
OCIBindByName($stmt,′:PICTURE′,$lob,-1,OCI_B_BLOB);
OCIExecute($stmt);
LOB對象中存入數據。因為這里的源數據是一個文件,所以直接用LOB對象的Sawefile()方法。
(2)PHP程序——顯示部分(getpicture.php):
$conn=OCILogon($username,$password,$sid);
$stmt=OCIParse($conn,″SELECT imgtype,picture ID=$pictureid″);
if(OCIFetchInto($stmt,$result))
Header(″Content-type:″.$result);
echo $result->load();
}
可用strlen($result->load())查看圖片的大小以確定圖片是否正確存入到數據庫。
?>
2.PHP操作CLOB
Oracle有一種數據類型叫VARCHAR2,用來表示不定長的字符串。VARCHAR2也是Oracle公司推薦使用的類型。但我們使用VARCHAR2時存在一個問題:最大只能表示4000個字符,也就相當于2000個漢字。如果程序中某個字符串的長度要大于2000個漢字,用VARCHAR2就不能滿足要求了。這時候,我們可以嘗試使用CLOB,CLOB和BLOB可以表示的最大長度為4GB。
下面是示例(參考了PHP英文版的手冊):
要保存的文字
$clobtext=″different dr2″;
db connection
$conn=OCIlogon(″user″,″pw″,″TNS″);
這里原例子使用了一個存儲過程,我們也可以用上面操作BLOB的方法來實現。
如:$stmt=OCIParse($conn,″INSERT INTO table(id,clobtext) VALUES (text.NEXTVAL,,EMPTY_CLOB()) RETURNING clobtext INTO:clob″);
$sql=″begin tempclobtest_package.saveclob(:clob);end;″;
$clob=OCINewDescriptor($conn,OCI_D_LOB);
$stmt=OCIParse($conn,$sql);
OCIBindByName($stmt,′:clob′,$clob,-1,OCI_B_CLOB);
if(!OCIExecute($stmt,OCI_DEFAULT)){print_r(OCIError($stmt));}
else{echo″提交成功″;}
if($clob->save($clobtext))
{″OCICommit($conn);
echo″提交成功″;″}
else
{″print_r(OCIError($stmt));″}
釋放資源
$clob→ free();
OCIFree Statement($Stmt);
?>
以上是PHP連接Oracle數據庫操作過程中,我們經常會遇到的兩個比較復雜的問題,在這里我作了詳細的介紹,希望經過上述操作技巧的講解,能為大家解開一些困惑。
參考文獻:
[1]Luke Welling.PHP和MySql Web開發.北京:機械工業出版社,2009.
[2]陳營輝.PHP+Ajax完全自學手冊.北京:機械工業出版社,2008.
[3]李卓玲.Oracle大型數據庫及應用.吉林:高等教育出版社,2004.
[4]曹俊.PHP完全自學手冊.北京:清華大學出版社,2008.