快捷搜索:

Php操作oracle数据库指南-本人原创,经验总结,不

本人因为事情关系应用Oracle数据库,发明这里用的人不多,但时常发明有人提的关于PHP操作ORACLE数据库的问题得不到回答,我也曾问过几个,但也无人相应,是以抉择把本人在事情中积攒起来的一些技术、履历奉献出来,盼望对应用oracle数据库的人有所赞助。

一、设置设置设备摆设摆设情况:

造访Oracle8以上的数据库必要用到Oracle8 Call-Interface(OCI8)。这个扩展模块必要Oracle8 的客户端函数库,是以必要你要连接远程Oracle数据库的话,还要装上Oracle的客户端软件-可以到Oracle网站上免费下载- http://www.oracle.com,这是许多初学者经常轻忽的,是以假如看了这篇文章,就不要在论坛上再提“为什么我连接不上Oracle数据库”之类的问题了。

(1)首先确认安装了Oracle8i客户端,然后用net8 assistant(客户端软件供给)建立一个办事命名,留意服

务名是oracle数据库的sid,可查询initsid文件里的server_names获得。

(2)在php.ini中把 ;extension=php_oci8.dll 前面的注释符号“;”去掉落,使php能够加载支持oracle的模块

。并把php_oci8.dll拷贝到你的windows2000 server安装目录下的system32子目录。如d:\winnt\system32,重

新启动你的机械。

(3)写个测试文件试一下是否能精确连接(要是办事名sid是test):

这里scott用户是Oracle自带的无须你自己建立了,只要把下面这个文件放到你的WEB根目录就可以了。假如显

示到数据库中的数据,则阐明连接正常,假如不可,你还要反省前几步有哪些地方做错了。

test.php

ERROR - Could not parse SQL statement.";

exit;

}

OCIExecute($stmt);

while( OCIFetchInto($stmt, &$result_array) )

{

echo

"EMPno=$result_array[0];Ename=$result_array[1];JOB=$result_array[2];MGR=$result_array[3]

";

}

?>

二、用PHP履行Oracle存储历程

(1)用sqlplus连接后,建立一个存储历程:

CREATE OR REPLACE PROCEDURE inoutdemo (

par_in IN VARCHAR2,

par_in_out IN OUT VARCHAR2,

par_out OUT VARCHAR2)

IS

BEGIN

par_out := par_in;

par_in_out := par_in || ' ' || par_in_out;

END;

(2)PHP文件:

sptest.php

三、Oracle数据库的分页

Oracle虽然不象Mysql有limit可用,十分方便,但也有自己的处置惩罚措施,它特殊的rownum对分页有很紧张的作

用。分页可有很多种措施,此中最常用的是用minus。

如要显示n1-n2记录可写为:

(1)SELECT * FROM tablename WHERE rownum

(3)对付有繁杂查询语句并用order by来排序的,可应用下面措施办理:

SELECT TABLE_NAME,TABLE_TYPE FROM( SELECT ROWNUM ROWSEQ,X.* FROM (SELECT * FROM CAT ORDER BY

TABLE_TYPE) X) WHERE ROWSEQ BETWEEN n1+1 AND n2;

本人最爱好的是第三种,也保举大年夜家应用,异常方便的啊。呵呵。

其它措施就不先容了,很麻烦,应用了Oracle游标之类的东东,不太得当PHP应用。

四、特殊字符的插入处置惩罚

对付一些字符如单引号'在Oracle里是不能用addslashes处置惩罚的,但可以应用Oracle的CHR函数或再加个单引号

如:SQL>insert into table values('it'||chr(39)||'s a test'));

