`
namezhou
  • 浏览: 158638 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

PHP连接Oracle

    博客分类:
  • PHP
阅读更多

一、配置环境:
访问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是输出变量,具体解释请参考Oracle的PL/SQL手册

$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。
如要显示n1-n2记录可写为:
(1)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);
?>

 

分享到:
评论

相关推荐

    php连接oracle数据库的方法(测试成功)

    以下是关于PHP连接Oracle数据库的关键知识点。 首先,PHP连接Oracle数据库有两种主要的函数集可供使用:ORA函数和OCI函数。ORA函数是较早的函数集合,而OCI函数是Oracle的Call Interface,它提供了更新、更全面的...

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

    接下来,让我们看一个简单的PHP连接Oracle数据库的示例代码: ```php &lt;?php $connection = oci_connect("username", "password", "localhost/service_name"); if (!$connection) { $e = oci_error(); echo "无法...

    PHP连接oracle工具

    "PHP连接Oracle工具"主要涉及到PHP如何通过特定的扩展与Oracle数据库进行交互。 PHP Version: PHP 5.0.3 或更新版本 这个描述指出,为了能够使用PHP连接Oracle,你的PHP环境至少需要是5.0.3版或更高。自PHP 5开始,...

    PHP连接oracle数据库的类

    php连接oracle数据库 类中包含了一些常用操作数据库操作

    CentOS64位配置PHP连接Oracle

    配置PHP连接Oracle数据库环境涉及到多个步骤和组件,以下知识点将详细介绍在CentOS 64位系统中配置PHP连接Oracle数据库的过程,以及所需的软件包和配置细节。 1. 操作系统准备: CentOS 6.4 x86_64是作为服务器的...

    windows Server2008 64位PHP如何连接Oracle数据库

    ### Windows Server 2008 64位环境下PHP连接Oracle数据库详解 #### 一、概述 在Windows Server 2008 64位环境下使用PHP连接Oracle数据库是一项常见需求,尤其对于需要进行跨平台数据处理的应用而言更是如此。本...

    Linux下PHP连接Oracle数据库

    首先,我们需要安装Oracle Instant Client,这是PHP连接Oracle数据库的基础。你可以从官方网址(http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html)下载适用于你的系统的版本。例如,这里下载...

    oracle远程连接服务器出现 ORA-12170 TNS:连接超时 解决办法

    您可能感兴趣的文章:常用的Oracle doc命令(收藏)Oracle 多行记录合并/连接/聚合字符串的几种方法Oracle中字符串连接的实现方法php连接oracle数据库及查询数据的方法plsql连接oracle数据库报ora 12154错

    php连接oracle数据库的核心步骤

    本文实例讲述了php连接oracle数据库的核心步骤。分享给大家供大家参考,具体如下: 1、修改php.ini文件,打开extension=php_oci8.dll扩展。 2、拷贝php安装目录/ext/php_oci8.dll文件到system32目录下。 3、测试代码...

    Linux下配置PHP5连接Oracle 10.2.0

    Linux下配置PHP5连接Oracle 10.2.0

    oci8源码,编译安装php连接oracle扩展

    oci8是PHP的一个扩展,主要用于连接和操作Oracle数据库。这个扩展是PHP与Oracle数据库交互的重要桥梁,通过它,开发者可以在PHP脚本中执行SQL查询、处理事务和其他数据库操作。本篇将详细介绍oci8源码的编译安装过程...

    windwos下使用php连接oracle数据库的过程分享

    在Windows环境下,使用PHP连接Oracle数据库需要遵循一系列步骤。首先,确保你已经满足了三个基本条件:安装了PHP,安装了Oracle数据库,并且配置了`tnsnames.ora`文件。`tnsnames.ora`文件是Oracle客户端配置文件,...

    php链接oracle需要的dll

    标题提到的“php链接oracle需要的dll”,指的是在Windows环境下,PHP连接Oracle数据库所需的动态链接库(DLL)文件。这些DLL文件是Oracle Instant Client的一部分,允许PHP在没有完整Oracle客户端的情况下与Oracle...

    PHP (PDO)连接oracle数据库

    本文将详细介绍如何使用PHP PDO连接Oracle数据库,以及提供的资源如何帮助解决问题。 首先,让我们理解PHP PDO的基本概念。PDO不仅提高了数据库访问的性能,还提供了预处理语句,增强了安全性,避免了SQL注入攻击。...

    php连接oracle数据库及查询数据的方法

    PHP连接Oracle数据库及查询数据的方法涉及多个知识点,包括PHP与Oracle数据库的连接方式、SQL查询语句的执行以及结果的展示。这些知识点对于想要在PHP中操作Oracle数据库的开发者非常重要。 首先,要让PHP支持与...

    php 连oracle 的小例子

    首先,要实现PHP连接Oracle,我们需要确保已安装了Oracle Instant Client,这是一个允许PHP与Oracle数据库通信的库。它包含了必要的动态链接库和头文件。在Linux系统上,可以通过下载并安装适合系统的版本来完成;在...

    phpstudy链接oracle需要的dll

    首先,PHP连接Oracle通常依赖于一个名为`oci8`的扩展,它提供了与Oracle数据库通信的功能。在Windows环境下,这个扩展可能需要一些特定的动态链接库(DLL)文件来支持。在你提供的文件列表中,“php链接orcl需要的...

Global site tag (gtag.js) - Google Analytics