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