`

[转载]PHP操作oracle数据库指南

    博客分类:
  • PHP
阅读更多

From:http://www.pcppc.cn/biancheng/php/biancheng_139507.html

本人由于工作关系使用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 
<? 
$dbconn=OCILogon("scott","tiger","test"); 
$sql ="select * from emp"; 
$stmt = OCIParse($dbconn, $sql); 
if(!$stmt) { 
echo "<h1>ERROR - Could not parse SQL statement.</h1>"; 
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]<BR>"; 
} 
?> 


二、用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
<? 
//:in是输入变量;:inout是输入输出变量;:out是输出变量 
$conn=OCILogon("scott","tiger","test"); 
$stmt = OCIParse($conn,"BEGIN inoutdemo(:in,:inout,:out); END;"); 
OCIBindByName($stmt,":in",$in,32); 
OCIBindByName($stmt,":inout",$inout,32); 
OCIBindByName($stmt,":out",$out,32); 

$in = "Hello "; 
$inout = "World!"; 

OCIExecute($stmt); 
echo "<BR><BR>"; 
echo "in=".$in."<BR>"; 
echo "inout=".$inout."<BR>"; 
echo "out=".$out."<BR>"; 
?> 

三、Oracle数据库的分页
Oracle虽然不象Mysql有limit可用,十分方便,但也有自己的处理方法,它特殊的rownum对分页有很重要的作用。分页可有很多种方法,其中最常用的是用minus。
(1)如要显示n1-n2记录可写为:
SELECT * FROM tablename WHERE rownum <= n2 minus SELECT * FROM tablename WHERE rownum < n1 

注意:该语句不能使用order by,否则报错。
(2)把指针下移的办法如:
其中:$page是当前页;$pagesize是每页显示的记录数
for($i=0;$i<($page-1)*$pagesize;$i++) 
{ 
@ocifetch($stmt); 
} 

然后再用ocifetch($stmt)取出的数据就是你要显示的记录了
(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程序-插入部分:
 
<? 
$conn=OCILogon($username,$password,$sid); 
//在这里要注意的两点:一是用EMPTY_BLOB()函数。这是Oracle的内部函 
//数,返回一个LOB的定位符。在插入LOB时,只能用这个办法先生成一个 
//空的LOB定位符,然后对这个定位符进行操作。EMPTY_BLOB()函数是针 
//对BLOB类型的,对应于CLOB的是EMPTY_CLOB()。二是RETURNING后面的 
//部分,把picture返回,让PHP的OCI函数能够处理。 
$stmt = OCIParse($conn,"INSERT INTO PICTURES (id, imgtype,description, picture) VALUES (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):
<? 
$conn = OCILogon($username, $password, $sid); 
$stmt = OCIParse($conn,"SELECT imgtype,picture FROM PICTURES WHERE ID=$pictureid"); 
if (OCIFetchInto($stmt, $result)) 
{ 
Header("Content-type: ".$result[0]); 
echo $result[1]->load(); 
} 
//可用strlen($result[1]->load()) 查看图片的大小以确定图片是否正确存入到数据库。 

?> 

在需要显示图片的地方只要:
<IMG SRC="getpicture.php?pictureid=99" ALT="放在Oracle LOB中的图片"> 

就能显示图片了
有的网上文章写用返回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英文版的手册):
<? 
//要保存的文字 
$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(); 
OCIFreeStatement($stmt); 
?>
分享到:
评论

相关推荐

    Oracle数据库WEB开发指南

    本指南将深入探讨如何将Oracle数据库与Web应用程序集成,实现数据的交互和管理。 一、Oracle数据库基础 Oracle数据库是世界上最大的数据库管理系统之一,由甲骨文公司开发。其特性包括高可用性、可扩展性和安全性。...

    php连接Oracle的配置详解及测试代码

    当需要在PHP应用程序中访问Oracle数据库时,就需要进行相应的配置。下面将详细解释如何在PHP中配置Oracle连接,并提供相关的测试代码。 首先,我们需要安装PHP的Oracle扩展,通常被称为oci8。这个扩展允许PHP与...

    thinkphp5.1+oracle安装包.zip

    《ThinkPHP5.1与Oracle数据库整合开发指南》 在当今的Web开发领域,ThinkPHP作为一款优秀的PHP框架,以其简洁、高效的特性受到广大开发者喜爱。而Oracle数据库系统以其强大的性能和稳定性,常被用于大型企业级应用...

    Oracle数据库增值软件保障客户体验.pdf

    在配置和维护Oracle数据库增值软件时,遵循最佳实践和官方指南至关重要。例如,对于文中提到的PHP Web服务扩展配置,需在IIS管理控制台中正确设置应用程序扩展,选择合适的可执行文件和扩展名,确保PHP运行环境的...

    linux oracle数据库删除操作指南

    以下是一份详细的Oracle数据库删除操作指南,分为多个步骤来确保彻底移除Oracle环境。 1. **关闭Oracle服务和后台进程** 在开始删除之前,首先需要确保所有Oracle相关的服务器和后台进程已经停止。你可以通过`ps -...

    从NetBeansIDE7.0中连接到Oracle数据库借鉴.pdf

    如果需要使用OCI驱动程序,比如从PHP应用中访问Oracle数据库,可以参考专门的指南进行配置。 接下来,我们将详细描述如何在NetBeans IDE中建立到Oracle数据库的连接: 1. 确保Oracle数据库正在运行。在Windows环境...

    MySQL(网络数据库指南)

    ### MySQL(网络数据库指南) #### 1.1 什么是数据库 **数据库**(Database,简称DB)是指长期存储在计算机内的有组织的、可共享的数据集合。数据库中的数据以一种易于检索的方式组织起来,并且能够被多个用户或应用...

    The Underground PHP and Oracle Manual

    《地下PHP与Oracle手册》是一本专注于介绍如何使用PHP语言操作Oracle数据库的实用指南。本书由Christopher Jones和Alison Holloway共同撰写,并得到了众多贡献者的支持与完善。作为一本深入浅出的教程,它不仅为读者...

    php7.0扩展oci8安装(连接oracle扩展包与详细安装过程)

    在PHP开发中,有时我们需要连接到Oracle数据库,这时就...总之,安装和配置PHP7.0的oci8扩展虽然涉及多个步骤,但只要按照正确的顺序和指南进行,就能成功建立PHP与Oracle数据库之间的桥梁,从而实现高效的数据交互。

    让Web服务器通过PHP4访问远程Oracle 8i数据库.pdf

    首先,为了使PHP能够访问Oracle数据库,需要设置环境变量。在Linux系统(如Red Hat Linux 7.3)的`/etc/profile`文件中添加相应的代码,这可能包括Oracle的客户端路径和字符集设置,例如设置字符集为`zh_CN.GBK`,这...

    PHP-with-oracle-db.zip_oracle

    这个压缩包可能提供如何在PHP应用程序中设置和操作Oracle数据库的指南。 描述 "php with oracle db connection and other arrangements" 提到的是PHP与Oracle数据库的连接以及其他的配置工作。这可能包括安装必要的...

    mysql/sql2000/sql2005/oracle数据库驱动包

    标题中的“mysql/sql2000/sql2005/oracle数据库驱动包”指的是不同数据库系统的驱动程序集合,这些驱动程序允许应用程序与相应的数据库系统进行通信。这些数据库系统分别是MySQL、SQL Server 2000、SQL Server 2005...

    EXCEL数据导入数据库_PHP版

    标题“EXCEL数据导入数据库_PHP版”涉及到的关键技术点是...总结来说,这个项目涵盖了PHP编程、数据库操作、文件处理、用户交互等多个IT领域的知识点,是一个实用且全面的工具,可以帮助用户高效地处理数据迁移工作。

    WampServer64 PHP链接Oracle说明

    在Web开发领域,尤其是在需要处理大量数据的应用场景中,PHP与Oracle数据库的结合使用非常常见。本文将详细介绍如何在WampServer64环境下配置PHP以实现与Oracle数据库的成功连接。此教程适用于那些希望在本地开发...

    PHP3中使用ORACLE函数的使用说明

    在PHP3中与Oracle数据库进行交互是Web开发中的常见任务,尤其对于那些需要处理大量数据或需要高性能数据库操作的应用程序。本指南将详细介绍如何在PHP3中使用Oracle函数,帮助开发者更好地理解和应用这些功能。 ...

    php oracle学习手册

    《PHP Oracle学习手册》是一本详尽介绍PHP与Oracle数据库系统合作与使用的专业书籍。该书由Christopher Jones和Alison Holloway合著,发布于2008年12月,版本为1.5。本书针对不同层次的读者提供了全面深入的学习资料...

    201212-ug-php-oracle

    《地下 PHP 和 Oracle 手册》是一本详细介绍了 PHP 与 Oracle 数据库集成的专业指南。该书不仅涵盖了 PHP 和 Oracle 数据库的基础知识,还深入探讨了一系列高级主题,如全球化、连接池管理、客户端标识符的应用等。...

    php7.1 oci8扩展

    **PHP 7.1 OCI8 扩展详解** ...总的来说,PHP 7.1 OCI8 扩展为开发者提供了一个强大的工具,使他们能够在 PHP 应用程序中无缝地集成和操作 Oracle 数据库。正确安装和配置该扩展,将有助于提升开发效率和应用性能。

    Linux+php+apache+oracle环境搭建之CentOS下安装Oracle数据库

    在搭建Linux+php+apache+oracle环境的过程中,安装Oracle数据库是关键步骤之一,尤其是在CentOS操作系统上。Oracle数据库是一款强大的关系型数据库管理系统,广泛应用于企业级应用。在CentOS 6.5 64位环境下安装...

Global site tag (gtag.js) - Google Analytics