时间:2022-09-07 11:17:08
摘要: 本文主要介绍了PHP连接Oracle数据库过程中的常见问题,以及PHP、Oracle的配置环境,PHP操作Oracle数据库的具体过程。
关键词: PHPOracle数据库操作技巧
一、配置环境
访问Oracle 8以上的数据库时,我们需要用到Oracle 8 Call-Interface(OCI 8)。这个扩展模块需要Oracle 8的客户端函数库,因此要想连接远程Oracle数据库,我们还需要安装Oracle的客户端软件。(该客户端软件可以到Oracle网站www.省略上免费下载。)
我们可以这样配置环境:首先,确认安装了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.