或 SQL>insert into table values('it's a test'));

显示:

it's a test.

五、PHP和Oracle的事务处置惩罚

OCIExecute()函数:int OCIExecute ( int statement [, int mode] )

第二个参数mode共有两个:缺省为OCI_COMMIT_ON_SUCCESS,可省略。OCI_DEFAULT 表示用事务(Transation)

提交,不自动提交。

假如你在法度榜样中假如有两个操作数据库的语句必要同时成功履行,有一个掉败就要rollback的话,可这样写:

$conn=OCILogon($username,$password,$sid);

//first sentence

$Sql = "insert into tablename values()";

$stmt=OCIParse($conn,$Sql);

$result=OCIExecute($stmt, OCI_DEFAULT);

if (!$result) {

OCIRollback($conn);//不成功则回滚

OCIFreeStatement($stmt); //开释资本

OCILogoff($conn);

}

//second sentence

$Sql = " update tablename set..";

$stmt=OCIParse($conn,$Sql);

$result=OCIExecute($stmt, OCI_DEFAULT);

if (!$result) {

OCIRollback($conn);//不成功则回滚

OCIFreeStatement($stmt); //开释资本

OCILogoff($conn);

}

OCICommit($conn);//假如都成功则提交

OCIFreeStatement($stmt); //开释资本

OCILogoff($conn);

六、用PHP操纵Oracle的LOB类型的数据(含图片的存储与显示处置惩罚)

对PHP法度榜样员来讲,Oracle最令人头痛的莫过于应用LOB来处置惩罚图片了。

1。PHP操作BLOB:

先建立一个表用于保存图片。用户上传的图片文件寄放到BLOB中

CREATE TABLE PICTURES (

ID NUMBER,

IMGTYPE, VARCHAR2(60),

DESCRIPTION VARCHAR2(100),

PICTURE BLOB

);

假如要实现ID的自动增添,再建一个SEQUENCE:

CREATE SEQUENCE PIC_SEQ;

PHP法度榜样-插入部分:

(PIC_SEQ.NEXTVAL, '$imgtype','$description', '$lob_upload_type', EMPTY_BLOB()) RETURNING picture

INTO :PICTURE");

//天生一个本地LOB工具的描述符。留意函数的第二个参数:OCI_D_LOB,

//表示天生一个LOB工具。其它可能的还有OCI_D_FILE和OCI_D_ROWID,分

//别对应于BFILE和ROWID工具。

$lob = OCINewDescriptor($conn, OCI_D_LOB);

//将天生的LOB工具绑定到前面SQL语句返回的定位符上。

OCIBindByName($stmt, ':PICTURE', &$lob, -1, OCI_B_BLOB);

OCIExecute($stmt);

//措施一:向LOB工具中存入数据。由于这里的源数据是一个文件,以是直接用LOB工具的savefile()措施。LOB

工具的其它措施还有:save()和load(),分手用来保存和掏出数据。但BFILE类型只有一个措施便是save()

if($lob-〉savefile($lob_upload)){

OCICommit($conn);

echo "上传成功〈br〉";

}else{

echo "上传掉败〈br〉";

}

//措施二:用SAVE的措施保存

//$fp = fopen($lob_upload, "r");

//$File->save(fread($fp, filesize($lob_upload)));

//fclose($fp );

//开释LOB工具

OCIFreeDesc($lob);

OCIFreeStatement($stmt);

OCILogoff($conn);

?>

小技术:在sqlplus里可用select dbms_lob.getlength(picture) from pictures;查看文件是否已存入到数据

库或在PHP法度榜样里用strlen()函数查看。

PHP法度榜样-显示部分(getpicture.php):

load();

}

//可用strlen($result[1]->load()) 查看图片的大年夜小以确定图片是否精确存入到数据库。

?>

在必要显示图片的地方只要:

就能显示图片了

有的网上文章写用返回LOB值而非描述符的措施显示,我没有试成功,大年夜家可以试下

代码如下:

if (OCIFetchInto($stmt, $result, OCI_ASSOC+OCI_RETURN_LOBS))

{

echo "Content-type: " . StripSlashes($result[imgtype]);

echo StripSlashes($result[picture]);

}

2。PHP操作CLOB:

Oracle有一种数据类型叫VARCHAR2,用来表示不定长的字符串。VARCHAR2也是Oracle公司保举应用的类型。但

应用VARCHAR2有个问题:最大年夜只能表示4000个字符,也就相称于2000个汉字。假如你的法度榜样中某个字符串的长

度要大年夜于2000个汉字,用VARCHAR2就不能满意要求了。这时刻,你可以考试测验应用CLOB。CLOB和BLOB的最大年夜长度

是4GB。

下面是示例(参考了PHP英文版的手册):

save($clobtext))

{

OCICommit($conn);

echo "提交成功";

}

else

{

print_r(OCIError($stmt));

}

//开释资本

$clob->free();

OCIFreeStatement($stmt);

?>

您可能还会对下面的文章感兴趣: