PHP连接Oracle数据库的操作技巧

时间:2022-09-07 11:17:08

PHP连接Oracle数据库的操作技巧

摘要: 本文主要介绍了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.

上一篇:Linux系统下配置PHP服务器的技巧 下一篇:解读儿童心理特点,优化体育课堂教学